|
Der erste Teil des Workshops enthielt das obligatorische »Hallo Welt«-Programm ebenso wie einen CD-Abspieler und ein Skript, das mit Hilfe von YAM ein E-Mail-Fenster öffnet.
In dieser Ausgabe geht es um »Exchange-1«, ein ARexx-Skript, mit dem es möglich ist, einzelne Commodities zu steuern. Wie bei ARexx so üblich, machen wir das natürlich nicht alles selbst. Das Skript greift auf die aus dem letzten Teil bereits bekannte RexxMustHave-Bibliothek zurück, um die Dialogfenster anzuzeigen. Andererseits spricht es direkt den ARexx-Port des Exchange-Programms an, um Commodities fernzusteuern.
Exchange bietet erst ab AmigaOS 3.5 einen ARexx-Port. Deshalb benötigt auch das Beispielskript AmigaOS 3.5 oder höher. Es geht hier um ein einfaches Beispiel, anhand dessen sich die speziellen Eigenschaften der Rexx-Programmierung auf dem Amiga gut erläutern lassen.
|
Der Workshop geht dabei besonders auf die Nutzung von Funktionsbibliotheken, das Senden von Befehlen und auf Anfragen an laufende Programme über ARexx-Ports ein. Etwas Programmierverständnis setzt dieser Workshop voraus. Es wird nicht erklärt, was eine Schleife ist oder wie eine Wenn-Dann-Abfrage funktioniert.
Externe
Funktionen aufrufen
Es gibt, wie bereits im letzten Teil des Workshops gezeigt, zwei grundlegende
Möglichkeiten, externe Funktionen aufzurufen. Einerseits können Sie
vom ARexx-Skript aus eine ARexx-Bibliothek öffnen und deren Funktionen
verwenden, andererseits können Sie an den ARexx-Port eines laufenden Programm
Befehle senden.
Im ersteren Fall müssen Sie die gewünschte Bibliothek ARexx mit Hilfe der Funktion addlib bekannt machen. Mit Hilfe dieses Befehls fügen Sie eine Funktionsbibliothek oder einen Funktions-Host in die vom residenten ARexx-Prozess verwaltete Bibliotheksliste ein. Das ist der Prozess, den Sie mit dem Befehl RexxMast in der User-Startup-Datei oder von der WBStartup-Schublade aus starten, damit Sie ARexx überhaupt verwenden können.
Von nun an ist die Bibliothek verfügbar, auch wenn Sie von ARexx noch
nicht sofort geöffnet wird. Die Funktionen der Bibliothek können nun
von jedem ARexx-Skript verwendet werden. Bevor das Skript addlib ausführt,
stellt es fest, ob ARexx die Bibliothek nicht bereits bekannt ist. Dazu dient
die Funktion show, die neben Informationen über Bibliotheken auch Informationen
über die zur Zeit geöffneten Dateien (»FILES«), die zur
Zeit ansprechbaren ARexx-Ports (»PORTS«) und die zur Zeit definierten
ARexx-Clips (»CLIP«) zurückliefern kann. Mit Hilfe der Tilde,
»~», vor der Show-Funktion fragen Sie dabei gezielt den Fall ab,
dass die show-Funktion die Bibliothek nicht finden konnte.
|
Wenn Sie jedoch einen ARexx-Befehl an einen ARexx-Port schicken, kann es Sinn machen, sicherzustellen, dass das entsprechende Programm auch läuft. Sie können aus einem ARexx-Skript nur die Ports bereits laufender Programme ansprechen. Das Skript verwendet dazu gleich wieder die show()-Funktion. Diesmal jedoch, um zu überprüfen, ob der Port EXCHANGE.1 bereits verfügbar ist. Beachten Sie beim Programmieren immer die Groß- und Kleinschreibung des Portnamens!
Wenn es nicht läuft, dann wird Exchange kurzerhand gestartet. Dazu schaut
das Skript zunächst einmal an zwei bekannten Orten nach Exchange und wenn
es dort nicht aufzufinden ist, nimmt es einfach »Exchange« als Befehlsaufruf
und hofft, dass sich das Programm im AmigaDOS-Suchpfad befinden wird. Mit address
command wird nun direkt AmigaDOS angesprochen und Exchange gestartet. command
ist dabei ein ARexx-interner ARexx-Port, der alles, was man an ihn schickt,
als Shell-Befehl ausführt. So kann man auch sehr praktisch komfortable
Shell-Skripte schreiben, ohne dabei auf den Komfort von ARexx zu verzichten.
Mit address können auch andere ARexx-Ports angesprochen werden.
Das ist ein wichtiger Unterschied zu den Bibliotheken: Die Funktionen einer
Bibliothek sind nach dem Öffnen sofort in allen
ARexx-Skripten verfügbar. Öffnen Sie mehrere Bibliotheken, sind alle
deren Funktionen aufrufbar. Hier kann es dann sogar zu Konflikten bei den Namen
kommen, weshalb viele Bibliotheken anbieten, dem Funktionsnamen bei Bedarf ein
(hoffentlich) eindeutiges Kürzel voranzustellen. So können Sie die
Funktion EasyRequest() der RexxMustHave-Bibliothek beispielsweise auch als RMH_EasyRequest()
aufrufen, um Verwechslungen zu vermeiden. Anders als bei den Bibliotheken kann
ein ARexx-Skript immer nur einen ARexx-Port ansprechen. Nur die Befehle des
Programmes, das diesen ARexx-Port anbietet, sind dann aufrufbar. Wollen Sie
einem anderen Programm Befehle zuschicken, müssen Sie vorher mit address
den ARexx-Port wechseln. Dieser bleibt dann so lange der Standard-ARexx-Port,
bis Sie wieder den ARexx-Port wechseln.
address command <AmigaDOS-Befehl>
ist nun eine Kurzform, um einen ARexx-Port anzusprechen und nur einen einzigen Befehl an diesen zu schicken. Dabei wird der gerade aktive Standard- ARexx-Port nicht geändert.
Nachdem nun via AmigaDOS Exchange gestartet wurde, wird per AmigaDOS-Befehl
WaitForPort auf den Port EXCHANGE.1 gewartet. Da Exchange in der Regel sehr
schnell startet, wird WaitForPort nicht lange warten müssen. Da »WaitForPort«
nur etwa fünf Sekunden wartet und es passieren kann, dass Exchange nicht
gestartet werden konnte, fragt das Skript noch einmal ab, ob nun der ARexx-Port
von Exchange verfügbar ist. Kann der Port nicht gefunden werden, bricht
das Skript mit einer Fehlermeldung ab.
|
Bei umfangreichen Programmen kann es länger dauern, bis das Programm gestartet
wird. Wie man auch solche Programme zuverlässig startet, sehen Sie in unserem
E-Mail-Skript aus dem ersten Teil dieses Workshops. In diesem Beispiel hat sich
ein Fehler eingeschlichen: WaitForPort sollte natürlich nicht auf den Port
ArtEffect, sondern auf den Port YAM warten.
Rückgabewerte
Ob Sie nun eine Bibliotheks-Funktion aufrufen oder einen Befehl an einen ARexx-Port
senden - in beiden Fällen können Sie grundsätzlich auch eine
Antwort erhalten: Eine Funktion einer ARexx-Bibliothek kann dem Skript einen
Rückgabewert zurückgeben. Als Beispiel hierfür sei der Aufruf
der Funktion EasyRequest() der rmh.library, z.B. in Zeile 30, genannt. Dort
wird der Variablen res1 der Rückgabewert der EasyRequest()-Funktion zugewiesen.
Mit Hilfe dieses Wertes teilt die Funktion dem Skript mit, welchen Schalter
der Benutzer mit seinem Mausklick ausgewählt hat. Auch, wenn Sie einen
Befehl an den ARexx-Port eines Programmes schicken, können Sie eine Antwort
erhalten. Ein Beispiel dafür ist der Befehl list, den das Skript an das
Programm Exchange sendet, um eine Liste der aktuell laufenden Commodities zu
erhalten.
Wenn Sie einen Befehl an einen ARexx-Port senden, wird das Ergebnis üblicherweise in der ARexx-Variablen result gespeichert. Um das Ergebnis des Aufrufs nicht zu verlieren, speichert das ARexx-Skript den Inhalt der result-Variable gleich in die Variable commodities zwischen. Die result-Variable würde beim nächsten Aufruf eines Befehls oder Funktion mit Rückgabewert überschrieben und wäre verloren.
Damit das Übergeben von Ergebnissen via result-Variable auch funktioniert,
muss dieser Mechanismus explizit eingeschaltet werden. Dies geschieht bereits
ganz am Anfang des Skriptes mit Hilfe des options-Befehls. Alle bisherigen Beispiele
im Workshop verwenden options results nicht. Es war bislang auch nicht nötig:
Rückgabewerte von Bibliotheks-Funktionen erhält man ohnehin und das
E-Mail-Skript war nicht unbedingt auf Rückgabewerte von YAM angewiesen.
Wenn Sie einmal überlegen, ob bei ihrem Skript options results notwendig
ist oder nicht: Schreiben Sie es hinein, schaden kann es nicht. Sie benötigen
es immer, wenn Sie einen Befehl an einen ARexx-Port senden und in der result-Variable
ein Ergebnis erwarten.
Die Oberfläche
Die Oberfläche des Exchange-Nachbaus ist ganz einfach gehalten und baut
auf einfachen EasyRequest-Dialogfenstern auf, wie bereits in dem letzten Workshop-Teil
vorgestellt. In einer der nächsten Ausgaben wird der Aufbau und das Ansteuern
einer komplexeren Oberfläche per ARexx beschrieben. Die Abfrage der Oberfläche
und das Ausführen der ausgewählten Aktion für das ausgewählte
Commodity spielen sich innerhalb der »do forever«-Schleife ab. »do
forever« steht für eine Endlosschleife, die man jedoch innerhalb
der Schleife mit dem Befehl leave verlassen kann. Das Skript stellt nacheinander
zwei Dialogfenster dar: Im ersten kann der Benutzer das Commodity auswählen,
im zweiten angeben, was mit dem Commodity geschehen soll.
Damit der erste EasyRequester bei vielen aktiven Commodities nicht zu breit für den Bildschirm wird, werden maximal fünf Commodity-Namen gleichzeitig angezeigt. Dazu wird zunächst eine komplette Liste aller Commodities von Exchange angefordert. Die Anweisung
list "|"
gibt dabei die Namen aller gerade laufenden Commodities voneinander getrennt mit »|« in einem String zurück. Für die leichtere Handhabung trägt das ARexx-Skript die einzelnen Commodity-Namen in einzelne Variablen von commodities.1 über commodities.2 bis commidities.n ein. offset definiert dann noch, ab welchem Eintrag die in der Variable anzeigen enthaltenden Daten einblendet werden.
Nun kommt die nächste Schleife mit do forever, in der das Commodity-Auswahlfenster erzeugt wird. Es werden 5 Einträge in die Variable commodities geschrieben und dann vorne ein Schalter »<<« zum Zurückblättern und hinten ein Schalter »>>« zum Vorwärtsblättern und ein Schalter zum Beenden des Skriptes eingefügt.
Dann wird das Dialogfenster angezeigt. res1 enthält den Rückgabewert
von EasyRequest, der angibt, welcher Schalter gewählt wurde. Mit Hilfe
des select-Konstruktes führt das ARexx-Skript für jeden Schalter die
passende Aktion aus. 0 ist dabei immer der rechte Schalter, in diesem Fall Ende.
Alle anderen Schalter werden von 1 an durchnummeriert. 1 ist also Vorwärtsblättern,
2+anzeigen, also 2 plus die Anzahl der angezeigten Commodities, dann Rückwärtsblättern
und alles dazwischen sind die einzelnen Commodity-Einträge. Diese werden
mit otherwise do abgefangen. Anhand von offset und dem Ergebnis
res1 errechnet das Skript den tatsächlichen gewählten Commodity-Eintrag.
Danach verlässt es mit leave die innere Endlosschleife für das Commodity-Auswahlfenster.
Was soll
ich tun, Meister?
Nun fehlt nur noch die Auswahl, was mit dem gewählten Commodity zu geschehen
hat. Dem ist die folgende Schleife (do forever) gewidmet). Zunächst stellt
das Skript mit dem Exchange-Befehl hasgui fest, ob das ausgewählte Commodity
über eine Oberfläche verfügt.
Anhand des Ergebnisses wird entweder ein Menü mit 6 oder mit 4 Einträgen erstellt und dann angezeigt. Nur, wenn das Commodity eine Oberfläche hat, werden die beiden Auswahlmöglichkeiten Anzeigen und Verbergen angezeigt. Ansonsten bietet das Menü noch Aktivieren und Deaktivieren. Mit Auswahl kehrt man zum Auswahlfenster zurück und Ende beendet das Skript.
Wieder dient ein select-Konstrukt, um die Nummer des gewählten Schalters
zu ermitteln und die passende Aktion durchzuführen. 0 beendet das Skript.
1 ist der Wert für Auswahl, er verlässt die innere »do forever«-Schleife,
um das Auswahlfenster zu zeigen.
Die folgenden Abfragen sind abhängig davon, ob das Commodity eine Oberfläche
hat oder nicht. Anzeigen, Verbergen, Aktivieren oder Deaktivieren werden ausgeführt,
indem einfach der entsprechende ARexx-Befehl an Exchange gesendet wird. showgui
zeigt die Oberfläche eines Commodities an, hidegui versteckt sie wieder.
activate aktiviert ein Commodity und deactivate deaktiviert es wieder. Informationen
über diese und weitere Befehle von Exchange finden Sie im AmigaOS 3.9-Buch
([1]).
Anzeigen und Verbergen kennen noch einen Spezialfall: das Anzeigen von Verbergen der Oberfläche von Exchange selbst. Exchange weigert sich nämlich standhaft, seine Oberfläche durch showgui oder hidegui steuern zu lassen. Es geht aber dennoch und zwar indem man den Befehl uniconify oder iconify direkt an Exchange sendet.
Auf solche Schwierigkeiten stößt man als ARexx-Programmierer immer mal wieder. Manchmal verhält sich das betreffende Programm einfach nicht so wie erwartet und/oder dokumentiert. Da hilft dann nur ausprobieren. Man könnte auch noch die Aktion Entfernen in das Skript einbauen. Entfernen beendet ein Commodity. Das geht in der Regel, indem man den Befehl QUIT an den ARexx-Port des betreffenden Commodities sendet. Doch muss man dazu den Namen des ARexx-Portes des Commodities erst einmal kennen.
Bei den System-Commodities ist dies der Programmname plus .1. .1 gibt an, dass es sich um die erste laufende Kopie des Commodities handelt. Da die meisten Commodities sowieso nur einmal gestartet werden können, ist diese Angabe eigentlich nicht notwendig. Bei anderen Commodities hilft oft nur Raten, wenn es um den Portnamen geht. Wissen Sie eine elegante und einfache Lösung für dieses Problem? Dann schreiben Sie sie der Redaktion.
Nun kennen Sie den grundlegenden Aufbau eines ARexx-Skriptes, das eine Funktionsbibliothek anspricht und Befehle an einen ARexx-Port sendet sowie auf Rückgabewerte reagiert. Sie können dieses Wissen bereits zum Ausgangspunkt für das Programmieren eigener ARexx-Skripte verwenden. Die ARexx-Befehle eines Programms sind ebenso wie der ARexx-Portname in der Regel in dessen Dokumentation erläutert. Haben Sie ein interessantes Skript entwickelt, oder haben Sie Ideen für weitere Teile des ARexx-Workshops? Teilen Sie sie uns mit.
lb
Literatur:
[1] AmigaOS 3.9 - Das Buch, Haage&Partner, WWW: http://www.haage-partner.com
© 2002 All Rights Reserved. Alle Rechte vorbehalten Franzis'
Verlag GmbH Kommentare, Fragen, Korrekturen und Kritik bitte an Webmaster
AMIGA schicken.
Zuletzt aktualisiert am 28.10.2002.