II. VREXX

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:
1OK'OK'
2Cancel'CANCEL'
3OK és Cancel'OK' vagy 'CANCEL'
4Yes'YES'
5No'NO'
6Yes é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()NincsNincs
A VREXX verziószámának lekérdezése: VGetVersion()NincsA VREXX verziószáma
A VREXX függvények inicializálása: VInit()NincsERROR, 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ójaNincs
VOpenWindow-val megnyitott ablak bezárása: VCloseWindow(id)id = az ablak azonosítójaNincs
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ínNincs
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ímsoraNincs
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ípusaOK, 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 %-banNincs
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 úttalOK 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, TIMEBIOK 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éterOK, 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ípusaOK, 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éterOK, CANCEL, YES vagy NO
Beviteli dialógus több elem beviteléhez: VMultBox(cím, infó, szélesség, elrejt, adat, gombokcí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éterOK, 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éterOK, 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ílusaOK, 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ámaNincs
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övegNincs
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éreteNincs

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 ]