VAREXX, czyli jak zrobiê rzecz niemoûliwâ :)

1. VAREXX, Z CZYM TO SIË JE?

Cóû jest owâ niemoûliwâ rzeczâ z tytuîu? A próbowaliôcie kiedyô stworzyê i uûywaê GUI z poziomu Rexxa? Owszem, biblioteki takie jak apig.library (pozwalajâca uûywaê funkcji bibliotecznych Intuition i Graphics) i rexxarplib.library pozwalaîy na tworzenie wîasnych GUI, jednakûe czynnoôê ta byîa mozolna, a prëdkoôê (choêby odôwieûania okienka) - ûaîosna. Tu mamy do czynienia z zupeînie odmiennâ sytuacjâ - okienka rysujâ sië tak szybko, jak na to system pozwala, zaô proces ich edycji jest wyjâtkowo prosty, poniewaû wykorzystywane sâ pliki #?.gui tworzone przez GadToolsBoxa. Program nie ma wielkich wymagaï, wystarcza mu system 2.04+, korzysta z arexxport.library, która jest dostarczana razem z pakietem, oczywiôcie musi byê uruchomiony serwer rexxa, niezbëdne jest takûe posiadanie biblioteki rexxsupport.library, która jest dostarczana razem z systemem. Przydaje sië teû rexxreqtools.library (i - co oczywiste - reqtools.library). Instalacja przebiega szybko i sprawnie. Wywoîanie programu najwygodniej wstawiê do user-startup; varexx sam odsyîa siebie w tîo, zatem niepotrzebne jest uûywanie run. Skîadnia jest nastëpujâca:

Varexx <ôcieûka do plików #?.gui>

Ôcieûka ta okreôla miejsce, gdzie znajdujâ sië pliki z definicjami okien, np.:

Varexx REXX:gui/

Oprócz tego dostarczany jest program VXC, który - per analogiam do RXC - sîuûy do zakoïczenia pracy serwera.

VAREXX jest dla naszych skryptów serwerem usîug, co oznacza, ûe - poprzez tworzone przez siebie porty - udostëpnia naszemu skryptowi rexxowemu moûliwoôê uûywania i manipulowania róûnymi GUI. W pracy z VAREXX-em sâ zwykle uûywane co najmniej trzy porty: podstawowy port serwera, nazywajâcy sië (zawsze) VAREXX (rozpoznaje on trzy rozkazy - load, quit i version); stworzony wczeôniej przez uûytkownika port, do którego bëdâ przychodziê komunikaty o stanie naszego okienka (sâ to zarówno komunikaty dotyczâce stanu gadûetów, jak i IDCMP) oraz stworzony przez serwer port o unikalnej nazwie (zwykle VAREXX.n, gdzie n jest kolejnâ liczbâ), do którego z kolei wysyîane bëdâ rozkazy dotyczâce stworzonego przez nas okienka - takie jak np. pokazanie okna na ekranie, odczytanie stanu gadûetu, zmiana jego nazwy... Aby moûna byîo operowaê portami, niezbëdne jest uûycie rexxsupport.library.

2. Jak to wszystko wyglâda w praktyce?

2.1 Rozkazy portu VAREXX

Pierwszy uûywany port, VAREXX, rozpoznaje trzy polecenia:

load PLIK/A, PORT/A, EKRAN_PUBLICZNY/K
îaduje ono plik z definicjami okien do pamiëci. Nazwa portu, który VAREXX otwiera dla nas zawarta jest w RESULT. Nazwa ta jest nam niezbëdnie potrzebna, gdyû do tego portu naleûy wysyîaê rozkazy dla okienka opisane w dalszej czëôci

quit
powoduje zakoïczenie pracy serwera - jego efekt jest identyczny z wydaniem polecenia VXC (ûeby byê ôcisîym: VXC wysyîa do serwera komendë quit)

version
w RESULT zwraca wersjë serwera - przydatne, jeôli uûywa sië nowszych wersji VAREXX-a (do tego potrzebne nam jest options results)

2.2 Wysyîanie poleceï dla okien.

Po zaîadowaniu pliku #?.gui trzeba odwoîaê sië do portu, który otworzyî dla nas VAREXX; moûna wtedy wydawaê polecenia naszemu oknu. Tu mamy do wyboru kilkanaôcie rozkazów: Show, Hide, Window, Busy, Set, Settext, Setnum, Setcheck, Setbar, Setlist, Read, Spawn, Setlabel, Activate i Readcoords; wszystkie z nich pokrótce omówië.

show NAZWA_OKNA
Pokazuje okno na ekranie (rozkaz load nie robi tego); nazwa okna jest tâ nazwâ, która zostaîa nadana podczas edycji w GadToolsBoxie.

hide UNLOAD/S
Powoduje ukrycie okna. Opcja UNLOAD powoduje schowanie okna i zwolnienie pamiëci przez nie zajmowanej. Po uûyciu hide z opcjâ UNLOAD nie moûna odczytywaê ûadnych informacji z okna.

window ZIP/S, FRONT/S, BACK/S, ACTIVATE/S, X/N/K, Y/N/K
Rozkaz ten zmienia stan okna. Opcja ZIP daje taki sam efekt, jakby wcisnëîo sië gadûet zmiany wielkoôci okna na górnej ramce. FRONT wysuwa okno do przodu, BACK chowa okno do tyîu za pozostaîe okna. ACTIVATE aktywuje je. Podanie wspóîrzëdnych powoduje zmianë poîoûenia górnego lewego rogu okna.

busy SET/S
Uûycie opcji SET powoduje zmianë wskaúnika myszy na "wskaúnik zajëtoôci", co uniemoûliwia dokonywania jakichkolwiek zmian w oknie. Wykonanie samego "busy" przywraca normalny wskaúnik myszki i odblokowuje okienko.

set ETYKIETA/M/A, ENABLE/S, DISABLE/S
Wîâcza/wyîâcza podany gadûet. Moûna podaê listë gadûetów; wszystkie zostanâ objëte tym poleceniem.

settext ETYKIETA/A, CIÂG/F
Przekazuje podany ciâg do gadûetu. Moûna uûywaê z gadûetami typu STRING i TEXT (STRING_KIND i TEXT_KIND). Zmienia tekst w obu typach.

setnum ETYKIETA/A, LICZBA/N
Przekazuje liczbë do podanego gadûetu. Ustawia wartoôê gadûetów typu NUMBER i INTEGER. Wybiera opcjë dla gadûetów typu MX i CYCLE (trzeba pamiëtaê, ûe opcje w tych gadûetach numerowane sâ od zera). Ustawia pozycjë gadûëtów typu SCROLLER i SLIDER.

setcheck ETYKIETA/A, CHECK/S
Ustawia gadûet typu CHECK - opcja CHECK wîâcza gadûet, brak opcji wyîâcza.

setbar ETYKIETA/A, MIN=VISIBLE/N/K, MAX=TOTAL/N/K
Dla gadûetów typu SLIDER ustawia maksymalne i minimalne wartoôci, dla gadûetu typu SCROLLER - maksymalne wartoôci i liczbë czëôci reprezentowanych przez gadûet.

setlabel ETYKIETA/A, TEXT/M, CYCLE/S, SCREEN/S, WINDOW/S
Setlabel umoûliwia zmianë tekstów w oknie. Dziaîa na wiele róûnych sposobów. Dla wszystkich gadûetów oprócz MX umoûliwia zmianë etykiety gadûetu przy pomocy 'setlabel STARA_ETYKIETA NOWA_ETYKIETA' (dziaîa to tylko wtedy, gdy okno nie jest otwarte na ekranie, czyli przed uûyciem 'show' lub po zastosowaniu 'hide' bez opcji UNLOAD).

W gadûetach MX moûna zmieniaê tekst i iloôê opcji:

setlabel ETYKIETA OPCJA_1 OPCJA_2 ... OPCJA_N

Wymaga to zamkniëtego okna. Podkreôlenie ('_') jest uûywane do wskazania shortcutu wywoîujâcego opcjë. (np. setlabel gad21 '_Anne' '_Marie' '_Catherine')

W gadûetach CYCLE opcje zawarte przez gadûet mogâ byê zmieniane z uûyciem opcji cycle:

setlabel ETYKIETA cycle OPCJA_1 OPCJA_2 ... OPCJA_N

Dziaîa to zawsze, nie zwaûajâc, czy okno jest otwarte, czy nie.

Jeôli podane sâ opcje WINDOW lub SCREEN, polecenie zmienia nazwë okna (tâ, która ukazuje sië na jego belce) lub tytuî ekranu. Dziaîa niezaleûnie od tego, czy okno jest otwarte, czy nie.

W gadûetach typu BUTTON moûna zmieniê tekst znajdujâcy sië na przycisku; wymagane jest, aby okno byîo zamkniëte.

setlist ETYKIETA/A, CLEAR/S, DEL/S, SELECT/K, STEM/K, ELEMENT/K, UPDATE/N/K
Uûywane w odniesieniu do gadûetów typu LISTVIEW. Skîadnia jest nieco skomplikowana, ale pozwala na peînâ kontrolë takiego gadûetu.

CLEAR kasuje zawartoôê gadûetu.

DEL powoduje usuniëcie jednego elementu z listy; skîadnia: setlist gadûet DEL element

SELECT wyróûnia podany element. Skîadnia: setlist gadûet SELECT element

UPDATE powoduje zmianë zawartoôci okreôlonego elementu. Skîadnia: setlist gadûet UPDATE=numer 'wartoôê'.

Zaîóûmy, ûe mamy nastëpujâcâ zmiennâ zîoûonâ:

zmienna.COUNT = 2
zmienna.1 = 'Marek Antoniusz'
zmienna.2 = 'Oktawian August'
zmienna.SELECT = 2

w takiej sytuacji

setlist gadûet CLEAR 'Marek Antoniusz' 'Oktawian August' SELECT
'Oktawian August'

jest równowaûne

setlist gadûet CLEAR STEM zmienna

poniewaû uûycie opcji STEM powoduje odczytanie zmiennej zîoûonej o podanej nazwie. Zmienna taka musi skîadaê sië z pól o nazwach nazwa.1 .. nazwa.n i dwóch dodatkowych pól, nazwa.SELECT, wskazujâcej na pole wyróûnione i nazwa.COUNT, informujâcej VAREXX o iloôci elementów w liôcie.

Opcji UPDATE i SELECT moûna uûyê jednoczeônie, wtedy podany numer zostanie zaznaczony na liôcie. Jeôli nie podano zmiennej zîoûonej lub tekstu, nie spowoduje to tylko wybranie elementu o podanym numerze, podanie jako argumentu czegokolwiek podmienia element o podanym numerze i zaznacza go. Z powodu sposobu, w jaki VAREXX analizuje linië úródîowâ, trzeba podaê pusty ciâg po opcji SELECT. Nastëpujâca komenda wybierze element numer 3:

setlist gadûet SELECT s UPDATE=3

ta zaô zamieni element numer 3 i zaznaczy go:

setlist gadûet SELECT s UPDATE=3 'nowy element'

read ETYKIETA/A, ZMIENNA, NUMBER/S
Umoûliwia na odczytanie stanu gadûetu. Stan ten dostëpny jest w zmiennej RESULT. Jeôli odczytywany jest gadûet listview i podano nazwë zmiennej, umoûliwia to odczytanie caîej listy do zmiennej zîoûonej; przy czym uûywane sâ takie elementy nazwy, jak w przypadku opcji STEM rozkazu setlist.

Opcja NUMBER zwraca numer elementu na liôcie (w przypadku gadûetu listview); numer ten dostëpny jest w zmiennej RESULT.

Zaîóûmy, ûe w gadûecie typu listview o nazwie "gadûet" znajdujâ sië cztery elementy: 'kot', 'pies', 'Ala', 'chomik'

po wykonaniu:

read gadûet nasza_zmienna
otrzymamy nastëpujâcy wynik:

nasza_zmienna.COUNT = 4
nasza_zmienna.1 = 'kot'
nasza_zmienna.2 = 'pies'
nasza_zmienna.3 = 'Ala'
nasza_zmienna.4 = 'chomik'
nasza_zmienna.SELECT = 1

Jeôli ûaden element nie jest wyróûniony, nasza_zmienna.SELECT = 0.

spawn NAZWA_PORTU/A, EKRAN_PUBLICZNY/K
Umoûliwia otwarcie wiëcej niû jednego okna z projektu w tej samej chwili. (A wiemy, ûe w GadToolsBoxie moûna dla jednego projektu stworzyê wiele okien) Dziaîa tak samo jak komenda load, poza tym, ûe nie îaduje nowego pliku #?.gui. Klonuje ona definicje okien juû zaîadowane. Zwraca adres nowego portu VAREXX.nn jako RESULT. EKRAN_PUBLICZNY okreôla ekran na którym ma byê otwarte okienko.

activate ETYKIETA/A
aktywuje gadûet STRING lub INTEGER; umoûliwia to wprowadzenie danych do gadûetu.

readcoords RDZEÏ/A
zapisuje wspóîrzëdne aktualnie otwartego okna do zmiennej zîoûonej o podanym rdzeniu; np.: 'readcoords coords' powoduje, ûe wspóîrzëdne x i y zostanâ zapisane odpowiednio w coords.x i coords.y.

2.3 Odbieranie komunikatów z okien

W ten sposób moûemy wydawaê rozkazy naszemu okienku. Jak odebraê informacje o tym, co sië w nim dzieje? Do tego sîuûy port, który sami otwieramy, ten sam, którego nazwë podajemy przy îadowaniu pliku z definicjami lub przy uûyciu rozkazu spawn. Do tego portu nadsyîane sâ komunikaty o zdarzeniach zachodzâcych w otwartym przez nas oknie (lub oknach, jeôli otworzyliômy wiëcej, niû jedno). Informacja zaleûna jest od rodzaju gadûetu.

Wciôniëcie gadûetu zamykania okna powoduje wysîanie komunikatu "CLOSEWINDOW";

Jeôli zostaîy ustawione odpowiednie znaczniki IDCMP, mogâ byê odbierane nastëpujâce komunikaty:

Jeôli okno zostaîo otwarte przy pomocy komendy spawn, to komunikaty dla CLOSEWINDOW, ACTIVEWINDOW, INACTIVEWINDOW, DISKREMOVED, DISKINSERTED, NEWSIZE i CHANGEWINDOW bëdâ skîadaî sië z nazwy komunikatu IDCMP i nazwy okna, dla którego nastëpuje odczyt tego komunikatu (np. okno nr 2 w projekcie nazywa sië "rabarbar", komunikat o tym, ûe uûytkownik wcisnâî gadûet CLOSE bëdzie wyglâdaî "CLOSEWINDOW rabarbar"

Jeôli podczas edycji GUI zostaî ustawiony znacznik IDCMP_VANILLAKEY, to przyciôniëcie jakiegoô klawisza niezajëtego przez shortcut powoduje wygenerowanie komunikatu, skîadajâcego sië ze sîowa KEYBOARD i przyciôniëtego klawisza, np. "KEYBOARD k". Inne klawisze okreôlone sâ przez: ESC, TAB, BS (backspace), DELETE, HELP, RETURN, UP, DOWN, LEFT, RIGHT, F1..F10, np. "KEYBOARD ESC"


(baran@sun10.ci.pwr.wroc.pl)