AMIGA-Magazin · Ausgabe 11/02 · Programmierung: ARexx-Workshop (Teil 2)

Aktuelles Heft 11/02

Schritt für Schritt

Artikelübersicht
Externe Funktionen aufrufen
Rückgabewerte
Die Oberfläche
Was soll ich tun, Meister?
Der zweite Teil des ARexx-Workshops ist für Neueinsteiger und Fortgeschrittene gleichermaßen interessant: Es geht um ein Exchange-ähnliches Programm zum Steuern von Commodities, komplett in ARexx geschrieben und Zeile für Zeile erklärt.

von Martin Steigerwald

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.

 

Original: Dies ist das Vorbild für unser einfaches Beispielskript zur Steuerung von Commodities per Arexx

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.

Nachbau: Dies ist ja auch schon ganz nett. Einfach das gewünschte Commodity anklicken, und dann geht's los.

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.

Oberfläche: Die passende Aktion für das betreffende Commodity kann man nun auswählen.


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


Hauptseite © 2002 All Rights Reserved. Alle Rechte vorbehalten Franzis' Verlag GmbH
Veröffentlichung und Vervielfältigung nur mit schriftlicher Genehmigung des Verlags

Kommentare, Fragen, Korrekturen und Kritik bitte an Webmaster AMIGA schicken.
Zuletzt aktualisiert am 28.10.2002.