Az OS/2 REXX-nek megvan az a nagy elônye, hogy a REXXUtil segédfüggvények segítségével az objektum orientált gondolkodás jegyében megalkotott Munkaasztal (WPS = WorkPlace Shell) objektumai könnyedén manipulálhatóak. Hogy jobban megértsük a lecke anyagát, a következôkben megemlítjük az objektum orientált programozás néhány fontosabb fogalmát:
| Fogalom: | Definició: |
| osztály (class) | Egy általános objektumdefiníció. Az osztály segítségével lehet közös tulajdonságokkal rendelkezô objektumokat gyártani. |
| példány (instance) | Egy konkrét objektum. |
| módszer (method) | Egy olyan egység, amely az objektum viselkedését határozza meg. Az esetek nagy részében valamilyen függvényt jelent. |
A WPS osztályai
A Munkaasztal felépítésében meghatározó szerepet játszanak a beépített osztályok, amelyekbôl származnak a grafikus felületen látható konkrét objektumok. A gyûjtôk, a printer objektum, vagy pl. a font paletta mindegyike visszavezethetô egy WPS osztályra. Amikor egy objektum elkészül, akkor automatikusan örökli az osztályában megadott tulajdonságokat. A legtöbb osztálydefiníció azt is megengedi, hogy a tulajdonságok egy részét (pl. egy programobjektum esetében az objektum nevét, vagy a végrehajtott fájl elérési útvonalát) megváltoztassuk. A WPS által használt osztályok teljes listáját kaphatjuk meg a SysQueryClassList függvény meghívásával. Mivel a függvény egy listát ad vissza, bemenetként meg kell adni annak az összetett változónak a nevét, amelybe a lista kerül:
rc = SysQueryClassList(lista)A már megszokott módon, a lista.0 tartalmazza az osztályok számát, a lista.1. lista.2 stb. pedig az osztályok nevét és azt a DLL-t, amelyben a definíció található. Az alábbi néhány soros program kilistázza az összes WPS osztályt:
/* WPS osztályok listája */
CALL RxFuncADD 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
CALL SysLoadFuncs
CALL SysQueryClassList('osztályok.')
DO i = 1 TO osztalyok.0
SAY osztalyok.i
END
EXIT
Ha lefuttatjuk a példaprogramot, akkor látni fogjuk, hogy milyen sok regisztrált osztályt használ a WPS. Szerencsére nincs arra szükség, hogy mindegyiket részletesen ismerjük, és a továbbiakban mi is csak néhány fontosabb osztályra fogunk kitérni:
| WPS osztály: | Leírás: |
| WPColorPalette | A színpaletta osztálya. |
| WPFolder | A gyûjtôk osztálya. |
| WPFontPalette | A fontpaletta osztálya. |
| WPProgram | A programobjektumok osztálya |
| WPSchemePalette | A színsémák osztálya |
| WPShadow | Az árnyékobjektumok osztálya |
A SysCreateObject segédfüggvény segítségével szinte bármelyik regisztrált osztály alapján készíthetünk objektumokat. A szintakszis a következô:
rc = SysCreateObject(osztály, cím, elhelyezkedés [, kulcsok; ...] [, opció]])
A függvény 1-et ad vissza, ha sikerült az objektum elkészítése, ellenkezô esetben pedig 0-át. A meghíváskor átadott elsô paraméter határozza meg az objektum osztályát, így ez például WPFolder kell hogy legyen, amennyiben egy gyûjtôt akarunk létrehozni. A cím paraméterrel adjuk meg az objektum nevét. Az elhelyezkedés pedig azt mondja meg, hogy melyik gyûjtôben akarjuk elhelyezni az új objektumot. Ennek a paraméternek kétféleképpen is adhatunk értéket. A legkézenfekvôbb az, ha egyszerûen beírjuk a gyûjtô elérési útvonalát, ami pl. C:\Desktop lehet, ha a Munkaasztalon akarjuk elhelyezni objektumunkat. A másik lehetôség, ha az objektumok azonosítására szolgáló, rendszeren belül teljesen egyedi ObjectID-t (magyarul objektumazonosító) adjuk meg. Az ObjectID nem változik az objektum élete során, így pl. arra is használható, hogy ez alapján keressünk meg olyan objektumokat, amelyeknek nem ismert az elhelyezkedése. Az ObjectID mindig a < jellel kezdôdik és a > jellel végzôdik. A Munkaasztal azonosítója pl. a <WP_Desktop>. A kulcsok paraméterrel olyan adatokat adhatunk meg, amelyek az objektum viselkedését befolyásolják. A kulcsokat egymás után felsorolva, kulcs-név=adat formában kell megadni. A kulcs-adat párosokat pontos vesszôvel kell elválasztani. Ha egy kulcs több adatot is megenged, akkor az adatokat vesszôvel kell elválasztani:
"kulcs1=adat;kulcs2=adat1, adat2;"
Amennyiben az adat pontosvesszôt, vagy vesszôt tartalmaz, akkor azt a ^ jelnek kell megelôznie (^, ^;). Az utolsó opció paraméterrel azt mondhatjuk meg, hogy mit csináljon a SysCreateObject, ha a létrehozni kívánt objektum már létezik. A paraméternek három értéke lehet: ReplaceIfExists (írd fölül, ha már létezik), UpdateIfExists (frissítsd, ha már létezik) és FailIfExists (ne csinálj semmit, ha már létezik). Az értékek elsô karakterét (R, U és F) is használhatjuk, ha nem akarunk sokat gépelni.
Most pedig térjünk vissza kicsit a kulcsokhoz! Az osztályok definíciói tartalmazzák, hogy melyik osztály mely kulcsokat támogatja. Szerencsére nagyon sok osztály közös kulcsokat használ, így nem kell minden osztály esetében más és más kulcsokat megtanulni. Az alábbi táblázatban összefoglaltuk a WPS osztályok által használt leggyakoribb kulcsokat:
| Kulcsnév: | Érték: | Leírás: |
| CCVIEW | DEFAULT | A rendszer konkurens-nézet beállítása érvényes. |
| YES | Az objektum megnyitásakor mindig új nézet keletkezik. | |
| NO | Amikor az objektumot megnyitják, minden addigi nézete frissítôdik. | |
| HELPLIBRARY | fájlnév | Beállítja a segítség könyvtárat a fájlnév alapján. |
| HELPPANEL | id | Az objektum alapértelmezés szerinti segítség paneljét állítja be az id alapján. |
| HIDEBUTTON | YES | Az objektum rendelkezik az elrejtô gombbal. |
| NO | Az objektum minimalizáló gombbal rendelkezik. | |
| ICONFILE | fájlnév | Beállítja az objektum ikonját a fájlnév alapján. |
| ICONPOS | x,y | Beállítja az objektum gyûjtôn belüli koordinátáit. |
| ICONRESOURCE | id, dll | Beállítja az objektum ikonját a DLL-en belüli id alapján. |
| MINWIN | HIDE | Az objektum rejtetté válik minimalizálás után. |
| VIEWER | Az objektum a Zsugorítottablak-megjelenítôbe kerül minimalizálás után. | |
| DESKTOP | Az objektum a Munkaasztalra kerül minimalizálás után. | |
| NOCOPY | YES | Az objektum nem másolható. |
| NO | Az objektum másolható. | |
| NODELETE | YES | Az objektum nem törölhetô. |
| NO | Az objektum törölhetô. | |
| NODRAG | YES | Az objektum nem vontatható. |
| NO | Az objektum vontatható. | |
| NODROP | YES | Az objektumra nem lehet ráejteni más objektumot. |
| NO | Az objektumra lehet más objektumot ejteni. | |
| NOLINK | YES | Az objektumról nem lehet árnyékot készíteni. |
| NO | Az objektumról lehet árnyékot készíteni. | |
| NOMOVE | YES | Az objektum nem mozgatható. |
| NO | Az objektum mozgatható. | |
| NOPRINT | YES | Az objektum nem nyomtatható. |
| NO | Az objektum nyomtatható. | |
| NORENAME | YES | Az objektum nem nevezhetô át. |
| NO | Az objektum átnevezhetô. | |
| NOSHADOW | YES | Az objektumról nem lehet árnyékot készíteni. |
| NO | Az objektumról lehet árnyékot készíteni. | |
| NOTVISIBLE | YES | Az objektum nem látható. |
| NO | Az objektum látható. | |
| OBJECTID | azonosító | Beállítja az objektum azonosítóját. A rendszeren belül egyedinek kell lennie! |
| OPEN | SETTINGS | Kinyitja a Beállítások jegyzettömböt az objektum elkészítése után. |
| DEFAULT | Az objektum default nézetét nyitja meg az elôállítás után. | |
| SETTINGS | YES | Meg lehet változtatni a beállításokat. |
| NO | Nem lehet a beállításokat megváltoztatni. | |
| TEMPLATE | YES | Az objektum minta. |
| NO | Az objektum nem lehet minta. | |
| TITLE | cím | Beállítja az objektum címét. |
Font és színpaletták elôállítása
Az OS/2 telepítése során a font és színpaletták automatikusan megjelennek a Rendszerbeállítások gyûjtôben. A SysCreateObject segítségével könnyedén készíthetünk egyéb palettákat is. A legegyszerûbb a fontpaletta elôállítása:
rc = SysCreateObject('WPFontPalette', 'Extra fontpaletta', '<WP_DESKTOP>',, 'R')
A színpaletta elôállítása kicsit bonyolultabb. Ennek az osztálynak van ugyanis egy COLORS nevû kulcsa, amelyik meghatározza, hogy milyen színek kerüljenek a palettába. A COLORS kulcs értéke egy hexadecimális karakterlánc, amely az RGB színkomponenseket kódolja az RRGGBB maszk szerint. Az alábbi példaprogram három színpalettát állít elô (piros, zöld és kék). A színek intenzitása 16 lépésben változik a legsötétebbtôl a legvilágosabbig.
/* Színpaletták elôállítása */
CALL RxFuncADD 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
CALL SysLoadFuncs
piros = 'COLORS=0x000000'
kek = 'COLORS=0x000000'
zold = 'COLORS=0x000000'
lepes = 255 % 16
DO szin = (lepes * 3) TO 255 BY lepes
ertek = D2X(szin, 2)
piros = piros || ',0x' || ertek || '0000'
zold = zold || ',0x00' || ertek || '00'
kek = kek || ',0x0000' || ertek
END
rc = SysCreateObject('WPColorPalette', 'Piros', '<WP_DESKTOP>', 'OBJECTID=<TP_PIROS>;AUTOSETUP=LORES;' || piros';', 'R')
IF Rc = 0 THEN SAY 'Sikertelen a piros paletta elôállítása!'
rc = SysCreateObject('WPColorPalette', 'Kék', '<WP_DESKTOP>', 'OBJECTID=<TP_KEK>;AUTOSETUP=LORES;' || kek';', 'R')
IF Rc = 0 THEN SAY 'Sikertelen a kék paletta elôállítása!'
rc = SysCreateObject('WPColorPalette', 'Zöld', '<WP_DESKTOP>', 'OBJECTID=<TP_ZOLD>;AUTOSETUP=LORES;' || zold';', 'R')
IF Rc = 0 THEN SAY 'Sikertelen a zöld paletta elôállítása!'
EXIT
A program mûködése nem bonyolult. Az elsô hurok 16 lépésben állítja elô a színek hexadecimális kódjait. Ezután pedig nincs más hátra, mint háromszor meghívni a SysCreateObjectet a megfelelô COLORS kulcsértékkel, és máris elkészülnek az objektumok.
A gyûjtôk elôállítása
A gyûjtôket három fô nézetben lehet megnyitni: ikon, fa és részletes. Ezeket a nézeteket még tovább lehet variálni a stíluselemek alapján. Például megadhatjuk azt, hogy kis, vagy pedig nagy ikonokat szeretnénk a gyûjtôben látni. Ebbôl adódik, hogy a gyûjtôk a már eddig említett kulcsértékek mellett még jó néhány egyéb kulccsal is rendelkeznek:
| Kulcsnév: | Érték: | Leírás: |
| BACKGROUND | fájlnév | A fájlnév alapján beállítja a gyûjtô hátterét. A fájlnak az \OS2\BITMAP könyvtárban kell lennie. |
| DETAILSFONT | fontméret.név | A részletes nézet fontméretét állítja be. |
| DETAILSVIEW | s1[,s2,...] | A részletes nézet stílusát állítja be |
| NORMAL | Normális méretû ikonok. | |
| MINI | Miniatûr ikonok. | |
| INVISIBLE | Az ikonok nem jelennek meg. | |
| ICONFOlistingsNT | fontméret.név | Az ikonnézet fontméretét állítja be. |
| ICNVIEW | s1[,s2,...] | Az ikonnézet stílusát állítja be. |
| FLOWED | Lebegô nézet. | |
| NONFLOWED | Nem lebegô nézet. | |
| NONGRID | Nem rácspontos. | |
| NORMAL | Normális méretû ikonok. | |
| MINI | Miniatûr ikonok. | |
| INVISIBLE | Az ikonok nem jelennek meg. | |
| ICONVIEWPOS | x1, y1, x2, y2 | Beállítja az ikon koordinátáit. |
| OPEN | ICON | Megnyitja a gyûjtôt ikonnézetben. |
| TREE | Megnyitja a gyûjtôt fa nézetben. | |
| DETAILS | Megnyitja a gyûjtôt részletes nézetben. | |
| TREEFONT | fontméret.név | Megadja a fa nézet fontméretét. |
| TREEVIEW | s1[,s2,...] | Beállítja a fa nézet stílusát. |
| NORMAL | Normális méretû ikonok. | |
| MINI | Kis méretû ikonok. | |
| INVISIBLE | Nem láthatóak az ikonok. | |
| LINES | Vonalakkal jeleníti meg a fát. | |
| NOLINES | Vonalak nélkül jeleníti meg a fát. | |
| WORKAREA | YES | A gyûjtôt munkaterületté jelöli ki. |
| NO | A gyûjtô nem munkaterület. |
A táblázat ismeretében már szinte gyerekjáték gyûjtôket készíteni. Az alábbi példaprogram három, különbözô nézetben megnyitott gyûjtôt hoz létre a munkaasztalon:
/* Gyûjtôk készítése */
CALL RxFuncADD 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
CALL SysLoadFuncs
rc = SysCreateObject('WPFolder', 'Folder1', '<WP_DESKTOP>', 'OBJECTID=<FO1>;OPEN=TREE;', 'R')
rc = SysCreateObject('WPFolder', 'Folder2', '<WP_DESKTOP>', 'OBJECTID=<FO2>;OPEN=DETAILS;', 'R')
rc = SysCreateObject('WPFolder', 'Folder3', '<WP_DESKTOP>', 'OBJECTID=<FO3>;ICONVIEW=FLOWED,NORMAL;ICONFONT=8.Helv;OPEN=ICON;', 'R')
EXIT
Árnyékobjektumook készítése
Az árnyékobjektumok tulajdonképpen nem mások, mint objektumok logikai összekapcsolása (link) más objektumokkal. Minden, amit az árnyékkal csinálunk, megtörténik az eredeti objektummal is és viszont. Ez alól csak a törlés, másolás és mozgatás mûveletek képeznek kivételt. Az árnyékokat könnyedén elôállíthatjuk a WPShadow osztály felhasználásával. A használathoz egyetlen új kulcsot, a SHADOWID-t kell megtanulnunk. Ez a kulcs határozza meg, hogy melyik objektumnak az árnyékát akarjuk elkészíteni. Kulcsként meg lehet adni az árnyékolandó objektum objektumazonosítóját, vagy pedig a fájl nevét. Az árnyék címe különbözhet az eredeti objektum címétôl, és az objektumazonosítója is más. A következô programocska példákat mutat árnyékobjektumok létrehozására:
/* Árnyékok készítése */
CALL RxFuncADD 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
CALL SysLoadFuncs
rc = SysCreateObject('WPFolder', 'Folder4', '<WP_DESKTOP>', 'OBJECTID=<FO4>;ICONVIEW=FLOWED,NORMAL;ICONFONT=8.Helv;OPEN=ICON;', 'R')
CALL SysFileTree 'c:\os2\book\*.inf', 'files.', 'FO'
DO i = 1 TO files.0
cim = FileSpec('name', files.i)
rc = SysCreateObject('WPShadow', cim, '<FO4>', 'SHADOWID='files.i';', 'R')
END
EXIT
A példaprogram elôször létrehoz egy gyûjtôt, majd elkészíti ebbe a gyûjtôbe a c:\os2\book könyvtárban található INF fájlok árnyékobjektumait.
Programobjektumok létrehozása
A programobjektumok mindig valamilyen végrehajtható fájlt reprezentálnak. Az objektum ikonjára duplán klikkantva futtathatjuk a megtestesített programot. A programobjektummal azt is beállíthatjuk, hogy milyen szekcióban induljon el a futtatott program, és igényeinknek megfelelôen állíthatjuk be a futtatási környezetet.
Az elôállításhoz a WPProgram osztályt kell használni. Ez az osztály a következô kiegészítô kulcsokat ismeri:
| Kulcsnév: | Érték: | Leírás: |
| ASSOCFILTER | fájlnév-szûrô | Beállítja a futtatott programmal kapcsolatos fájlnév-szûrôket. A szûrôket vesszôvel kell elválasztani. |
| ASSOCTYPE | típusnév | A futtatott programmal asszociált fájltípusokat állítja be. |
| EXENAME | fájlnév | Beállítja a futtatott programot. |
| MAXIMIZED | YES | A program maximalizált ablakban indul el. |
| MINIMIZED | YES | A program minimalizált ablakban indul el. |
| NOAUTOCLOSE | YES | Az ablak akkor is nyitva marad, ha a program futása már befejezôdött. |
| NO | A program futása után az ablak automatikusan bezáródik. | |
| PARAMETERS | paraméterek | A program paraméterlistája. |
| PROGTYPE | ENH | Enhanced Win-OS/2 szekció teljes képernyôben. |
| ENHSEMLESSVDM | Elkülönített, enhanced módú képernyôs Win-OS/2 szekció. | |
| ENHSEAMLESSCOMMON | Közösen futó, enhanced módú Win-OS/2 szekció. | |
| FULLSCREEN | Teljesképernyôs OS/2 szekció. | |
| PM | Grafikus OS/2 szekció. | |
| SEPARATEWIN | Elkülönített, ablakban futó Win-OS/2 szekció. | |
| STD | Standard módú, teljesképernyôs Win-OS/2 szekció. | |
| STDSEAMLESSVDM | Standard módú, ablakban futó Win-OS/2 szekció. | |
| STDENHSEAMLESSCOMM | Standard módú, közösen futó ablakos Win-OS/2 szekció. | |
| VDM | Teljesképernyôs DOS szekció. | |
| WIN | Teljesképernyôs Win-OS/2 szekció. | |
| WINDOWABLEVIO | Ablakos OS/2 szekció. | |
| WINDOWEDVDM | Ablakos DOS szekció. | |
| WINDOWEDWIN | Ablakos Win-OS/2 szekció. | |
| SET | változó=érték | Környezeti változók értékének beállítása. |
| STARTUPDIR | elérési útvonal | Beállítja a program mûködési könyvtárát. |
Látható, hogy a program típusának meghatározására nagyon sok kulcs létezik. Szerencsére nem muszáj ôket használni, mivel a Munkaasztal automatikusan meghatározza a program típusát, amikor az objektumot létrehozzuk. Végezetül lássunk egy példát egy programobjektum létrehozására:
/* Programobjektum létrehozása */
CALL RxFuncADD 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
CALL SysLoadFuncs
rc = SysCreateObject('WPProgram', 'Szövegszerkesztô', '<WP_DESKTOP>', 'EXENAME=c:\os2\e.exe;STARTUPDIR=e:\', 'R')
EXIT
REXX GYÍK:
K1. Mi történik, amikor egy már létezô objektumazonosítót akarunk egy új objektumnak megadni?
V1. Elvileg a WPS-nek meg kell tagadnia az új objektum létrehozását. Az OS/2 régebbi változataiban azonban volt egy hiba, amely következtében az objektum mégis elkészült. Hogy biztosak legyünk abban, hogy nem létezô azonosítót használunk, saját objektumaink készítésekor érdemes elkerülni a WP_ kezdetû azonosítókat, mivel azokat a WPS használja.
K2. Letöröltem a Gyorsindítót. Hogyan szerezhetem vissza?
V2. Futtasd le az alábbi programot:
/* Gyorsindító készítése */
CALL RxFuncAdd 'SysLoadFuncs', 'REXXUTIL', 'SysLoadFuncs'
CALL SysLoadFuncs
rc = SysCreateObject('WPLaunchPad','LaunchPad','<WP_DESKTOP>')
EXIT
Gyakorlatok:
1. Készítsen egy programot, amelyik elkészíti a REXX információs könyv árnyékát a Munkaasztalon!
2. Készítsen egy programot, amely megtölti a szintén saját készítésû gyûtôt az összes, a gépen található ikon (*.ico) fájl objektumával!
| Kádár Zsolt 1998. 09. 27. | [ Elôzô lecke | Következô lecke | Tartalom ] |