Bevezetô
Láttuk, hogy a VX-REXX és a VisPro/REXX nagyon hasonló módon oldotta meg a vizuális programozást. Bár a VX-REXX nagyon korán elterjedt, és még a mai napig kvázi szabványnak is számít ezen a területen, a támogatás megszûnése miatt és a 2000. év után esetlegesen felmerülô problémák miatt használata nem javasolt. Tapasztalt VX-REXX programozóknak elsôsorban a VisPro/REXX-et lehet ajánlani a nagyon hasonló mûködés és könnyû áttérés miatt. Ha valaki viszont még csak most kezdi a vizuális REXX programozást, akkor annak érdemes megfontolni, hogy nem-e inkább a GPF (Graphical Programming Facility) REXX-szel ismerkedik meg behatóbban. A GPF REXX kissé nehezebben tanulható, mint a másik kettô, ugyanakkor viszont nagyon jó fejlesztôkörnyezet, amelyet a mai napig támogatnak, s 2000-állósága is garantált. Számtalan példaprogramot is mellékelnek hozzá. Az internetrôl szabadon letölthetô próbaverziója (5Mb) gyakorlatilag korlátozásmentes, ami nem igazán mondható el a másik két termékrôl. Ismerkedjünk meg tehát ebben a leckében a Jean-Bernard Clerin által fejlesztett GPF REXX-szel, amelynek a cikk írásának pillanatában elérhetô legfrissebb verziója az 1.2c volt.
Ismerkedés a GPF REXX-szel
Mint ahogy azt az elôzô két fejlesztôkörnyezet esetében már megtanultuk, minden fejlesztés egy új project elkészítésével kezdôdik. Pontosan így van ez a GPF REXX estében is. Itt azonban nem áll rendelkezésünkre ledobható project minta, hanem a GpfRexx Interface Builder ikonjára kell klikkantani, s az új projectet (ami tulajdonképpen egyetlen fájl) a fejlesztôkörnyezet File -> New menüpont kiválasztásával lehet létrehozni. Minden új project létrehozásakor ki kell tölteni egy dialógusablakot, amelyben a project tulajdonságait adjuk meg. A legfontosabb paraméter az Appl Name, amely az alkalmazás (EXE fájl) nevét szabja meg. A Tasklist Title mezôben azt a szöveget adhatjuk meg, amely az OS/2 folyamatlistájában jelenik meg az alkalmazás futtatásakor. A Builder rádiógombokkal azt is megszabhatjuk, hogy a készítendô alkalmazás teljesen önállóan (self-contained), vagy csak futtató-DLL-lel legyen használható. A MainWindow az alkalmazás fôablakának nevét állítja be. A project létrehozásakor ez a mezô természetesen még üres. A dialógus közepén hatalmas betûkkel megjelenô DBM Not Installed üzenet csak annyit jelent, hogy a GpfRexx nem talált DB2-t a gépünkön, ami valószínûleg így is van. Hacsak nem akarunk adatbázis-kezelô alkalmazást írni, akkor ezzel nem is kell foglalkoznunk. Ha végeztünk a dialógus kitöltésével, akkor klikkantsunk az OK gombra, és már elénk is tárul a fejlesztôkörnyezet.

A környezet bal oldalán található rajztábla jelképezi az alkalmazás fôablakát. Figyeljük meg, hogy a File és Help menüpontok automatikusan elkészültek a project létrehozásakor. Amikor az egérrel a menü felé tévedünk, akkor a keresztszerû mutató átalakul egy kézzé. Ez csak annyit jelent, hogy a menüpontok szerkeszthetôek. A jobb oldalon találhatóak az építkezéshez használható, elôre definiált objektumok. A rajztábla és az objektumgyûjtemény természetesen elmozgathatóak és átméretezhetôek. Ha el akarjuk menteni a munkánkat, akkor a File -> Save (as) menüpontot kell használni. A GPF projectek .OCR kiterjesztésû fájlokban kerülnek eltárolásra.
Klikkantsunk duplán a rajztáblára! Egy dialógusablak fog elôbukkanni, amelyben a rajztáblával (helyesebben az éppen szerkesztett ablakobjektummal) kapcsolatos beállításokat (az ablak neve, címsorának szövege, színe, ikonja, stb.) lehet megadni. Mint láthatjuk, nagyon sokféle dolgot lehet itt szabályozni. Az elôbb említett paramétereken kívül még az is nagyon fontos, hogy a dialógus alján található Action gombbal lehet eseményeket beállítani, amelyek bekövetkezésekor aztán a szintén itt beállított kódrészlet lefut. Minden, a GpfRexx-ben létrehozott objektumhoz tartozik egy hasonló dialógus. A paraméterek részletes leírását megtaláljuk a termékhez mellékelt Reference könyvben.

Klikkantsunk a menüsorra! Ennek hatására a menüszerkesztô fog elôbukkanni, amely már tartalmazza a project létrehozásakor automatikusan elkészített alap menüstruktúrát. Ha a + jelekre klikkantunk, akkor megjelennek az elôre definiált almenüpontok is. Vegyük észre, hogy a VX-REXX menüszerkesztôjéhez hasonlóan itt is a ~ jel szolgál a gyorsbillentyûk definiálására. A dialógusablak alján találhatjuk azokat a nyomógombokat, amelyekkel a menüt tovább alakíthatjuk. A View/Modify szolgál egy már meglévô menüpont átalakítására. Az Add Sybling gombbal az éppen kiválasztott menüponttal megegyezô hierarchiai szintû új menüpontot lehet létrehozni. Az Add Children szolgál az almenük elkészítésére.

Próbáljuk meg futtatni az eddig létrehozott alkalmazást! A futtatásra két mód is van a GpfRexx-ben. A Toolkit -> Test menüpontok segítségével ún. csökkentett tesztüzemmódba kapcsolhatunk, amikor is kipróbálhatjuk a már létrehozott objektumokat, menüket. Ebben a módban a fejlesztôkörnyezet menüpontjai a Toolkit kivételével deaktivizálódnak, s csak akkor lesznek újra elérhetôek, ha a Toolkit -> Test választással a tesztüzemmódot megszüntetjük. A másik módszer a Toolkit -> Debugger választással érhetô el. Ebben a tesztmódban a fejlesztôkörnyezet teljesen eltûnik (csakúgy, mint a VX-REXX-nél), s az alkalmazás összes funkciója kipróbálható. A menüpont kiválasztásakor automatikusan elinduló segédeszközök segítségével a hibakeresés is megoldott. Az alkalmazás bezárása után a debuggert is be kell zárni, különben a fejlesztôkörnyezet nem aktivizálódik. Elôfordulhat, hogy a rajztábla nem jelenik meg a fejlesztôkörnyezet elôbukkanása után automatikusan. Ilyenkor a Window menübôl válasszuk ki a szerkeszteni kívánt ablakot.
Ugyancsak a Toolkit menüben találjuk a Builder opciót, amellyel külön vagy futtatókönyvtár jelenlétében használható EXE fájlt készíthetünk. Kicsit furcsa, hogy az EXE fájl elkészítése után automatikusan "kilépünk" a projectbôl, ezért a generálás elôtt érdemes felvenni a változtatásokat. Erre a fejlesztôkörnyezet egyébként automatikusan rá is kérdez.
Ismét egy példaprogram
Akik az elôzô leckéket is olvasták, már valószínûleg gyanítják, hogy az elôzô bekezdésben leírtakkal titokban egy példaprogramot készítettünk elô. Nos ez valóban így is van. Ebben a bekezdésben egy olyan példaprogramot fogunk elkészíteni, amely egy számológép-kezdeménynek is felfogható. A célünk az lesz, hogy a program a beviteli mezôkben megadott számokat gombnyomásra összeadja.
Fogjunk is hozzá a munkához! Töltsük be az elôzôekben készített programkezdeményt, és helyezzünk el egy beviteli mezôt (Create -> Entry Field...) a rajztábla jobb felsô részében! Az elôbukkanó dialógusablakban állítsuk át a Text Styles tulajdonságot Right Aligned-ra, hiszen egy valamirevaló számológépnél a bevitt számok a beviteli mezô jobb oldalához igazítva jelennek meg! Jegyezzük meg az objektum nevét (Name) és bökjünk az OK gombra! Hasonló módon hozzunk létre egy másik beviteli mezôt az elsô alatt! Helyezzünk el egy statikus szövegmezôt (Create -> Static -> Text...) a rajztábla bal felsô részében! Az elôbukkanó dialógusablakban javítsuk ki a szövegmezô (Text) tartalmát Végeredmény:-re és ellenôrizzük, hogy a Horz és Vert Options rádiógomboknál a Centered opció van-e kiválasztva! Bökjünk az OK-ra! Hozzunk létre ugyanilyen beállításokkal egy másik szövegmezôt az elsô alatt. A Text mezôbe viszont ebben az esetben egy 0-t írjunk. Jegyezzük meg mindkét szövegmezô azonosítóját (a Name mezô tartalma)! Már csak egyetlen objektum hiányzik, a nyomógomb. Válasszuk ki a Create, Button, Push Button... menüpontokat és helyezzünk el egy nyomógombot a rajztábla aljára. A gombra írt szöveget (Text) változtassuk meg ™sszeadra, majd bökjünk ismét csak az OK-ra! Teszteljük a létrehozott felületet a Toolkit -> Test opciójával. Ha mindent jól csináltunk, akkor körülbelül az alábbi kép tárul a szemünk elé, és már tudunk például a beviteli mezôbe írni:

A következô lépés az események lekezeléséhez szükséges kód megírása és az objektumokhoz való hozzárendelése. A GPF REXX környezetben nem áll rendelkezésünkre a drag and drop programozási technika, azonban mint látni fogjuk, e nélkül is elég jól el fogunk boldogulni. Elôször is készítsünk egy szûrôfüggvényt, amelyik szûrni fogja a beviteli mezôbe begépelt adatokat. Számológép esetében ugyanis fontos, hogy csak számokat fogadjunk el bemeneti adatként. Válasszuk az Object menübôl a User Function Object almenüt! Az elôbukkanó dialógusban látni fogjuk, hogy már létezik néhány függvény, amelyek automatikusan jött létre a project létrehozásakor. Bökjünk az Add... gombra! Ennek hatására egy újabb ablak fog elôtûnni, amelyben megadhatjuk a szûrô mûködését. Írjuk be a Name mezôbe a függvény neveként azt, hogy Filter1, s gépeljük be a mezô alatt található területre a következô kódrészletet:
s = QueryText('EntryField1');
Col = VERIFY(s, '0123456789');
IF Col > 0 THEN DO
s = DELSTR(s, Col, 1);
SetText('EntryField1');
END
A kód elsô sora kiolvassa az elsô beviteli mezô tartalmát a QuertText GPF REXX függvény segítségével. A kiolvasott karakterlánc karaktereit ellenôriztetjük a szintén GPF REXX VERIFY függvénnyel, s a nem kívánatos karaktereket eltávolítjuk a karakterláncból a következô DO END ciklus folyamán. A megtisztított karakterláncot vissza is írjuk a beviteli mezôbe a SetText utasítással. Bökjünk az OK gombra, és csodáljuk meg a listában feltûnô saját gyártmányú Filter1 függvényt! Hozzunk létre egy ugyanilyen függvényt a második beviteli mezô számára! A függvény neve legyen Filter2, s a kódban hivatkozzunk a második beviteli mezô nevére (EntryField2).
A következô lépés az összeadáshoz szükséges függvény elkészítése. Klikkantsunk újra az Add gombra, s a függvény neveként adjuk meg, hogy Osszead. Végrehajtandó kódként gépeljük be a következô sorokat:
Result = QueryText('EntryField1') + QueryText('EntryField2');
SetText('StaticText1', Result);
Ha ezzel megvagyunk, akkor mentsük el a függvényt az OK gombra történô klikkantással! Ezzel a lépéssel elkészítettük az összes függvényt, amelyre szükségünk van az összeadáshoz. Fogadjuk el a változtatásokat az OK gombbal, és a rendeljük hozzá a megfelelô objektumokhoz a megfelelô kódrészleteket! Elôször is klikkantsunk a felsô beviteli mezôre! A megjelenô dialógusablak alján válasszuk az Action... gombot, amelynek hatására egy újabb dialógus, az Action On ablak fog megjelenni. Az elôre definiált események listájából jelöljük ki a Change Data sort és bökjünk az Add... gombra! Újabb ablak fog elôtûnni, amelynek elsô oszlopának alján a rengeteg elôre definiált függvény mellett megtaláljuk a User Function sort, amely kiválasztása esetén a dialógus jobb oldalán feltûnô oszlopban megtaláljuk az általunk készített rutinokat is. Válasszuk a ki Filter1 függvényt és az OK gombok megnyomásával zárjuk be az ablakokat! Ismételjük meg a mûveletsort a második beviteli mezôvel is, arra viszont ügyeljünk, hogy a Filter2 függvényt rendeljük a Change Data eseményhez!

Most már csak a nyomógombot kell ellátni a megfelelô kódrészlettel. Klikkantsunk is rá és az Action..., Click (Button), Add... útvonalon jussunk el az Action List dialógushoz. A User Function kiválasztásával adjuk meg az Osszead függvényt, s az OK gombokkal mentsük el a változtatásokat. Ezzel most már elvileg készen is vagyunk. Futtassuk a példaprogramot a Toolkit -> Debugger opcióval! Amennyiben mindent rendben végrehajtottunk, az alkalmazás az ™sszead gomb megnyomására szépen össze fogja adni a beviteli mezôben megadott számokat.

Az alkalmazás tökéletesítése
A Toolkit -> Builder opció segítségével készítsünk EXE fájlt a programból. Amennyiben a project definiálásakor a Builder opciónál a DLL RunTime gombot jelöltük meg, akkor az EXE más gépen történô futtatásához a GPFRRT01.DLL-re is szükség lesz. Sajnos a dokumentáció nem említi, hogy melyik DLL a RunTime DLL. Ha viszont az EXE-t pl. File Commanderrel indítjuk, akkor az a fentebb említett DLL-t fogja hiányolni.
A program tesztelésekor már észrevehettük, hogy az indításkor elôször egy logóval ellátott dialógusablak jelenik meg, amelyet kis késleltetéssel követ a valódi felület. Ez egy nagyon tipikus jellemzôje a GPF REXX-szel készített programoknak. A logó ablak a többihez hasonlóan kedvünkre formálható, ehhez csak ki kell választani a Window menübôl a DialogBoxLogo ablakot, s máris szabadon garázdálkodhatunk.
Ikonokkal vagy bitmap képekkel is feldíszíthetjük alkalmazásainkat. Mielôtt azonban ezeket az elemeket programunkban felhasználhatnánk, regisztrálnunk kell ôket ikon vagy bitmap objektumként. Válasszuk a fômenübôl az Object -> Icon/Bitmap/Pointer Object... funkciót, majd a megjelenô dialógusablakban bökjünk az Add Object nyomógombra! Az ennek eredményeként feltûnô újabb dialógusban adjuk meg az ikonobjektum nevét (Name mezô), majd az alsó ablakban navigáljunk el a felhasználni kívánt ikonhoz. A példaprogramban a GPFREXX\BITMAP könyvtárban található számológépikont (CALCUL.ICO) választottam ki. Az OK gombok szorgalmas nyomogatásával mentsük el a változtatásokat! A fômenübôl válasszuk a Create, Static, Icon opciókat és az ikonná változott egérmutatóval hozzunk létre egy ikont a logó ablakon! Ennek hatására az ikon tulajdonságait beállító ablak fog elôbukkanni. Az Icon/Bitmap mezôben válasszuk ki az elôzôleg definiált számológép ikonobjektumot, s bökjünk az OK gombra. Ha mindent jól csináltunk, akkor a számológép ikonja fog feltûnni a logó ablakában.
Az elôre definiált objektumok alapértelmezett tulajdonságait megváltoztathatjuk saját készítésû Presentation Objektumok (Object -> Presentation Object...) felhasználásával. Ha kiválasztjuk ezt a menüpontot, akkor egy dialógusablak fog megjelenni, amelyben felfedezhetjük az elôre definiált objektumok. Az Add... gomb megnyomásával hozzunk létre egy új objektumot, amellyel ebben az esetben az eredmény kijelzésére felhasznált szövegmezô tulajdonságait fogjuk megváltoztatni. A gombnyomásra elôtûnô újabb ablakban adjuk meg az objektum nevét (pl. PresParamsSajat), állítsuk be a font típusát (9.WarpSans Bold), s változtassuk meg a használt színeket. Valahogy úgy, ahogyan az alábbi ábrán is látható:

Az OK gombok megnyomásával mentsük el a változtatásokat, majd klikkantsunk a rajztáblán (fôablakon) az eredményt megjelenítô szövegmezôre! Az elôbukkanó ablakban állítsuk be a Presentation mezôt az elôbb létrehozott PresParamsSajatra, majd zárjuk be az ablakot az OK gombbal! Figyeljük meg, hogy a szövegmezô tulajdonságai megváltoztak a Presentation objektumunk beállításainak megfelelôen.
Nagyon könnyen készíthetünk segítséget a GPF REXX-ben írt alkalmazásokhoz. Minden objektum rendelkezik ugyanis egy helppanellel, amely a tulajdonságokat megszabó dialógusablak alján található EntryHelp... gombbal aktivizálható. Az itt megadott információból a GPF REXX teljesen automatikusan komplett segítségrendszert generál az alkalmazás elkészítésekor. Amennyiben az ablak alján található Information Message mezôt is kitöltjük, akkor az alkalmazás alján megjelenô üzenetsorban az itt megadott szöveg fog megjelenni, amikor az egérmutató a kérdéses objektum fölött tartózkodik. Adjunk meg a példaalkalmazásban található beviteli mezôknek, a nyomógombnak, valamint az eredményt kijelzô mezônek ilyen magyarázó szöveget! Ahhoz, hogy a funkciót aktivizáljuk, az információs szövegek megadásán kívül az is kell, hogy a fôablak tulajdonságait beállító dialógusban engedélyezzük a stílusok (Choose Styles) között található Information Msg jelölônégyzetet is.
REXX GYÍK:
K1. Hogyan tudom megadni, hogy az alkalmazás elindulásakor bizonyos inicializációs kód fusson le?
V1. Erre való az elôre definiált InitializeAppl felhasználói függvény, amely alapesetben a REXX segédfüggvényeket tölti be. Ezen függvény átírásával tetszôleges kódot futtathatunk le. A párja, az EndOfAppl az alkalmazás bezárásakor fut le. A felhasználói függvények listáját megkapjuk, ha az Options, Show WorkPlace, User Function Objects útvonalat követjük.
K2. Lehet-e szálakat használni a GPF REXX-ben?
V2. Természetesen. Ha például egy új ablakot hozunk létre (Create -> Window/Dialog), akkor az automatikusan megjelenô tulajdonságablak jobb felsô részében megtalálható lesz a szál neve, amelyben a létrehozott ablakot akarjuk futtatni. Alapesetben az egész alkalmazás a MainTask nevû szálként fut, ám igény esetén csak meg kell adni az új szál nevét, s a fejlesztôkörnyezet rendezi az új szál futtatásához szükséges részleteket. Ha a segítségben keresünk a thread szóra, akkor láthatjuk, hogy rengeteg függvény van, amelyekkel a szálakat lehet manipulálni.
Gyakorlatok:
1. Bôvítse ki a példaalkalmazást további mûveletekkel!
2. Érje el, hogy a példaalkalmazásban az összes menüpont mûködjön!
| Kádár Zsolt 1999. 11. 14. | [ Elôzô lecke | Tartalom ] |