|
|
OpenDialog és SaveDialog Windows 2000-es változata
|
|
Példaprogram letöltése
6415 bájt
|
Windows 2000-től egy újabb típusú fájl megnyitás illetve mentés dialógus ablakkal találkozhatunk. Ebben ikonok formájában megtalálhatók a speciális mappák (Sajátgép, Dokumentumok, stb.), amiknek segítségével könnyedén az adott helyre ugorhatunk. Ebben a példában egy olyan komponenst készítünk, amely egy ilyen dialógus ablakot jelenít meg, ráadásul egy property-n keresztül azt is meghatározhatjuk, hogy fájl megnyitás, vagy mentés lesz-e. Azok is használhatják a komponenst, akik nem Windows 2000-et vagy Me-t használnak, ugyanis a komponens figyelembe veszi az adott operációs rendszer verzióját, és régebbi verzió esetén az eredeti dialógus ablakot jeleníti meg.
A mellékelt példaprogram megnyitása előtt a FileNameDialog.pas-ban lévő komponenst telepítenie kell a Delphi alá.
A komponenst a TOpenDialog osztályból származtatjuk, amit kiegészítünk néhány új property-vel és metódussal. A ShowPlaces logikai típusú property-vel megadhatjuk, hogy a panel az ikonokkal megjelenjen-e, vagy sem. A DialogType property-vel azt határozhatjuk meg, hogy fájl megnyitás (Open Dialog), vagy fájl-mentés (Save Dialog) dialógus ablakot szeretnénk megnyitni.
A komponens konstruktorában lekérdezzük az operációs rendszer verziószámát, és az FWin2000 logikai változó értékét ennek megfelelően állítjuk be.
Szükség lesz a TOpenFileName rekord kibővítésére. Ez csupán annyit jelent, hogy az eredeti struktúrához hozzájön még egy FlagsEx nevű DWORD típusú mező. Ebben tudjuk majd megadni, hogy legyen-e ikon panel, vagy sem. Ehhez deklarálunk egy konstanst, aminek az értéke 1. Ha ezt a konstanst értékül adjuk a FlagsEx mezőnek, akkor az ikon panel nem jelenik meg.
A dialógus ablak megnyitásához kell egy függvény, aminek a deklarációja így néz ki:
function DlgFunc(var DialogData: TOpenFileName): Bool; stdcall;
Mint látható, ennek paramétere TOpenFileName típusú. Ebben nincs benne a FlagsEx mező, ezért ezt egy globális változón keresztül adjuk meg, a dialógus ablak típusával együtt. Ehhez deklaráltunk egy új típust, amiben a két adatot megadhatjuk:
TDialogOpts = record
DialogType: TFileNameDialogType;
FlagsEx: DWORD;
end;
...
var
DialogOpts: TDialogOpts;
A dialógus ablak megnyitása az Execute függvény meghívásával történik. Ebben ellenőrizzük, hogy az operációs rendszer megfelelő-e, és ha nem, akkor az eredeti Execute függvényt hívjuk meg. Ha megfelelő, akkor a DialogOpts változót feltöltjük a szükséges adatokkal, majd a DoExecute függvénnyel meghívjuk a DlgFunc függvényt. A DoExecute függvény paramétereként át kell adni a DlgFunc függvény címét. A DoExecute függvény visszatérési értéke a DlgFunc függvény visszatérési értéke lesz, és ez lesz az Execute függvényé is.
Most nézzük meg részletesen, hogy mi is történik a DlgFunc függvényben:
var ExData : TOpenFileNameEx;
...
Move(DialogData, ExData, sizeof(DialogData));
ExData.lStructSize := sizeof(TOpenFileNameEx);
ExData.FlagsEx := DialogOpts.FlagsEx;
Az ExData változó TOpenFileNameEx típusú, ami már tartalmazza a FlagsEx mezőt is. A paraméterként megkapott DialogData változó tartalmát átmásoljuk az ExData változóba. Ezután az lStructSize mező értékét beállítjuk az ExData változó méretére, mivel itt eredetileg a DialogData változó mérete van eltárolva. A FlagsEx mezőnek átadjuk a DialogOpts globális változó FlagsEx mezőjének értékét.
A következő lépésben megnézzük, hogy milyen dialógus ablakot kell megnyitni (Open vagy Save Dialog), és ennek megfelelően meghívjuk a szükséges függvényt, paraméterként átadva neki az ExData változót.
if DialogOpts.DialogType=dtOpenDialog then
result := GetOpenFileNameEx(ExData)
else
result := GetSaveFileNameEx(ExData);
end;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 448. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|