III. Objektumok létrehozása a Munkaasztalon

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:
WPColorPaletteA színpaletta osztálya.
WPFolderA gyûjtôk osztálya.
WPFontPaletteA fontpaletta osztálya.
WPProgramA programobjektumok osztálya
WPSchemePaletteA színsémák osztálya
WPShadowAz á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:
CCVIEWDEFAULTA rendszer konkurens-nézet beállítása érvényes.
YESAz objektum megnyitásakor mindig új nézet keletkezik.
NOAmikor az objektumot megnyitják, minden addigi nézete frissítôdik.
HELPLIBRARYfájlnévBeállítja a segítség könyvtárat a fájlnév alapján.
HELPPANELidAz objektum alapértelmezés szerinti segítség paneljét állítja be az id alapján.
HIDEBUTTONYESAz objektum rendelkezik az elrejtô gombbal.
NOAz objektum minimalizáló gombbal rendelkezik.
ICONFILEfájlnévBeállítja az objektum ikonját a fájlnév alapján.
ICONPOSx,yBeállítja az objektum gyûjtôn belüli koordinátáit.
ICONRESOURCEid, dllBeállítja az objektum ikonját a DLL-en belüli id alapján.
MINWINHIDEAz objektum rejtetté válik minimalizálás után.
VIEWERAz objektum a Zsugorítottablak-megjelenítôbe kerül minimalizálás után.
DESKTOPAz objektum a Munkaasztalra kerül minimalizálás után.
NOCOPYYESAz objektum nem másolható.
NOAz objektum másolható.
NODELETEYESAz objektum nem törölhetô.
NOAz objektum törölhetô.
NODRAGYESAz objektum nem vontatható.
NOAz objektum vontatható.
NODROPYESAz objektumra nem lehet ráejteni más objektumot.
NOAz objektumra lehet más objektumot ejteni.
NOLINKYESAz objektumról nem lehet árnyékot készíteni.
NOAz objektumról lehet árnyékot készíteni.
NOMOVEYESAz objektum nem mozgatható.
NOAz objektum mozgatható.
NOPRINTYESAz objektum nem nyomtatható.
NOAz objektum nyomtatható.
NORENAMEYESAz objektum nem nevezhetô át.
NOAz objektum átnevezhetô.
NOSHADOWYESAz objektumról nem lehet árnyékot készíteni.
NOAz objektumról lehet árnyékot készíteni.
NOTVISIBLEYESAz objektum nem látható.
NOAz objektum látható.
OBJECTIDazonosítóBeállítja az objektum azonosítóját. A rendszeren belül egyedinek kell lennie!
OPENSETTINGSKinyitja a Beállítások jegyzettömböt az objektum elkészítése után.
DEFAULTAz objektum default nézetét nyitja meg az elôállítás után.
SETTINGSYESMeg lehet változtatni a beállításokat.
NONem lehet a beállításokat megváltoztatni.
TEMPLATEYESAz objektum minta.
NOAz objektum nem lehet minta.
TITLEcímBeá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:
BACKGROUNDfájlnévA 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.
DETAILSFONTfontméret.névA részletes nézet fontméretét állítja be.
DETAILSVIEWs1[,s2,...]A részletes nézet stílusát állítja be
NORMALNormális méretû ikonok.
MINIMiniatûr ikonok.
INVISIBLEAz ikonok nem jelennek meg.
ICONFOlistingsNTfontméret.névAz ikonnézet fontméretét állítja be.
ICNVIEWs1[,s2,...]Az ikonnézet stílusát állítja be.
FLOWEDLebegô nézet.
NONFLOWEDNem lebegô nézet.
NONGRIDNem rácspontos.
NORMALNormális méretû ikonok.
MINIMiniatûr ikonok.
INVISIBLEAz ikonok nem jelennek meg.
ICONVIEWPOSx1, y1, x2, y2Beállítja az ikon koordinátáit.
OPENICONMegnyitja a gyûjtôt ikonnézetben.
TREEMegnyitja a gyûjtôt fa nézetben.
DETAILSMegnyitja a gyûjtôt részletes nézetben.
TREEFONTfontméret.névMegadja a fa nézet fontméretét.
TREEVIEWs1[,s2,...]Beállítja a fa nézet stílusát.
NORMALNormális méretû ikonok.
MINIKis méretû ikonok.
INVISIBLENem láthatóak az ikonok.
LINESVonalakkal jeleníti meg a fát.
NOLINESVonalak nélkül jeleníti meg a fát.
WORKAREAYESA gyûjtôt munkaterületté jelöli ki.
NOA 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:
ASSOCFILTERfá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.
ASSOCTYPEtípusnévA futtatott programmal asszociált fájltípusokat állítja be.
EXENAMEfájlnévBeállítja a futtatott programot.
MAXIMIZEDYESA program maximalizált ablakban indul el.
MINIMIZEDYESA program minimalizált ablakban indul el.
NOAUTOCLOSEYESAz ablak akkor is nyitva marad, ha a program futása már befejezôdött.
NOA program futása után az ablak automatikusan bezáródik.
PARAMETERSparaméterekA program paraméterlistája.
PROGTYPEENHEnhanced Win-OS/2 szekció teljes képernyôben.
ENHSEMLESSVDMElkülönített, enhanced módú képernyôs Win-OS/2 szekció.
ENHSEAMLESSCOMMONKözösen futó, enhanced módú Win-OS/2 szekció.
FULLSCREENTeljesképernyôs OS/2 szekció.
PMGrafikus OS/2 szekció.
SEPARATEWINElkülönített, ablakban futó Win-OS/2 szekció.
STDStandard módú, teljesképernyôs Win-OS/2 szekció.
STDSEAMLESSVDMStandard módú, ablakban futó Win-OS/2 szekció.
STDENHSEAMLESSCOMMStandard módú, közösen futó ablakos Win-OS/2 szekció.
VDMTeljesképernyôs DOS szekció.
WINTeljesképernyôs Win-OS/2 szekció.
WINDOWABLEVIOAblakos OS/2 szekció.
WINDOWEDVDMAblakos DOS szekció.
WINDOWEDWINAblakos Win-OS/2 szekció.
SETváltozó=értékKörnyezeti változók értékének beállítása.
STARTUPDIRelérési útvonalBeá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 ]