
Cikkünkhöz mellékeltük a témát adó szkripteket:
"OpenDlg.vbs" - Megjelenít egy szabványos megnyitás dialógus ablakot.
"SaveDlg.vbs" - Megjelenít egy szabványos mentés dialógus ablakot.
Nem fogunk olyan hatékonyságot elérni, mint egy Delphi komponenssel, de alapszintű műveleteket meg tudunk valósítani. Így még mindig lényegesen egyszerűbb, mint ha nekünk kell mindent leprogramozni. Először is tisztázzuk, hogy melyik ablakokról van szó: ha elindítjuk például a Paint programot és a "Fájl" ("File") menü "Megnyitás" ("Open") pontjára kattintunk, megjelenik egy szabványos megnyitás dialógus ablak. A "Mentés" ("Save") vagy "Mentés másként" ("Save As") menüvel pedig egy szabványos mentés dialógus ablakot csalogathatunk elő. Célunk, hogy ugyanezt szkriptből is megjelenítsük, és kezeljük az általa szolgáltatott információt - azaz a felhasználó által megadott fájl nevét. Mivel a Windows Scripting Host (WSH) részéről nem kapunk támogatást, át kell hidalnunk a problémát.
Nézzük elsőként a Windows XP-beli megvalósítást:
Az operációs rendszer több DLL-ben kezeli a dialógus ablakokat. A megnyitásért és mentésért többek között a %systemroot%\system32 mappában található "SAFRCFILEDLG.DLL" felelős. Azért többek között, mert ugyanezek az ablakok más helyről is elérhetők, a DLL-en belüli hivatkozásoknak köszönhetően. Ha belenézünk láthatjuk, hogy tartalmaz néhány metódust és tulajdonságot, márpedig, ha ez így van, akkor jó eséllyel kívülről is el lehet érni őket. Az egyik ilyen metódus a "FileOpen". Hozzunk létre VB szkriptben egy új objektumot a DLL-ből és rögtön hivatkozzunk erre a metódusra:
set FS = CreateObject("SAFRCFileDlg.FileOpen")
A dialógus ablak bezárása után keletkezik egy visszatérési érték, amit ki kell olvasnunk. Kiolvasása után törlődik a tartalma. Ha nem olvassuk ki, akkor nem törlődik és nem tudjuk még egyszer megnyitni az ablakot.
return=FS.OpenFileOpenDlg
Ezzel gyakorlatilag megjelenítettünk és szabályosan bezártunk egy megnyitás ablakot, amiben a felhasználó kiválaszthat egy fájlt, vagy a "Mégsem" ("Cancel") gombbal, esetleg az ESC billentyűvel meggondolhatja magát és kiléphet. Döntésének az eredménye a "FileName" tulajdonságban tárolódik, csak megfelelően kell értelmeznünk. Ha a visszakapott érték egy üres sztring, akkor meggondolta magát és kilépett, ha nem, akkor kijelölt egy fájlt. Ezt egy egyszerű IF THEN ELSE formulával lekezelhetjük:
if FS.FileName <> "" then
wscript.Echo "Fájlnév: " & FS.FileName
else
wscript.Echo "A felhasználó kilépett"
end if
Következő feladat egy mentés ablak megjelenítése. Az eljárás megegyezik az előbb vázolt megoldással, csak néhány ponton meg kell változtatnunk a hivatkozásokat. Nem a "FileOpen" metódust kell meghívni, hanem a "FileSave"-t és a kötelezően kiolvasandó visszatérési érték neve "OpenFileSaveDlg".
set FS = CreateObject("SAFRCFileDlg.FileSave")
return=FS.OpenFileSaveDlg
if FS.FileName <> "" then
wscript.Echo "Fájlnév: " & FS.FileName
else
wscript.Echo "A felhasználó kilépett"
end if
Tipp:
A dialógus ablak lekezeli, ha már létező fájlt jelölünk ki mentésre és feltesz egy kérdést, hogy felülírjuk-e az előző példányt. Honnan fogjuk megtudni az ablak bezárása után, hogy milyen választ adott a felhasználó? Nem kell tudnunk, elég tudni a fájlnevet és szkripten belül, feltétel nélkül elvégezni a felülírást. Ha a felhasználó igennel válaszolt, akkor a felülírás mellett döntött, ha nemmel, akkor viszont üres a "FileName" változó tartalma, ami egyenlő a "Mégsem" jellegű kilépéssel. Sőt egy nemleges válasz önmagában nem zárja be az ablakot, tehát csak szabályos, de más úton tud kilépni, amit mi lekezelünk az IF THEN ELSE feltételben.
A fentiekből kitűnik, hogy a szűkös lehetőségek ellenére az első pillantásra megoldhatatlannak látszó helyzeteket is sokszor megfelelően lehet kezelni, annak ellenére, hogy a WSH nem nyújt támogatás.
Térjünk át a Windows 2000-hez: ott ugyanis hiányzik a "SAFRCFILEDLG.DLL". Egyszerűen másoljuk át az XP-ből és adjuk ki a következő parancsot:
Ezzel regisztráltuk az operációs rendszerben és ettől kezdve változtatás nélkül futnak a fenti szkriptjeink. A DLL eltávolítása az alábbi módon lehetséges: