☰ Menu

Scene.hu

Magyar demoscene portál – grafikusok, zenészek, programozók alkotói közössége

Gyorsan ConfigDialog

Posted by aha on 2008-02-07, 10:31
dialog_2008.pngAdott az alap ötlet: Gyorsan kell a demónk elejére, egy Config Dialog, de hirtelen nem tudjuk, mit csináljunk. A megoldás: kapjunk elő egy free Delphit (Delphi Personal), kattintsuk össze a dialógus ablakot, majd fordítsuk le dll-ként és hívjuk meg egy másik programnyelvből (mondjuk C++-ból)! De hogyan? Ha tovább kattintasz, ezt is megtudhatod. Ha mégsem akarod elolvasni a cikket, akkor forrás itt.

Mi kell hozzá?

Kellene egy Delphi. Na most én anno, amikor még le lehetett tölteni a Delphi Personal 7.0-át, azt én jól megtettem. Hogy most hogyan jutsz hozzá, nem tudom. (Mindenre van megoldás.) Ez egy teljesen ingyenes Delphi, azzal az apró bibivel, hogy nem lehet mást vele csinálni, mint Windows-t fejleszteni Object Pascalban. De csak ennyi. A mindenféle adatbázis és a csillivilli extra komponensek hiányoznak belőle. Amire kell nekünk (form tervezés, dll-be fordítás), azt még bőven tudja. Ha valahonnan le tudod tölteni (vagy elkéred tőlem), akkor a codegear (link) honlapján kérhetsz rá saját reg kódot, és hipp-hopp máris készen áll tök ingyen a saját free-delphis tool készítő eszközöd.

A dialógus hívó kódját Dev-C++ ban csináltam, ami egy egyszerű C++ programocska lesz.

A munkamenetünk.

  • Delphiben megtervezzük a formunkat
  • Dll-be fordítjuk
  • C++ -ban írunk egy programot, ami dinamikusan csatolja magához ezt a dialog.dll-t és meghívja annak GetDialog függvényét. Miután a kívánt config adatokat megkaptuk, a beállító ablakból elengedjük a dialog.dll-t és folytatjuk tovább a programunkat (avagy indulhat a MegaDemo).


A Delphis form Születése.

Nyissuk meg a Delphit és pakoljuk össze ízlés szerint a config ablakot! Mindenképen legyen rajta egy ListBox, amiben a lehetséges felbontásokat soroljuk fel! Legyen még rajta 2 db RadioButton, ami az ablakos és a teljeképernyős üzemmód között enged választani! Legyen még rajta egy CheckBox, ami a vertikális szinkronizációt engedi választani! Elfér még rajta egy kép is, ami lehet logó vagy screenshot a demóból. És végül legyen rajta 2 Button. egy Cancel és egy Start.

Valahogy így:

dialog_2008_02_s.png

A tervezés után kapunk egy forrást, amit mondjuk mentsünk el! Csináljuk azt, hogy amíg tesztelünk, addig ezt egy projektként mentjük el! (Save All) Megkérdezi, hogy a formunk forrásfájlja mi legyen. Én ConfigForm.pas nevet adtam a formot pedig FormConfig-nak neveztem el. (A buta nem tud elmenti ugyanolyan néven, mint a unitunk mert “névütközik”.)
dialog_2008_00_s.png

A következő kérdés az, hogy a projektünk neve mi legyen. Ezt elneveztem “test”-nek, mert csak addig lesz rá szükségünk, amíg Delphiben teszteljük a formunk kinézetét.

dialog_2008_01_s.png

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 ).
dialog_2008_045.png

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:

dialog_2008_0451.png

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.
dialog_2008_0452.png

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.

dialog_2008_cpp.png

Ha minden jól ment, és lefordult minden (csak reménykedni tudok), akkor valami ilyesmit kaphatunk:

dialog_2008_05_s.png

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.

Categories: Programozás

107 Responses so far.

  1. avatar pohar says:

    köszi a cikket!
    és remélem, hogy sok szép config ablakot látunk ezután :)

  2. avatar blala says:
    pohar | jan.31. 09:24
    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

  3. avatar Jimmi says:

    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. :)

  4. avatar Gargaj says:

    CConfigDlg dlg;
    dlg.DoModal();

    :)

  5. avatar blala says:
    wrote
    MFC-vel.

    tavozz tolem, satan! :)

  6. avatar Murphy says:

    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ő. ;)

  7. avatar kt says:

    3dsMax plugin iráskor én meg a ResEdit+VC++ kombóval bohóckodtam, egy pofás kis dialogért….
    Ezer köszönet! :)

  8. avatar FooLman says:

    kek-feher-sarga editor szinsema FTW!!!!!!

  9. avatar aha says:

    old school-os nekem tetcik :)

  10. avatar Bery says:

    Öööö, 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 ;)))

  11. avatar Bery says:

    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.

  12. avatar pohar says:
    …és reméljük, hogy sok cikkhez lesz még szép pohár-hozzászólás :D

    Blala: mikor jön ki a demod linux portja? :D

  13. avatar Gargaj says:

    erdeklodoknek ugyanez Visual C++ ala:
    http://umlaut.intro.hu/~gargaj/temp/fwzSetup.zip

    (ki akartam mar adni egy jo ideje, csak… szal gondoltam raer :)

  14. avatar blala says:

    pohar, megis mirol beszelsz? es mi ez a furcsa x-re vegzodo szo??

  15. avatar aha says:

    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.

  16. avatar Oswald says:

    azért eléggé büntet hogy az egyszerű delphis megoldáshoz is egy 5 oldalas cikket kell írni :P :)

  17. avatar blala says:
    wrote
    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 :(

  18. avatar FooLman says:

    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… :)

  19. avatar Gargaj says:

    zanzasitva, regen azert volt sokkal jobb mert egyreszt minden sokkal konnyebb volt, masreszt minden sokkal nehezebb volt? :)

  20. avatar Oswald says:

    gargaj megragadta a lenyeget :D

  21. avatar pontscho says:

    Igy irjon nektek aha legkozelebb cikket.

  22. avatar pasy says:

    pontscho megragadta a lényeget

  23. avatar Maxie says:

    É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 ;)

  24. avatar slyspy says:

    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.

  25. avatar Charlie says:

    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.)

  26. avatar Charlie says:

    Nab#?zmeg… Image disabled… NNNA AKKOR!!…

    Elso, Masodik.

  27. avatar Oswald says:

    na kb így kéne kinéznie a dolognak 2008ban. :) basszus ha az amigák győztek volna anno :) \o/

  28. avatar Oswald says:

    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

  29. avatar Gargaj says:

    p96RequestModeIDTags? az elobb meg mintha valaki reklamalt volna a D3DXCreateTextureFromFile miatt hogy az tehetsegpotlas :)

  30. avatar Charlie says:

    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… :)

  31. avatar Charlie says:

    Gargaj: Ha ez tul ecceru, meghivhatod asmbol is, hogy bonyibb legyen. :P

  32. avatar blala says:
    wrote
    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 :)

  33. avatar Gargaj says:

    en csak azt talalom mokasnak hogy mindenkinel mennyire mashol van a “tehetsegpotlas” es a “bloatware” kozotti hatar :)

  34. avatar blala says:

    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:

    wrote
    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.
  35. avatar Gargaj says:

    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.

  36. avatar Charlie says:
    wrote
    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… :)

  37. avatar blala says:
    wrote
    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.

  38. avatar pohar says:

    azokkal szemben sem fair, hogy a boltban veszel kaját, akiknek vadászniuk kell

  39. avatar Charlie says:

    Bemegyek szemben a Plusba, megnezem a felhozatalt, es komolyan elgondolkodom neha, hogy inkabb vadaszni kene…

  40. avatar Gargaj says:
    wrote
    Akkor megegyszer, mert latom nem volt vilagos

    elnezest, fogalmi zavar allt fent.

  41. avatar FooLman says:

    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 :)

  42. avatar Charlie says:
    wrote
    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

  43. avatar Murphy says:

    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.

  44. avatar Charlie says:

    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.

  45. avatar Gargaj says:

    A C++ megvalositas ott van kicsit fentebb egy .zip-ben amugy :)

  46. avatar Charlie says:

    Es tenyleg. Oszinten, rondabbat vartam, bar azert igy se kutya, hogy resource filetol kezdve a kiskutyafuleig minden van, ahogy kell. :)

  47. avatar Oswald says:

    Charlie, én örülnék egy amigaos rejtelmei c. cikknek ;)

  48. avatar Maxie says:

    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. :)

  49. avatar blala says:
    wrote
    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
  50. avatar Charlie says:

    “A DLL-ek konnyebben hangolhatok egymashoz.” Bazdmeg, a bokam lefosom. Meeeg Maxie, buntess, konyorgom! :D (Rettenet.)

  51. avatar pontscho says:
    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. :)

    Ugye ezt nem gondolod komolyan. Ha igen, akkor javaslom ujra olvasni Tannenbaum tanar ur Operacios rendszerek c. konyvet.

  52. avatar Charlie says:

    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.

  53. avatar Gargaj says:

    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 :)

  54. avatar Charlie says:

    Hat pont errol van szo. Szerintem az a GUI, amihez ilyen resourcefileos formeditoros borzalom kell, es generalni kell, az mar reg rossz…

  55. avatar blala says:

    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.

  56. avatar pontscho says:

    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.

  57. avatar blala says:

    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?

  58. avatar Gargaj says:

    most nem arra gondolt hogy C#-ben a DLL importhoz nem kell import .lib vagy LoadLibrary(), mer van [DllImport]?

  59. avatar pontscho says:

    “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ó.

  60. avatar Gargaj says:

    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 :)

  61. avatar Jimmi says:

    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.

  62. avatar blala says:

    Jimmi: a “tehetsegpotlas” szo elso felbukkanas a diskurzusban a kovetkezo:

    wrote
    az elobb meg mintha valaki reklamalt volna a D3DXCreateTextureFromFile miatt hogy az tehetsegpotlas :)

    by Gargaj. En sem ertettem hogy kerult elo, btw.

  63. avatar Jimmi says:

    blala: jó, szerintem így is érted, hogy mire akartam célozni. Nem rád. :)

  64. avatar Charlie says:
    wrote
    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.

  65. avatar Jimmi says:
    Ha mar torzsalkodunk…

    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.

  66. avatar blala says:

    Na jolvan gyerekek, akkor ezt tul is targyaltuk, mindenki vonuljon a sarokba cikket irni :))

  67. avatar pohar says:

    ezek után ki mer majd cikket írni? :)

  68. avatar Travis says:

    Cikket írni? Én az első demómat nem merem kiadni.

  69. avatar zoom says:

    Írjál cikket arról hogy miért nem mered kiadni, az is érdekes lehet :)

  70. avatar pohar says:

    mert leugatnak mindent :)

  71. avatar abcug says:

    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 :)

  72. avatar aha says:

    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

  73. avatar Gargaj says:

    abcug: nincs benne cancel

  74. avatar abcug says:

    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 :)))

  75. avatar Bery says:

    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]

  76. avatar Bery says:

    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! ;)

  77. avatar Bery says:

    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;

  78. avatar Bery says:

    wazze, és ezt is átformázza. Na nincs több bünti, csak sok felesleges bejegyzés, mert nincs Edit gomb ;)

  79. avatar slyspy says:

    Bery: admin vagy, moderald magad! :)

  80. avatar Bery says:

    Lószart! Legyen Edit gomb, vagy telefoodolok mindent! Ez most már tényleg a szarból szart, értelem nélkül

  81. avatar Bery says:

    Ja, floodolok, csak elírtam, és nincs edit gomb, hogy javítsam ;)

  82. avatar Bery says:

    Pedig volt

  83. avatar Bery says:

    De így jobb, tényleg!

  84. avatar aha says:

    Azért jó hogy nincs edit gomb mert már a 88. hozzászólásnál tartunk \o/

  85. avatar abcug says:

    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… :(

  86. avatar Bery says:

    É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? ;)

  87. avatar Bery says:

    Beadom az Alkotmánybíróságnak az Edit gombot, mint népszavazási kérelmet ;)

  88. avatar zoom says:

    Ja, én 2 fórumot is ismerek ahol tökjól működik a 15 perces edit lehetőség.

  89. avatar slyspy says:

    Gargajt kell meggyőzni, vagy Bery, nyugodtan írd meg sztem.

  90. avatar pohar says:

    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…

  91. avatar Jimmi says:

    Tulajdonképpen mi volt a baj az Edit gombbal?

  92. avatar Gargaj says:

    en csak azt nem ertem hogy aki admin az miert nem kapcsolja vissza? ott van az optionsben… :)

  93. avatar slyspy says:

    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. :)

  94. avatar abcug says:

    \o/

    megint tul hamar lett jo nekunk, pedig mar azt fontolgattam, hogy csinalok editgomb request introt :)
    [ módosítva Feb.13. 14:18 ]

  95. avatar Murphy says:

    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 :)

  96. avatar slyspy says:

    abcug: motivalna, ha ujra ki lenne kapcsolva?

  97. avatar abcug says:

    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. :)))

  98. avatar Bery says:

    Szomorú, hogy most, hogy már van Edit gomb, senkit nem érdekel ez a jó kis Config menüs cikk ;))))

  99. avatar abcug says:

    Harcoljunk azert, hogy legyen preview gomb a hozzaszolasoknal is, ne csak a forumban :)))

  100. avatar slyspy says:

    na az mar kemeny harc lesz, mert az nem csak egy checkbox kipipalasa. azt valakinek meg kell irni.

  101. avatar abcug says:

    <? nos, mivel a forumnal van, gondolom (en barom), hogy mar megirta valaki, szoval csak azt a fuggvenyt kellene hasznalni :) >

  102. avatar Gargaj says:

    hogy egy hasonlattal valaszoljak, csak azert mert a PCben van TVtuner, meg nem biztos hogy belemegy a C64be… :)

  103. avatar abcug says:

    najo, de nem a hutoszekrenyre kertem kijelzot, hanem a tv-n kepet a kepben :)

Leave a Reply

You must be logged in to post a comment.

Ugrás a lap tetejére Ugrás a lap aljára