Bevezetés
Kezdjük is rögtön egy olyan programozási "környezettel", amely teljesen kilóg a többi környezet közül. Az elôször 1992-ben kibocsátott VREXX termék ugyanis az elôzô leckében taglalt vizuális környezetjellemzôk közül szinte egyiknek sem tesz eleget. A VREXX ugyanis tulajdonképpen nem más, mint egy közönséges bôvítô DLL, amely segítségével a REXX programok használhatják a grafikus (PM) függvények egy részét. A szó szoros értelmében tehát szó sincs vizuális programozási környezetrôl (hacsak a REXX program szerkesztésére használt editort nem tekintjük annak :-). A VREXX-nek tehát inkább a bôvítômodulokról szóló elôzô tanfolyamban lett volna a helye. Hogy miért szerepel akkor mégis itt? Ennek inkább történelmi okai vannak. A VREXX csomag volt ugyanis az elsô olyan REXX bôvítés, amely segítségével lehetôség nyílt a grafikus objektumok használatára, s valószínûleg ezért is kapta a V(isual)REXX nevet. Késôbb aztán az objektum orientált programozás elterjedésével a Visual fogalom gyökeresen átdefinálódott, s így állt elô ez a mostani faramuci helyzet. Felejtsük tehát el egy kis idôre az elôzô leckében leírtakat és ismerkedjünk meg a VREXX bôvítôcsomag által nyújtott függvényekkel, amelyek segítségével klasszikus REXX-ben írt programjainkat pillanatok alatt grafikus kezelôfelülettel láthatjuk el. Sajnos a VREXX-szel készített grafikák nem éppen a legszebbek, ám ezért bôségesen kárpótol az egyszerû és gyors használat.
Telepítés
A VREXX ingyenes, és az interneten több helyen is megtalálható. Az én példányom a DevCon CD-rôl származik. A tömörítve mindössze 180Kb-ra rúgó csomagban a kibontás után többek között megtaláljuk a DEVBASE és VREXX DLL-eket, amelyeket be kell másolni a LIBPATH-ba. Az ugyancsak a csomag részét képezô VREXX.EXE fájlt pedig be kell másolni egy, a PATH-ban található könyvtárba. Amennyiben hordozni akarjuk programunkat más gépekre, akkor a fentebb említett három fájlt is mellékelni kell. A VREXX.EXE programnak különleges szerepe van. Ahhoz, hogy egy klasszikus REXX program használni tudja az OS/2 beépített grafikus funkcióit, a DLL-ekben található bôvítôfüggvényeken kívül szükség van egy ún. "árnyékablakra" is, amely létrehozza a REXX program által kért ablakokat és közvetíti az üzeneteket (events). Ezt a célt szolgálja a VREXX.EXE, amely a bôvítôfüggvények betöltésekor automatikusan elindul és a háttérben meghúzódva teszi a dolgát. Ha valaki megpróbálja kézzel elindítani, akkor jobb híján megjeleníti a VREXX.INF fájlban található dokumentációt.
Használat
Az elôzô tanfolyam során tanultak alapján már mindenki tudja, hogy a bôvítôfüggvényeket regisztrálni kell a program elején ahhoz, hogy használni is tudjuk ôket. Mivel a grafikus elemeket használó függvények sokkal több erôforrást foglalnak le, mint egyéb függvények, ezért fontos, hogy a program végén, vagy egy esetleges hibás végrehajtást követô kilépés esetén a függvényeket kitakarítsuk a memóriából. Ellenkezô esetben ugyanis néhány programindítással már ki is meríthetjük gépünk erôforrásait. Gyakorlatilag minden VREXX programra használható az alábbi programfelépítés:
/* A VREXX bôvítôfüggvények inicializálása. */
Call RxFuncAdd 'VInit', 'VREXX', 'VINIT'
initcode = VInit()
IF initcode = 'ERROR' THEN SIGNAL CLEANUP
/* Figyeljük, hogy a program futása nem szakad-e */
/* meg valamilyen váratlan esemény miatt. */
SIGNAL ON FAILURE name CLEANUP
SIGNAL ON HALT name CLEANUP
SIGNAL ON SYNTAX name CLEANUP
/* Ide jön a tulajdonképpeni (V)REXX program. */
/* ... */
/* A tulajdonképpeni program vége. */
/* A VREXX függvények kitakarítása a memóriából */
/* és a lefoglalt erôforrások felszabadítása. */
CLEANUP:
Call VExit
EXIT
A program elején a szokott módon töltjük be a VREXX bôvítôfüggvényeket. Amennyiben nem sikeres a betöltés, vagy a program futása például szintaktikai hiba miatt váratlanul megszakad, akkor a SIGNAL kezdetû soroknak köszönhetôen az esetleg már lefoglalt erôforrásokat felszabadítjuk a CLEANUP eljárással. Amennyiben minden jól megy, akkor kezdhetjük a tulajdonképpeni program végrehajtását. A kód végén a már említett CLEANUP eljárás kerül meghívásra.
A VREXX függvények
A VREXX által rendelkezésre bocsátott függvényeket négy csoportba sorolhatjuk: ablak függvények, dialógus függvények, grafikus függvények és egyéb függvények. Az egyéb függvények (VInit, VExit, VGetVersion) kivételével a többi függvény tulajdonképpen a hagyományos REXX kiviteli és beviteli függvényeinek grafikus helyettesítésére szolgál. Mielôtt belevágnánk a függvények ismertetésébe, vegyünk sorra néhány általános érvényû tudnivalót. A VREXX programok soros végrehajtásúak. Ez azt jelenti, hogy a REXX interpreter sorban hajtja végre a programban megadott parancsokat. Amikor egy grafikus objektumot hozunk létre, akkor az objektummal pontosan úgy dolgozhatunk, mint minden más grafikus objektummal (minimalizálhatjuk, átméretezhetjük, elmozgathatjuk, stb.). Az objektumok létrehozásakor a függvények egy speciális azonosítót adnak vissza, amelyek segítségével a függvények másik részének késôbb megadhatjuk, hogy melyik objektumot akarjuk manipulálni. Egyszerre több grafikus objektumot is létrehozhatunk, ám dialógus ablakból egyszerre csak egy lehet használatban. Az ablakokon belüli grafikus koordináták 0 és 1000 közötti értékeket vehetnek fel. Az origó a bal alsó sarokban van. Az objektumok elhelyezkedését a Munkaasztalon százalékokkal kell megadni. Ha például a képernyô közepén egy ablakot akarunk megjeleníteni, amely a képernyô felét tölti ki, akkor a bal alsó sarokpontnak 25,25-öt, a jobb felsônek pedig 75,75-öt kell megadni. A dialógusfüggvények többsége összetett változókkal dolgozik. A 0. elem az elemek számát, a többi pedig a bevinni kívánt adatokat tartalmazza. Mindegyik dialógusfüggvény igényli a button paramétert is, amely a nyomógombok számát és fajtáját határozza meg:
| Érték: | Gombok fajtája: | Visszatérési érték: |
| 1 | OK | 'OK' |
| 2 | Cancel | 'CANCEL' |
| 3 | OK és Cancel | 'OK' vagy 'CANCEL' |
| 4 | Yes | 'YES' |
| 5 | No | 'NO' |
| 6 | Yes és No | 'YES' vagy 'NO' |
A dialógusablakok másik jellegzetessége, hogy a visszaadandó karakterláncot a stem.vstring változóban tárolják el. Pl. a Call VInputBox 'Példa', str, 1 hívás visszatérése után a felhasználó által a beviteli dialógusablakba beírt szöveget az str.vstring összetett változó fogja tartalmazni. Ezek után pedig lássuk a függvényeket, amelyeket összefoglaltunk az alábbi táblázatban:
| Funkció és szintakszis: | Paraméterek: | Visszatérési érték: |
| A lefoglalt erôforrások felszabadítása: VExit() | Nincs | Nincs |
| A VREXX verziószámának lekérdezése: VGetVersion() | Nincs | A VREXX verziószáma |
| A VREXX függvények inicializálása: VInit() | Nincs | ERROR, ha nem sikerült a végrehajtás |
| Ablak háttérszínének beállítása: VBackColor(id, szín) | id = az ablak azonosítója, szín = a kívánt szín (BLACK, WHITE, RED, GREEN, BLUE, CYAN, YELLOW, PINK) | Nincs |
| Ablak tartalmának törlése: VClearWindow(id) | id = az ablak azonosítója | Nincs |
| VOpenWindow-val megnyitott ablak bezárása: VCloseWindow(id) | id = az ablak azonosítója | Nincs |
| Ablak rajzolási színének a beállítása: VForeColor(id, szín) | id = az ablak azonosítója, szín = a kívánt rajzolási szín | Nincs |
| Ablak létrehozása: VOpenWindow(címsor, szín, stem) | címsor = az ablak címsorának szövege, szín = az ablak háttérszíne, stem = az ablak pozícióját és méreteit meghatározó összetett változó neve (négy paraméterbôl áll: stem.left, stem.right, stem.bottom, stem.top, az értékeket %-ban kell megadni, 0..100-ig terjedhetnek) | Az ablakazonosító (egyedi egész szám) |
| Ablak átméretezése: VResize(id, stem) | id = az ablak azonosítója, stem = az ablak új pozícióját meghatározó összetett változó | Nincs |
| Az ablak címsorának beállítása: VSetTitle(id, cím) | id = az ablak azonosítója, cím = az ablak címsora | Nincs |
| Dialógusablak létrehozása több elem listából történô kiválasztásához: VCheckBox(cím, stem, választás, gombok) | cím = a dialógusablak címsora, stem = a lista elemeit tartalmazó összetett változó neve (max 10 elembôl állhat, a stem.0 tartalmazza az elemek számát), választás = a választott elemeket tartalmazó összetett változó, output.0 tartalmazza a választott elemek számát, gombok = a nyomógombok száma és típusa | OK, CANCEL, YES vagy NO a gombok értékétôl függôen |
| Dialógusablak az elôtér- és háttérszínek beállításához: VColorBox(stem) | stem = az elôtér és a háttér színét tartalmazó összetett változó neve (stem.fore = elôtérszín, stem.back = háttérszín) | OK vagy CANCEL |
| Dialógusablak pozíciójának beállítása: VDialogPos(x, y) | x, y = 0 és 100 közötti egész szám, amely a dialógusablak középpontjának koordinátáját adja meg %-ban | Nincs |
| Dialógusablak fájlválasztáshoz: VFileBox(cím, minta, stem) | cím = a dialógusablak címsora, minta = a fájlválasztást leszûkítô minta (pl. *.txt), stem.vstring = a választott fájl teljes elérési úttal | OK vagy CANCEL |
| Dialógusablak fontválasztáshoz: VFontBox(stem) | stem = a választott font nevét (stem.type) és méretét (stem.size) tartalmazó összetett változó neve (lehetséges típusok: SYSTEM, SYMBOL, COUR, COURB, COURI, COURBI, HELV, HELVB, HELVI, HELVBI, TIME, TIMEB, TIMEI, TIMEBI | OK vagy CANCEL |
| Beviteli dialógusablak: VInputBox(cím, stem, szélesség, gombok) | cím = az ablak címsora, stem = a dialógusablakban megjeleníteni kívánt szövegeket tartalmazó összetett változó neve (max 10 szöveget lehet megadni, a szövegek hossza nem lehet nagyobb 80 karakternél), a stem.vstring tartalmazza a bevitt szöveget, illetve a default értéket, szélesség = a beviteli mezô karakterekben kifejezett szélessége, gombok = a nyomógombok számát és típusát meghatározó paraméter | OK, CANCEL, YES vagy NO |
| Dialógusablak egy elem listából történô választásához: VListBox(cím, stem, szélesség, magasság, gombok) | cím = az ablak címsora, stem = a megjelenítendô elemek száma és szövege, stem.vstring tartalmazza a kiválasztott elemet, szélesség = a lista karakterben kifejezett szélessége, magasság = a lista karakterekben kifejezett magassága, gombok = a nyomógombok száma és típusa | OK, CANCEL, YES vagy NO |
| zenetek megjelenítése ablakban: VMsgBox(cím, stem, gombok) | cím = az ablak címsora, stem = a megjelenítendô üzeneteket tartalmazó összetett változó neve (maximum 10, 80 karakter hosszú üzenet jeleníthetô meg), gombok = a nyomógombok számát és stílusát meghatározó paraméter | OK, CANCEL, YES vagy NO |
| Beviteli dialógus több elem beviteléhez: VMultBox(cím, infó, szélesség, elrejt, adat, gombok | cím = az ablak címsora, súgó = a beviteli mezôket magyarázó szövegeket (max 80 karakter) tartalmazó összetett változó neve (súgó.0 = elemek száma, ami maximum 10 lehet), szélesség = összetett változó, amely a beviteli mezôk szélességét tartalmazza, elrejt = összetett változó, amely 0 vagy 1 értékei adják meg, hogy egy adott mezô kitöltése közben a karakterek megjelenjenek vagy sem, adat = összetett változó, amely a bevitt adatokat tartalmazza (igény esetén elôre feltölthetô default értékekkel), gombok = a nyomógombok számát és stílusát meghatározó paraméter | OK, CANCEL, YES vagy NO |
| Elem választása rádiógombokkal ellátott listából: VRadioBox(cím, stem, gombok) | cím = az ablak címsora, stem = a rádiógombok jelentését és számát tartalmazó összetett változó neve (max 10 lehet, stem.vstring tartalmazza a kiválasztott elemet, értékét elôre megadva lehet meghatározni, hogy melyik gomb legyen kiválasztva az ablak megjelenésekor), gombok = a nyomógombok számát és stílusát meghatározó paraméter | OK, CANCEL, YES vagy NO |
| Dialógusablak táblázatokhoz: VTableBox(cím, stem, választás, szélesség, magasság, gombok) | cím = az ablak címe, stem = a táblázat elemeit és felépítését tartalmazó összetett változó neve (stem.rows = a sorok száma, stem.width = oszlopok száma, stem.label.x = az x. oszlop neve, stem.x.y = az x.y elem tartalma, sterm.vstring = a választott sor száma, a táblázat max 10 oszlopból állhat, az elemek max 80 karakter hosszúak lehetnek), választás = a dialógus megjelenítésekor kiválasztott sor száma, szélesség = a táblázat szélessége karakterekben, magasság = a táblázat magassága karakterekben, gombok = a nyomógombok száma és stílusa | OK, CANCEL, YES vagy NO |
| Körcikk rajzolása: VArc(id, x, y, sugár, szög1, szög2) | id = az ablak azonosítója, x,y = a körcikk középpontjának a koordinátái, sugár = a körcikk sugara (0..1000), szög1 = a körcikk kezdôszöge, szög2 = a körcikk végzôszöge (a 0 fok a 3 óránál van, s az óra járásával ellenkezô irányba növekszik, szögek értéke 0 és 360 közötti kell, hogy legyen, szög2-nek nagyobbnak kell lennie szög1-nél) | Nincs |
| Rajzolás: VDraw(id, típus, xstem, ystem, adatszám) | id = az ablak azonosítója, típus = a rajzolás stílusát meghatározó paraméter, lehetséges értékek: PIXEL, MARKER, LINE, POLYGON, SPLINE, xstem, ystem = a pontok koordinátáit tartalmazó összetett változók neve (értékük 0 és 1000 között változhat), adatszám = a megadott pontok száma | Nincs |
| Rajzolási jellemzôk beállítása: VDrawParms(id, markertípus, vonaltípus, kitöltés) | id = az ablak azonosítója, markertípus = a marker típusa (0..10), vonaltípus = a vonal típusa (0..6), kitöltés = a kitöltés típusa (0..5) | Nincs |
| Szöveg kiíratása: VSay(id, x, y, szöveg) | id = az ablak azonosítója, x, y = a szöveg kezdôpontjának a koordinátái (0..1000), szöveg = a megjelenítendô szöveg | Nincs |
| Fonttípus beállítása: VSetFont(id, típus, méret) | id = az ablak azonosítója, típus = a font típusa (lehetséges típusok: SYSTEM, SYMBOL, COUR, COURB, COURI, COURBI, HELV, HELVB, HELVI, HELVBI, TIME, TIMEB, TIMEI, TIMEBI), méret = a font mérete | Nincs |
Példaprogramok
Most pedig nézzünk meg egy egyszerû példaprogramot, amely néhány VREXX függvény használatát demonstrálja. A példaprogram az elôzôekben már bemutatott programvázra épül:
/* Hello world példaprogram VXREXX-ben */
/* A VREXX segédfüggvények inicializálása */
Call RxFuncAdd 'VInit', 'VREXX', 'VINIT'
initcode = VInit()
if initcode = 'ERROR' then signal CLEANUP /* nem OK */
/* Hiba esetén felszabadítjuk a lefoglalt erôforrásokat. */
signal on failure name CLEANUP
signal on halt name CLEANUP
signal on syntax name CLEANUP
/* A hello world ablak paramétereit tartalmazó összetett */
/* változó feltöltése a megfelelô értékekkel. */
position.left = 25 /* Az ablak a képernyô közepén */
position.bottom = 25 /* fog megjelenni. A paraméterek */
position.right = 75 /* százalékban vannak megadva. */
position.top = 75
/* Az ablak és a szöveg megjelenítése */
id = VOpenWindow('Az elsô VREXX ablakom', 'WHITE', position)
Call VSay id, 350, 650, 'Hello World!'
/* PopUp ablak megjelenítése */
Call VDialogPos 50, 40
msg.0 = 1
msg.1 = 'Nyomd meg az OK-t a program befejezéséhez!'
Call VMsgBox 'A példaprogram befejezése', msg, 1
/* Az ablak bezárása */
Call VCloseWindow id
/* Az erôforrások felszabadítása */
CLEANUP:
Call VExit
exit
A VREXX segédfüggvények inicializálása és a szükséges ellenôrzések után megadjuk az elsô VREXX ablakunk koordinátáit, majd pedig megjelenítjük azt. Az ablakba íratjuk kedvenc szövegünket és megjelenítünk egy második üzenetablakot, amelynek egyetlen nyomógombja (OK) van. A gombra klikkantás után bezárjuk az ablakokat és felszabadítjuk a lefoglalt erôforrásokat.
A VREXX csomagban találunk három másik példaprogramot, amelyek a fentebb felsorolt függvények mindegyikének a használatára mutatnak példát. A TESTWIN.CMD programban a PM ablakok, a TESTDLGS.CMD programban a dialógusablakok, a TESTDRAW.CMD programban pedig a grafikus dolgok kezelésére láthatunk példákat. Tanulmányozzuk ôket!
REXX GYÍK:
K1. Olvastam az interneten a VX-REXX programról. Ez ugyanaz, mint a VREXX?
V1. Nem. A VX-REXX a Watcom REXX nevének a rövidítése. A VREXX-szel ellentétben ez egy teljes értékû vizuális fejlesztôkörnyezet, amelyrôl a következô részben lesz szó!
Gyakorlat:
1. Készítsen programot felhasználói név és jelszó bekérésére! Ügyeljen arra, hogy a jelszót ne lehessen látni a begépelés közben!
| Kádár Zsolt 1999. 09. 20. | [ Elôzô lecke | Következô lecke | Tartalom ] |