A form finomhangolása.
Érdemes a formot még egy kicsit matyizni. Én az alábbi tulajdonságokat állítottam be:
- A BorderStyle: bsToolWindow (mert nem kell méretezni az ablakot és elég csak az X a kilépéshez)
- Position: poDesktopCenter (hogy mindig középen legyen indításkor)
A form kódolása.
Jó lenne, ha az ESC lenyomásra a config ablak eltűnne úgy, mintha Cancel-t nyomtam volna. Erre írtam egy kis private metódust, ami kap egy billentyűkódot, és ha az az ESC billentyű, mrCancel kóddal tér vissza a Modális formunk.
Fontos, hogy nem Close-t írunk, hanem ModalResult := mrCancel; mert amikor dinamikusan létrehozzuk és hívjuk a formunkat, akkor Modális megjelenítést alkamazunk. Ha pedig Entert nyomunk akkor az ablak Start eseménnyel megy tovább, és elvégezzük az adatok visszaírását a hívó félnek.
Az ESC és ENTER kilépéskezelő:
procedure TFormConfig.KeyEvent(Key: Char);
begin
if Key = #27 then
ModalResult := mrCancel
else if Key = #13 then
Update;
end;
Aztán fogtam az összes kontrol KeyPress eseményét és ráillesztettem ezt a KeyEvent kezelő kódot. Ez azért jó, mert ha fókuszban akárhol állok ( ListBox, RadioButton, stb… ), mindig lesz hatása az ESC és az ENTER nyomásnak.
Pl:
procedure TFormConfig.ListBoxKeyPress(Sender: TObject; var Key: Char);
begin
KeyEvent (Key);
end;
Valamint a Cancel gomb nyomásakor is a ModalResult := mrCancel; kódot hívom.
procedure TFormConfig.ButtonCancelClick(Sender: TObject);
begin
ModalResult := mrCancel;
end;
Kommunikáció a külvilággal.
Gondolkozzunk el mi is kell nekünk! Kell egy adathalmaz (szélesség, magasság, bitmélység, frekvencia,stb.…), amit a felhasználó állít be és azt kell megoldani, hogy ezekkel az adott paraméterekkel dolgozzon tovább a demo. Ez a kommunikációs adathalmaz egy record szerkezet lesz, és pointer formájában adjuk át a ConfigDialog-nak. Ügyesen úgy készítsük fel a config ablakot, hogy alapból legyenek már beinicializálva a form mezői, mert ha a felhasználó nem nyom semmit, csak a Start gombot, akkor már valami default értékkel menjen tovább a program. (úgy tudom ez Breakpointon alapfeltétel, hogy a demo config paraméterei default úgy legyenek beállítitva, hogy ne kelljen velük sokat mókolni).
Tehát legyen ez a record szerkezet:
type
PDialogParam = ^DialogParam;
DialogParam = record
width : Integer;
height : Integer;
hz : Integer;
fs : Boolean;
bits : Integer;
vsync : Boolean;
name : PChar;
end;
Az adatok magukért beszélnek. A name adat tag azért kell, hogy kívülről tudjuk a DialogConfig címkéjét állítani.
Tehát az lesz, hogy a hívó fél miután megkreálja a formot, átad neki egy ilyen recordra mutató pointert. (PDialogParam), és a form ebből inicializálja magát.
Ezt az inicializálást a FormShow eseményben tesszük meg.
A form beallítja a PDialogParam típusú p pointeréből ( amit valaki kívülről már jól beállított ) a RadioButtonokat chehcboxokat, stb…. A form Caption-jébe beíródik a p^.name változó. Majd feltöltjük a ListBoxot azokkal a felbontási értékekkel, amit a gépünk elbír. Ezt az EnumDisplaySettings és ChangeDisplaySettings függvényekkel tudjuk elérni miközben egy DEVMODE típus változót töltünk fell. A DEVMODE (dm) tartalmazza az összes összetartozó szélesség-, magasság-, színmélység-, és frekvencia párosításokat. Ahol a p mutatóban lévő adatok megegyeznek, azt a sort a form kijelöli. Azzal a ciklussal amivel feltöltjük a ListBoxot, létrehozunk egy másik listát is, amiben változóra lebontva tároljuk ezeket az értékeket. (ez azért kell, hogy mikor ENTER-t nyomunk könnyű legyen visszakeresni a kiválasztott értéket.)
( Hirtelen ez jutott eszembe. Szebben nem tudtam megoldani ).
Az Update eljárás végzi a képernyő adatok vissza írását a hívó fél változójába. Majd ha ezzel végzett mrOk-kal tér vissza!.
procedure TFormConfig.Update;
var pm : PDialogParamMain;
begin
if not Assigned(p) then
ModalResult := mrCancel
else
begin
p^.fs := RadioButtonFullScreen.Checked;
p^.vsync := CheckBoxVSync.Checked;
pm := PDialogParamMain(t.Items[ListBox.ItemIndex]);
p^.width := pm^.width;
p^.heigh := pm^.height;
p^.bits := pm^.bits;
p^.hz := pm^.hz;
ModalResult := mrOk;
end;
end;
Fordítás DLL-be
Eddig egy test projektben tudtuk megnézni a formunk kinézetét. Igazán kipróbálni nem tudtuk, mert a (p) pointerünk is jobb esetben ebben a test projektben sehova se mutatott. Meg igazán ez egy test.exe program volt, ami mindig hívogatta ezt a formot. Nekünk egy DLL kell amiben csücsül a formunk és egy egyszerű függvénnyel életre kelhetjük a hívó fél számára.
Mentsünk le mindent és lépjünk ki a Delphiböl! Látjuk hogy a mentéseink csomó ConfigForm fájlból és test fájlokból állnak. Nekünk csak a ConfigForm.* fájlok kellenek, a többit letörölhetjük. Miután végeztünk a test.* fájlokkal indítsuk újra a Delphit, de most egy DLL projektet indítsunk el! File/New/Other…/DLL Wizard. Így kapunk egy üres library forrást. Hirtelen mozdulattal mentsük el ezt a projektet dialog néven! Így a library nevünk átalakult dialog névre.
Ha fordítunk, akkor valami ilyesmit kapunk:
Ne ijedjünk meg, nem hiba, hiszen ez egy DLL, és ebben csak függvények erőforrások, stb… csücsülnek tehát nem egy futatható exe. Tök jók vagyunk. A DLL-ünk 87k tök jó, de sokáig nem örülhetünk. Vegyünk a DLL-be a nemrég fejlesztett ConfigForm unitot úgy, hogy az uses felsorolásba beírjuk a nevét!
uses SysUtils, Classes, ConfigForm;
Így már egy kicsit más a helyzet . A DLL-ünk felduzzat 460k-ra ( UPX-el a felére le lehet nyomni ) Most már a DLL valóban tartalmazza a formunkat, de még nem írtunk rá kezelőfüggvényt.
A kezelőfüggvényük, a GetDialog, paraméterül kap egy DialogParam mutatót és cdecl-el hívódik (ez azt hiszem a C paraméterhívó konvenció, de nem biztos) A kezelő függvény a ConfigForm.pas-ban lévő FormConfig példány megkreálja nil paraméterrel. A nil egy HWND, ami azt mondja, hogy ki a szülőablakja a formnak (Ha igény van meg lehet írni azt, hogy megkapja rendesen. Én nem láttam szükségét.) Miután a TFormConfig konstruktora lefutott, a FormConfig objektumnak átadjuk a p paraméterére a param kűlső változó pointerét. Majd ShowModal-lal modálisan futtatjuk meg a formot, ami azt jelenti, hogy itt a program megáll
Majd amikor a form eltünik, ( START/CANCEL) a megadott értékkel visszatér.
Az exports azt jelenti, hogy ez a DLL-ben lévő függvényt ki is adjuk a nagy világnak, hadd lássák, hadd használják.
A ConfigDialog hívása C++ ból.
Készítünk egy C++ programot, ami dinamikusan csatolja a dialog.dll-t! Ezt a LoadLibrary, FreeLibrary, és GetProcAddress utasítás halmazzal és egy DLL handle változóval meg tudjuk tenni (HMODULE). Szükségünk van még egy olyan típusváltozóra, ami függvényt definiál, valamit elő kell állítanunk a Delphis/ObjectPascal-os DialogParam C/C++ os megfelelőjét, ami ebben az esetben egy struct szerkezet lesz. Fontos! A jó pontos C/C++ adatmodell megvalósításához ugyanolyan típusméretű változókat ugyanabban a sorrendben kell definiálni, mint ObjectPascalban (szépen meg kell keresni, hogy mely C/C++ alaptípusok egyeznek meg az ObjectPascla-os megfelelőjével). Íme a C/C++ szerkezet:
typedef struct DialogParam
{
int width;
int height;
int hz;
bool fs;
int bits;
bool vsync;
char *name;
DialogParam(void)
{
width = 640;
height = 480;
hz = 60;
fs = false;
bits = 32;
vsync = false;
name = “Dialog 2008”;
}
} DialogParam;
A C++ adta lehetőségekkel élve itt pl. kihasználtam, hogy a struct-ot is elláthatjuk construktorokkal. (Talán megérne egy fórum témát vagy egy cikket, hogy ilyen estben byte szinten megegyezik-e a két programnyelvben megvalósított adatszerkezet, vagy csak szerencsém van, hogy a konstrukor a struct végén van, és nem szól bele, amikor a Delphi átveszi a pointerét.)
Innentől kezdve az adott kód megmutatja hogyan kell használni a dinamikus linkelést és hogyan kell lekezelni a GetDialog ( itt DialogDLLGetDialog ) visszatérési értékét attól függően, hogy Start-ot vagy Cancel-t nyomtunk.
Ha minden jól ment, és lefordult minden (csak reménykedni tudok), akkor valami ilyesmit kaphatunk:
Ha mégsem fordult le, akkor itt megtalálhatjátok a forrását mindennek.
Update: Ha Delphi helyett inkább a C verzió érdekelne, akkor itt találod Gargaj megoldását a problémára.
köszi a cikket!
és remélem, hogy sok szép config ablakot látunk ezután :)
reméljük sok újonc csapat demoiban lesznek szép jpg texturák \o/
…és reméljük, hogy sok cikkhez lesz még szép pohár-hozzászólás :D
Gyerekek, gyerekek, reality check! Nem akadékoskodni akarok, de kirakni a konfig ablakot dll-be, és egy depfit felrakni csak ezért, az kicsit… enterprise, nem?
Ünnepélyesen felkérem Gargajt, hogy mutassa meg, hogyan kell ezt 10-20 sorban megírni c++ alatt MFC-vel. :)
CConfigDlg dlg;
dlg.DoModal();
:)
MFC-vel.
tavozz tolem, satan! :)
Naja, az adott bonyolultsághoz MFC-re se igazán van szükség. Ha meg nagyobb a bonyolultság, akkor az MFC azért kerülendő. ;)
3dsMax plugin iráskor én meg a ResEdit+VC++ kombóval bohóckodtam, egy pofás kis dialogért….
Ezer köszönet! :)
kek-feher-sarga editor szinsema FTW!!!!!!
old school-os nekem tetcik :)
Öööö, minden kontrollra rákötni a key eventet, az enyhén szólva nem elegáns. Helyette van olyan esemény, hogy Form.OnKeyPress (vagy akár egy fincsi OnKeyDown), elég oda beírni, mert amíg a formon matatsz, az megkap minden key eventet.
Egyébként egy Windwos-os ablaknál előbb kattintok az egérrel, de még az ALT+F4 is gyakoribb, mint, hogy ESC-et nyomjak. :)
Ezzel együtt a cikk, meg az ötlet jó. Én a könnyebbség kedvéért az egész demót Delphi-ben írom. :) Persze Enterprise-ban, Jimmi kedvéért ;)))
Megjegyzem még, hogy a form unit használata gusztustalanul megnöveli a lefordított exe méretét. Így lesz a 100k-s demóból 500k. Gondolom ez DLL esetén sem szebb.
Blala: mikor jön ki a demod linux portja? :D
erdeklodoknek ugyanez Visual C++ ala:
http://umlaut.intro.hu/~gargaj/temp/fwzSetup.zip
(ki akartam mar adni egy jo ideje, csak… szal gondoltam raer :)
pohar, megis mirol beszelsz? es mi ez a furcsa x-re vegzodo szo??
Bery: Nekem nem sikerült csak a FormKeyPress eseményről elkapni az összes control ESC eseményét. Légyszi nézd már meg, ha van időd.
Jimmi, Gargaj: A cikknek csak az egyik vonzata hogy dialógot készítünk szerintem az érdekessége az, hogy hogyan lehet össze hozni a dll, delphi, C++ kapcsolat fogalmát.
azért eléggé büntet hogy az egyszerű delphis megoldáshoz is egy 5 oldalas cikket kell írni :P :)
nem értek hozzá, de ez nem jobb? ingyenes is, és platformfüggetlen: http://www.lazarus.freepascal.org/modules.php?op=modload&name=StaticPage&file=index&sURL=about
azért eléggé büntet hogy az egyszerű delphis megoldáshoz is egy 5 oldalas cikket kell írni :P :)
hejj, ez a modern technologia, welcome in the 21th century :(
Oswald: a modern technológia arról szól, hogy 2csillió sor konfigfájlból és három sor kódból megvan az, amihez réten 1 sor kódot kellett írni.
De legalább lassabb a végeredmény… :)
zanzasitva, regen azert volt sokkal jobb mert egyreszt minden sokkal konnyebb volt, masreszt minden sokkal nehezebb volt? :)
gargaj megragadta a lenyeget :D
Igy irjon nektek aha legkozelebb cikket.
pontscho megragadta a lényeget
Én értékelem hogy valaki ir cikket de tényleg, de a Borlandos dolgok… Na mindegy, majd a Jimmi megmutatja nektek hogy kell ezt C#ban ;)
Nem baj a kritika, abbol tanulunk, csak konkret es epito jellegu legyen. olyat mondani, hogy ez szar, nem er, hacsak nincs odairva, hogy mikent lenne jobb. Und es meg csodasabb lenne, ha koder venaju emberek kovetve Aha es Blala peldajat nyomnanak valami cikkeket, es akkor lehetne nagyokat vitazni egymas hulyesegen.
Amigan ennyi az enginem konfig GUI-ja, PowerD-ben:
IFN (VideoDrv:=EasyRequestArgs(0,[20,0,ver_ScreenTitle,'Please choose a videodriver!','CGFX|P96|P96-PIP|AGA|Quit'],0,0)) THEN Raise(ER_NONE)
Eredmeny:
Tovabba, van felbontas valaszto ablax is, abban az esetben, ha P96-ot valasztasz. Ez ennyire bonyolultan abszolvalhato:
DisplayID:=p96RequestModeIDTags(
P96MA_MinWidth, 320,
P96MA_MinHeight, 240,
P96MA_MinDepth, 8,
P96MA_WindowTitle, 'Gimme screenmode!',
P96MA_FormatsAllowed, RGBFF_CLUT,
TAG_DONE)
Eredmeny:
Ez mindketto beepitett OS fuggveny, nem pedig a PowerD-hez tartozo support-baszas. Na, most lehet probalkozni MFC-vel, C#-pal meg effele szanalmas potcselekvesekkel. Sok sikert. Ajanlom magam. (Es a Smith&Wesson-t.)
Nab#?zmeg… Image disabled… NNNA AKKOR!!…
Elso, Masodik.
na kb így kéne kinéznie a dolognak 2008ban. :) basszus ha az amigák győztek volna anno :) \o/
igen komoly HW követelmények is szükségesek hozzá :))
# equirements:
* an Amiga :)
* some memory, 4 megs should be enough for small projects, 16 megs recommended
* hard drive with about 5-6 megs of free space
* fpu isn’t requied be the compiler itself, but generated proggies requires fpu, if floats are used
* mc68ec020 or faster, 68040 strongly recommended
* os3.0 or newer
p96RequestModeIDTags? az elobb meg mintha valaki reklamalt volna a D3DXCreateTextureFromFile miatt hogy az tehetsegpotlas :)
Ketezernyoc? Mirol beszelsz? Mondom hogy ez sima OS kod, mindossze OS 2.0 kell neki (kb. 1990) nem pedig PowerD-s cucc… :) Es C-ben is kb. ugyanigy nez ki, csak a szintaxis mas korulotte… :)
Gargaj: Ha ez tul ecceru, meghivhatod asmbol is, hogy bonyibb legyen. :P
az elobb meg mintha valaki reklamalt volna a D3DXCreateTextureFromFile miatt hogy az tehetsegpotlas :)
de az en voltam, ez meg a Csarli. Es nem az elnevezese miatt reklamaltam. Sot, igazabol nem is reklamaltam :)
en csak azt talalom mokasnak hogy mindenkinel mennyire mashol van a “tehetsegpotlas” es a “bloatware” kozotti hatar :)
Itt ket alapvetoen kulonbozo dologrol van azert szo.
1) Nyilvan az a jo ha az egyszeru dolgokat egyszeru megvalositani (azaz ablakot nyitni ne 5 oldal legyen hanem 1 sor). Ezen szerintem senki sem vitatkozik.
2) az ujabb D3DX-nek (amihez en persze annyira nem ertek, hogy ki se lehet fejezni) tenyleg van “nemi” tehetsegpotlas ize, demoscene szemszogbol vizsgalva. 20 masodperc alatt ezt dobta a google:
ID3DXPRTEngine
It is used for precomputed radiance transfer – a technique similar to spherical harmonics lighting that is used for precomputed global illumination and soft ambient lighting.
PRT engine mar a regi D3DXben is volt, de ugyse fenekig tejfel vele az elet mert mocskos lassu es nem trivialis a kezelese. ez persze nem azt jelenti hogy hasznalhatatlan, de nem veletlenul hasznalta eddig eleg keves intro/demo.
szerintem az hogy a P96 apiban meg van irva az ablaknyitas, es a D3DX azonnal tud neked texturat lapatolni, az szerintem ket egyforma komplexitasu feladat.
szerintem az hogy a P96 apiban meg van irva az ablaknyitas
Akkor megegyszer, mert latom nem volt vilagos: ez nem ablaknyitas, csak screenmode ID lekerdezese. Az itt visszakapott ertekkel tudsz majd magadnak megfelelo felbontasu/szinmelysegu un. custom screent nyitni. Egyebkent a screen- es ablaknyitas mindenkeppen csak egyetlen sor Amigan (plusz egy 3 soros loop az ablak event handlingjere), sz’al ez ilyen… Ha tobb sorban kell, ird meg asmban. :P Egyebkent az egesz baromira nem csak arrol szol, hogy a programozo munkajat konnyitse, kvazi “tehetsegpotlaskent”, hanem arrol is szol, hogy az OS egyseges legyen az user szempontjabol, es lehetoleg minel tobb bugot lehetseges implementacios bugot kiszurjunk a trivialis feladatok megoldasa soran.
Meg ilyen alapon mar a MOV EAX, $13; INT 10H; is tehetsegpotlas, merthogy vindozban mennyivel bonyibb ablakot nyitni, ha pedig direktben baszkodod a regisztereket, meg sokkal tobbfele felbontast tudsz csinalni…
Egyebkent most mondanam, hogy inditok cikksorozatot az Amiga(OS) alapszintu kodolasarol, de egyreszt biztos N+1-en felhordulnek majd, hogy na majd pont en irok, a tusko divatamigas, masreszt meg jobb dolgom is van… :)
de ugyse fenekig tejfel vele az elet mert mocskos lassu es nem trivialis a kezelese. ez persze nem azt jelenti hogy hasznalhatatlan, de nem veletlenul hasznalta eddig eleg keves intro/demo.
Csak pelda volt, egyebkent meg majd 3 ev mulva mar fenekig tejfel lesz. Amugy mint juzer abszolut tamogatom az ilyesmit, legyen 1 sor a global illumination, csak hat az oldschool scener egyenisegem reklamal kozben (skizofrenia rulz), mert igy nem kunszt, meg nem is fair azokkal szemben akik mondjuk krosszplatform fejlesztenek. Kulonos tekintettel a 4k-kra, de egyebkent is.
azokkal szemben sem fair, hogy a boltban veszel kaját, akiknek vadászniuk kell
Bemegyek szemben a Plusba, megnezem a felhozatalt, es komolyan elgondolkodom neha, hogy inkabb vadaszni kene…
Akkor megegyszer, mert latom nem volt vilagos
elnezest, fogalmi zavar allt fent.
itt jon elo, hogy a zamiga jatekgep… a windowsnal alapvetoen kutya sem gondolta, hogy te ott majd felbontast allitgatsz valami szoft miatt.
Persze, hogy a dxbol miert maradt ki ez a fajta standard felbontas/szinmelyseg requester, az mar csak a tervezok hulyesege… viszont igy lehet fasza cikkeket irni, meg flamelni alatta :)
itt jon elo, hogy a zamiga jatekgep… a windowsnal alapvetoen kutya sem gondolta, hogy te ott majd felbontast allitgatsz valami szoft miatt.
Elnezest… Az Operacios Rendszer nem arra valo, hogy a rajta futo programok megfeleloen kihasznalhassak a hardvert? :) Egyebkent meg, egy konzolhardveren (mert ugye igy mondjak kevesbe pejorativan azt, hogy “jatekgep”) elvileg nem sokkal kevesebb igeny lenne a felbontasallitgatasra? :) De egyebkent, hogy igazan vicces legyen a dolog, a P96 API olyan Amigas grafikus kartyak vezerlesere valo, amiken altalaban mezei VGA chipek vannak (a screenshoton lathato PicassoIV-n peldaul Cirrus Logic GD5446 :).
Szoval ezekszerint az a trefas dolog all fent, miszerint az AmigaOS jobban tamogatja a peces hardvert, mint a de facto No.1. pece OS, a Vindoz.
De ez egyebkent fullra offtopik itt. A magam reszerol meg mindig szeretettel varom az MFC + C++ ill. C# megvalositasat a fenti problemanak. Akarok rohogni… :P
Charlie: Ezek az Amiga függvények baromi szimpatikusak, tényleg nevetséges, hogy ilyenek win alatt nincsenek. Mindig idegesít, mikor olyan dolokat kell írnom, ami technikailag nem kihívás, már sok ezren megcsinálták előttem, és mégis kénytelen vagyok én is megírni.
blala: A PRTEngine is egy olyan dolog amivel az ember el tud játszadozni egy 4k intróban kis poligonszám mellett, de ennyi. pl. : Pirate by dilemma Komoly produkciókban a várakozás már elviselhetetlen lenne. Ha az ember használni szeretné, akkor szépen beilleszti a konverziós pipeline-ba, és lementi kinyert adatokat. (Ahogy korábban írtam szerintem az egész D3DX kb erre alkalmas, modulonként erősen változó hatékonysággal. Én Runtime csak néhány függvényt használok, pl a Gargaj által említett textúra töltést, vagy a shader fordítást.) Ez így elég hordozható, bárki meg tudja játszani API-tól függetlenül. Ennyi erővel az se fair, hogy valaki egy tetszőleges 3d programban leszámolja a lightmappeket, vagy a normal mappeket, és azt használja demóban, hisz ezt a programozó is megírhatná. (Akár az összes objectet is generálhatná. ;) ) Kicsit visszább menve az időben, mennyire nem volt már fair a Future Crew részéről, hogy ők 3D Studióval készített grafikákat használtak, ellentétben a Tritonnal, akik a saját raytracerükkel dolgoztak!
Az eszközök arra valók, hogy használjuk őket. Ha valaki akar saját cuccot írni valamiből, úgy, hogy van rá jól bevállt megoldás, tegye. Lehet, hogy úgy érzi, hogy ebből tanul, vagy szimplán élvezi, de ne várja el ezt mindenkitől.
Murphy: Igen, koszonom, errol probaltam beszelni, de te fogalmaztad meg a legjobban.
All: egyebkent meg a Delfi-fikazo C# faneknek egy kis ajanlott irodalom. Jo olvasgatast, es valosagujraertelmezest kivanok.
A C++ megvalositas ott van kicsit fentebb egy .zip-ben amugy :)
Es tenyleg. Oszinten, rondabbat vartam, bar azert igy se kutya, hogy resource filetol kezdve a kiskutyafuleig minden van, ahogy kell. :)
Charlie, én örülnék egy amigaos rejtelmei c. cikknek ;)
Tisztaban vagyok vele hogy ‘ugyanaz az ember talalta ki’ pontosan ezert tobb hasonlosagot mutat a delphi a C#hoz mint a Chez. Viszont mivel microsoft a dllek konyebben hangolhatok egymashoz, elvileg ez volt aha cikkjenek lenyege legalabbis az o allitasa szerint. En arra probaltam felhivni a szives figyelmet hogy az ilyen illesztesi dolgok is sokkal konnyebbek C#al. Lehet hogy ez az informacio elkeveredett az elfogultsagom miatt;). Mindenesetre C# ide vagy oda senki nem fog meggyozni rola hogy szeressem a delphit, vagy akar a borland c buildert. :)
C# 3.0 is the current version, and was released on 19 November 2007 as part of .NET Framework 3.5. It includes new features inspired by functional programming languages such as Haskell and ML
“A DLL-ek konnyebben hangolhatok egymashoz.” Bazdmeg, a bokam lefosom. Meeeg Maxie, buntess, konyorgom! :D (Rettenet.)
Ugye ezt nem gondolod komolyan. Ha igen, akkor javaslom ujra olvasni Tannenbaum tanar ur Operacios rendszerek c. konyvet.
Oswald: Hat, a rendszer ismerteteset teljes melysegeben nem vallalhatom, mert nyilvan az tobb konyvet is megtoltene, masreszt meg fingom sincs egy csomo reszerol nekem sem. :) De ilyen “hogyan irjunk egyszeru c2p-s demot Amigara” c. cikksorozaton mar gondolkodtam… Es az meg ontopic is lenne itt.
Charlie: resource file van, persze, de azt GUI generalja, szal igy “insert dialog” es maris jon belole az .rc meg a resource.h, szal az nem problema :)
Hat pont errol van szo. Szerintem az a GUI, amihez ilyen resourcefileos formeditoros borzalom kell, es generalni kell, az mar reg rossz…
Charlie, nem kell hozza, csak adott a lehetoseg. Persze a win32 api nem eppen baratsagos (ami mondjuk reszben azert van mert ezer evre visszanyuloan kompatibilis darabok is vannak benne, mas kerdes persze hogy lehetett volna eleve jobbat tervezni), de ha irsz fole egy wrappert egyszer, akkor tobbet nem kell vele foglalkozni. Amugy meg GUI API-t tervezni nemtrivialis feladat, konkretan senki nem tervezett meg jot; nyilvan az Amigaeba is ezer helyen bele lehetne kotni, hiaba jobb mint a Windoz.
Azt meg nem ertem szegeny Maxie-t miert bantjatok, szerintem tobbe-kevesbe ertelmes dolgot irt. Tannenbaum konyvet en nem olvastam egyszer sem, de nem is ertem mi koze van a dinamikus linkelesnek az operacios rendszerekhez. Azon kivul hogy az utobbi lehetoseget ad az elobbire.
mas kerdes persze hogy lehetett volna eleve jobbat tervezni),Tervezni? A WinAPI-ban a mai napit talalok a kb. 30 eve az MIT-en kifejlesztett X-bol elemeket…
Bantja a kaszaz Maxie-t. De az hogy “konnyebben hangolhatoak” eleg ertelmetlen fogalom ebben a szituban. Tannenbaum meg ott jon a kepben, hogy eddig minden altalam hasznalt OS-en az OS-nek eleg szerves resze az alkalmazasok dinamikus linkeleset vegzo osztaly halmaz, aminek nem csak user space beli vonatkozasai vannak. Ha valaki ezekkel tiszaban van (pl. Windows dll betoltesi szokasaival, ami annyira egyedi – es velemenyem szerint szar -, hogy kb. ot perc volt a legutolso softver auditori munkamnak trojait irni vele) akkor nem mond ilyesmit. Nem veletlen sikitok linuxos es sok osx-es demotol is. Demokodolas az egy dolog, de tul kicsi subset-je az informatikanak.
Szerintem arra gondolhatott, legalabbis en igy ertelmeztem, hogy kulonbozo nyelveken irodott programreszleteket nem nagyon lehet praktikusan egy executable-be linkelni, mert a kulonbozo runtime-ok osszevesznek (c az a kivetel). Na erre egy megoldas dynamic librarykent megkodolni egy kivetelevel az osszeset, az utolsobol meg hivogatni oket. Es ezt csinalja aha is a cikkben, ha jol ertem.
“alkalmazasok dinamikus linkeleset vegzo osztaly halmaz”
osztaly halmaz? lehetne magyarul? :) es mi van a nem objektumorientalt oprendszerekkel?
most nem arra gondolt hogy C#-ben a DLL importhoz nem kell import .lib vagy LoadLibrary(), mer van [DllImport]?
“alkalmazasok dinamikus linkeleset vegzo osztaly halmaz”
Igaz, funkció halmaz kifejezés célszerűbb lett volna.
most nem arra gondolt hogy C#-ben a DLL importhoz nem kell import .lib vagy LoadLibrary(), mer van [DllImport]?
Ez meg speciel szintén Microsoft “találmány”, sehol máshol nincs ilyesmire szükség. De ha erre is gondolt, nem ezt mondta és sajnos nem vagyok gondolat olvasó.
dlopen()/dlsym() a programozo fele ugyanaz, szal ott nagy kulonbseg nincs, a mondatot mashogy meg nem igazan tudtam erteni bar teny hogy a megfogalmazas pongyola^2 volt :)
OFF:
Nem lehetne mondjuk kicsit mellőzni a “tehetségpótlás”, “valóságújraértelmezés” és hasonló szavakat? Engem speciel roppantul zavar, ha valaki ennyire magas lóról beszél egy egyébként technikai jellegű vitában. Próbáljuk már meg elfogadni, hogy a másik ember nem azért használ más eszközöket, mert hülye.
Jimmi: a “tehetsegpotlas” szo elso felbukkanas a diskurzusban a kovetkezo:
az elobb meg mintha valaki reklamalt volna a D3DXCreateTextureFromFile miatt hogy az tehetsegpotlas :)
by Gargaj. En sem ertettem hogy kerult elo, btw.
blala: jó, szerintem így is érted, hogy mire akartam célozni. Nem rád. :)
Engem speciel roppantul zavar, ha valaki ennyire magas lóról beszél egy egyébként technikai jelleg? vitában.
Ha mar torzsalkodunk, engem meg a “majd az XYZ megmutatja hogy kell ezt” jellegu hozzaszolasok zavarnak. Ha nem tudod, kussolj. Ha meg tudod, csinald, ne masra hivatkozz.
Pont arra szerettem volna utalni, hogy ne legyen torzsalkodás. Gargajt pedig azért kértem meg, hogy mutasson c++ megoldást, mert szerintem itt ő az egyik legtapasztaltabb WinAPI kóder. Nem gondoltam, hogy ez zavarni fog bárkit is, de elnézést kérek.
Na jolvan gyerekek, akkor ezt tul is targyaltuk, mindenki vonuljon a sarokba cikket irni :))
ezek után ki mer majd cikket írni? :)
Cikket írni? Én az első demómat nem merem kiadni.
Írjál cikket arról hogy miért nem mered kiadni, az is érdekes lehet :)
mert leugatnak mindent :)
http://www.nikhok.hu/~maxie/dialog.zip
Tokeletes config dialog 1 sorban :)
d3dpp.windowed = MessageBox(GetForegroundWindow(), “fullscreen?”, 0, ID_YESNO) – IDNO;
…a tobbi meg ugyse lenyeges :)
viszont, ha lenne EDIT gomb, akkor sokkal felhasznalobaratabb lenne :)
Sziasztok, kedves hozzászólók.
Álmomban sem gondoltam volna, hogy egyszer, ha valamit írok (legyen ez cikk vagy demó) ennyi hozzászólást kapok. Örülök, hogy ilyen nagy „felpezsdülést” okoztam a cikkemmel. A cikk elérte célját és teljes egészében túlmutat rajta. Hogy miét érte el célját? Hát elsőnek megíródott és publikálódott. Ez a cikk azoknak szól akik szeretnek ilyen témában magyar cikkeket olvasni. Még az sem baj ha a kedves cikk olvasó kezdő és még nem nagyon csinált ilyet mert szinte lépésről lépésre nyomon tudja követni a cikkben lévő lépéseket és talán egy kis magyarázatott is kap az egyes fejezetek megértéséhez. Hogy miért választottam Delphit ki indulási alapként? Személyes tapasztalatom hogy a főiskolán az emberek ( ahova én jártam) elsőnek a Delphi kényelmét ismerik meg, és ebből fejlesztő környezetből indulnak ki. (Mi is Delphiben írtuk az első ASE betöltőnket). Így gondolván egy Delphis embernek a fejében hamar kipattanhat az ötlet, hogy, miért ne a Delphi FORM tervezőjében csinálja meg a demójához a dialógus ablakot. A cikk 2. fele meg azoknak szól akik érdekes kihívást látnak abban hogy egy Delphis és egy C++ kód egyűt tudjon működni és ezt a Config Dialog példáján akartam bemutatni. Persze ez egy fajta hozzá állás az adott problémához. És mint látjuk ( ezért mutat a cikk túl magán) létezik nagyon sok megoldás ennek a problémának a megoldására. Láthatunk példát egy teljes C++-os megoldásra a WinAPI használatával. Látunk példát hogyan működik pl.: egy Amigán ( nekem teljesen új információ volt ez és, nagyon élveztem, hogy ilyen mély Amigás titkokat megtudhattam). És ha jól látom (ehhez sajnos nem nagyon értek) van példa rá .NET-es környezetben való megvalósításra is). Szerény véleményem szerint ezek mind jó, tartalmas, információk és nem szabadna, hogy ezek a „szakmai” különbségek személyes konfliktusokat okozzanak. Én szeretek a magyar scene része lenni. Főleg azért mert itt kifejezhetem magam a kedvenc elfoglaltságom témájában. Legyen az akár egy demó vagy egy cikk. A lényeg abban van hogy ebben a szűk kis közösségben mind egytől-egyig befogadó képesek vagytok arra amit én közölni akarok veletek. Ezért jó hogy sokat hozzászóltok és véleménnyel, kritikával illetitek a munkámat. Már ezért megérte megírni ezt a cikket. ( Egyszer lesz egy demóm amin majd 70 poetes hozzászólás lesz ;). De tényleg. Ne bántsuk mán egymást ha már ilyen jól összejöttünk.
Legyünk barátok :) O_o–b
grat!
abcug: nincs benne cancel
MB_YESNOCANCEL ? :)
(jo rendben, akkor ” if (d3dpp.windowed == IDCANCEL – IDNO) return (-1); “)
pedig milyen mokas is volt a “no gus=no demo” felirat :)
aha: nem biztos, hogy akarsz am 70 thumbdown-t :)))
Tessék Delphiben, Win32/DX alá ennyi az elérhető felbontások kigyűjtése, és egy listába szedése. Sokkal több, mint Amigán, de csak egyszer kell megírni és 20 évig használni ;)
[b]wD3D := Direct3DCreate9 (D3D_SDK_VERSION);
try
AResCombo.Items.Clear;
lstModes := TList.Create;
wCount := wD3D.GetAdapterModeCount(D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8);
for i := 0 to wCount-1 do
begin
wD3D.EnumAdapterModes (D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8, i, wDisplayMode);
if wDisplayMode.Width >= 320 then
begin
New (wModeRec);
wModeRec.Width := wDisplayMode.Width;
wModeRec.Height := wDisplayMode.Height;
wModeRec.Refresh := wDisplayMode.RefreshRate;
lstModes.Add (wModeRec);
AResCombo.Items.Add (IntToStr(wDisplayMode.Width) + 'x'+
IntToStr(wDisplayMode.Height)+ ' '+
IntToStr(wDisplayMode.RefreshRate)+ 'Hz');
end;
if wDisplayMode.Width = 800 then
AResCombo.ItemIndex := AResCombo.Items.Count-1;
end;
finally
wD3D := nil;
end;
[/b]
Tök jó, hogy már előnézet sincs, így esélyem sincs megnézni, milyen lesz a hozzászólás, mit szúrok el benne.
Most már tényleg tegyük vissza az edit gombot, vagy csinálok egy ellen scene portált, és csak ott szólok hozzá a saját cikkeimhez! ;)
Amúgy ilyen volt a saját tabulálásomban a kód, amit büntetésből írok be mégegyszer, amiért nincs edit gomb
wD3D := Direct3DCreate9 (D3D_SDK_VERSION);
try
AResCombo.Items.Clear;
lstModes := TList.Create;
wCount := wD3D.GetAdapterModeCount(D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8);
for i := 0 to wCount-1 do
begin
wD3D.EnumAdapterModes (D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8, i, wDisplayMode);
if wDisplayMode.Width >= 320 then
begin
New (wModeRec);
wModeRec.Width := wDisplayMode.Width;
wModeRec.Height := wDisplayMode.Height;
wModeRec.Refresh := wDisplayMode.RefreshRate;
lstModes.Add (wModeRec);
AResCombo.Items.Add (IntToStr(wDisplayMode.Width) + ‘x’+
IntToStr(wDisplayMode.Height)+ ‘ ‘+
IntToStr(wDisplayMode.RefreshRate)+ ‘Hz’);
end;
if wDisplayMode.Width = 800 then
AResCombo.ItemIndex := AResCombo.Items.Count-1;
end;
finally
wD3D := nil;
end;
wazze, és ezt is átformázza. Na nincs több bünti, csak sok felesleges bejegyzés, mert nincs Edit gomb ;)
Bery: admin vagy, moderald magad! :)
Lószart! Legyen Edit gomb, vagy telefoodolok mindent! Ez most már tényleg a szarból szart, értelem nélkül
Ja, floodolok, csak elírtam, és nincs edit gomb, hogy javítsam ;)
Sajnos
Pedig volt
De így jobb, tényleg!
Azért jó hogy nincs edit gomb mert már a 88. hozzászólásnál tartunk \o/
Mar mas is javasolta, legyen idokorlatos, vagy addig amig nincs mogotte masik hozzaszolas banom is en, ha “valakit” zavar a jelenlete, de ez igy tenyleg szar… :(
És akkor mi van, ha valaki visszamenőleg kijavít valamit? 20-an láttuk az eredetit, mi értelme ezek után letagadni? Meg ki akarná meghamisítani a múltat Marty (magyarul: Márta ;)) McFly-on kívül? ;)
Beadom az Alkotmánybíróságnak az Edit gombot, mint népszavazási kérelmet ;)
Ja, én 2 fórumot is ismerek ahol tökjól működik a 15 perces edit lehetőség.
Gargajt kell meggyőzni, vagy Bery, nyugodtan írd meg sztem.
szerintem aha jó példát mutathatna, ha tenne a configdialog-ra edit gombot. egyébként itt a fórumon meg lehet lenni edit gomb nélkül, ha átolvasod a kommented mielőtt elküldöd. a pouet is éveket kellett várni a preview gombra…
Tulajdonképpen mi volt a baj az Edit gombbal?
en csak azt nem ertem hogy aki admin az miert nem kapcsolja vissza? ott van az optionsben… :)
hat en speciel azert nem nyulok hozza, mert masr nem tudom kovetni az e107 hekkelodeset, es ilyen olyan kapcsolok allitasa olyskor eleg vicces nem vart kovetkezmenyekkel jart. magyaran nem merek en mar semmit csinalni szakerto segitsege nelkul. :)
\o/
megint tul hamar lett jo nekunk, pedig mar azt fontolgattam, hogy csinalok editgomb request introt :)
[ módosítva Feb.13. 14:18 ]
hogy szemléltessem azt amit a sly írt: legutóbb pl demoscnee.hu hírek dobozt egyel lentebb toltuk, ennek eredményeképpen összeomlott az oldal :D szóval e107 büntet :)
abcug: motivalna, ha ujra ki lenne kapcsolva?
gondolom kelloen elkeseritene, bar ketlem, hogy ezen mulna…
plane az en koromban :) nezd meg pl. bery adatlapjat, leszegett tekintet, nem is mer mar a kameraba nezni, pedig o meg jol tartja magat. :)))
Szomorú, hogy most, hogy már van Edit gomb, senkit nem érdekel ez a jó kis Config menüs cikk ;))))
Harcoljunk azert, hogy legyen preview gomb a hozzaszolasoknal is, ne csak a forumban :)))
na az mar kemeny harc lesz, mert az nem csak egy checkbox kipipalasa. azt valakinek meg kell irni.
<? nos, mivel a forumnal van, gondolom (en barom), hogy mar megirta valaki, szoval csak azt a fuggvenyt kellene hasznalni :) >
hogy egy hasonlattal valaszoljak, csak azert mert a PCben van TVtuner, meg nem biztos hogy belemegy a C64be… :)
najo, de nem a hutoszekrenyre kertem kijelzot, hanem a tv-n kepet a kepben :)