Kleines Rexx Kompendium
Rexx, was ist das?
The functions, we need
Rexx Interna
Rechnen mit Rexx
Ermitteln der Größe von Ordnern
Rexx & Tabellenkalkulation
Erweiterte Datei Attribute
Arbeiten mit Ordnern
Setzen der WPS Assoziationen
Eigene Klickstartleiste
Applikationen einrichten
HTML Dokumente
In eigener Sache


 

Kleines Rexx Kompendium

oder

Wegweiser für den Gebrauch von Scripten


 
Der Anstoß zu diesem Thema kam aus dem Kölner Userclub. Dort wurde über einen Schwenk der Zielsetzung des Userclubs in Richtung LINUX nachgedacht.
 
Protest ! Dann kann ich alle meine kleinen Rexx Helferlein wegwerfen. Ist es denn nicht gerade die hohe Integration der Rexx Scriptsprache mit dem Betriebssystems, wodurch für uns OS2ler dieses Betriebssystem unersetzbar wird ? Es gibt zwar Rexx für Win* und auch für Linux, aber sicherlich nicht sooo mächtig ! Und wer will sich schon mit dem Win$Murx und den zwei unterschiedlichen Zeichencodes zwischen der Kommandozeile und der GUI-Ebene herum ärgern ?
 
Für mich ist Rexx zu einem unverzichtbaren Tool für die Datensicherung, für FTP-Kommandos, zur Aufbereitung kleinerer Texte für Staroffice, zum Hinterlegen wichtiger Zusatzinformationen zu Dateien und nicht zuletzt zur Kontrolle der Daten auf meinem System geworden.
 
Selbstverständlich habe ich sofort zugesagt so eine Abhandlung zusammenzustellen. Ich wußte damals nur nicht, auf welches Wissen ich bei den Team Kollegen aufbauen kann. Ich rechnete damit, daß das Wissen über Rexx sehr unterschiedlich ist, darum entschloß ich mich NICHT meine kleinen Helferlein vorzustellen, sondern einen Überblick über die Rexxmöglichkeiten zu liefern und allgemeine Informationen mit speziellen kleinen Beispiele bereit zu stellen.
 
Eigentlich sollte der Titel 'Wie ich lernte Rexx zu lieben' lauten, doch der Titel war bereits von einem Voice Artikel besetzt und so entschloß ich mich diesen Titel zu wählen.
 
Wenn Ihr (oder Sie) nun die vorliegenden Unterlagen gelesen habt (haben), bin ich ganz sicher, daß auch Ihr Eure Arbeisoberfläche nach Belieben gestalten könnt. Für die Nicht-OS2ler bin ich ganz sicher, daß Ihnen klarer geworden ist, welche Flexibilität das Betriebssystem zur Verfügung stellt. Es wäre schade, wenn es aus mangelndem Interesse kaputt geht, vergessen wir nicht, in einem Microsoft BS werden wir NIE so viele Feinheiten und Möglichkeiten zur Konfiguration vorfinden (!) und dennoch ist es so einfach !
 
Alle wichtigsten Scripte sind hier als Links erreichbar. Laden Sie diese Files auf Ihr System und starten Sie die. Wenn Sie jeden Ausführungsschritt verfolgen möchten, fügen Sie bitte noch den Befehl TRACE ?r als zweite Zeile in die Datei ein.
 
This document contains information on how to use REXX with Classic REXX. There are a lot of very useful functions also in Object REXX. See New REXXUTIL functions for an overview that will come later.
zurück


Rexx, was ist das?


 
REXX verwendet innerhalb einer einfachen Struktur einige leistungsstarke, vielseitig einsetzbare Funktionen, kennt die üblichen arithmetischen Funktionen und kann OS/2 Befehle ausführen. Bereits vorhandene Stapeldateien können mit wenigen Änderungen in Rexx Prozeduren umgewandelt werden. Sie werden somit auch leistungsfähiger.
 
Die Hauptanwendung von Rexx war sicherlich die Konfiguration der Präsentationsoberfläche und die Pflege anvertrauter Systeme mit möglichst wenig Aufwand, aber in der Zwischenzeit kann Rexx wesentlich mehr ! Lest mal, was IBM dazu schreibt oder schlagt diese Seite view rexx "Die OS/2 Prozedursprache 2/REXX" auf (kopiert einfach den Befehl und setzt ihn in einem OS/2 Fenster ab).
 
Ergänzen möchte ich diese IBM-Informationen mit dem Hinweis, daß man die in Rexx geschriebenen Kommandos an jeder Stelle einen TRACE einstreuen und zur Laufzeit auch wieder abschalten kann. Genau das macht die Überwachung und Kontrolle dieser Scriptsprache so leicht.
 
Der Vergleich REXX mit Basic.
Irgendwo habe ich einen Artikel gesehen, in dem Rexx mit Basic verglichen wurde. Diesen Ansatz halte ich für völlig verfehlt, denn die Unterschiede sind dermaßen gravierend, daß man nicht von gleichwertigen Möglichkeiten reden kann. Rexx ist wesentlich mächtiger.
 
Basic ist optimiert für das Anbinden von Geräten. Visual Basic ist ein Programm zur Gestaltung einer Bedienungsoberfläche, in beiden Tools müssen Systemkommandos, wenn man diese braucht, als einzelne Shell Aufrufe ausgewiesen. Mehr geht nicht !
 
Rexx dagegen ist kein selbständiges Programm, sondern es besteht, je nach Verwendungszweck, aus unterschiedlichen DLL-Modulen. Will man also Rexx nutzen, so muß ein Programm gewählt werden, das den Rexx Interpreter aktiviert. Außerdem müssen die Rexx Anweisungen in einer Datei vorliegen, der Datei Typ wird dabei vom rufenden Programm bestimmt (insofern sind die in Abschnitt 1 gemachten Angaben der IBM unvollständig) !
  • Die IBM OS/2 Shell (CMD.exe) verlangt die Datei Endung *.cmd
  • Der Commandinterpreter 4OS2.exe (JP Software) kann auch *.btm verarbeiten
  • Das Office Programm Mesa2.exe (Sundial Systems) verwendet eine *.m2 Datei
Das gestartete Programm gibt die Programmkontrolle an Rexx weiter, sofern in Zeile 1, Spalte 1 ein Rexx Kommentar /* */ gefunden wird. Zusätzlich können Anweisungen, die nur das Rexx rufende Programm versteht, mit in die Rexx Umgebung eingestreut werden. Diese Rexx fremden Anweisungen werden dann, während der Verarbeitung, dem übergeordneten Programm übergeben (ich kann also 4OS2 Kommandos übergeben, die der CMD nicht versteht bzw. Mesa/2 Kommandos einstreuen, die nur Mesa/2 selbst versteht) !
 
Resume:
Das ist nicht dasselbe wie bei Basic. Bei Basic werden Shell Aufrufe einzeln ausgewiesen, bei Rexx bleibt die Kontrolle vollständig in Rexx. Es können daher Schleifen programmiert werden und innerhalb der Schleifen einzelne Informationen ans übergeordnete Programm übergeben bzw. aus diesem abgerufen werden !
 
Außerdem habe ich nirgends eine so umfangreiche Programmbibliothek gefunden wie für Rexx ! Die hier vorgestellte Abhandlung wird das überzeugend belegen !
 
Zum Funktionsumfang:
Verwenden wir Rexx in einer *.cmd Datei, so haben wir die Funktionalität beider Tools, die von Rexx und die des CMD.exe. Dort gibt es ca. 100 Systemkommandos. Rexx kennt ca. 300 Anweisungen. Nicht gezählt alle möglichen Varianten, die mit Hilfe der Parameter gesteuert werden können. Auch ich kann diese Menge nicht vollständig im Kopf haben. Aber man muß wissen, wo man möglichst schnell etwas nachschlagen kann, dazu soll dieser Vortrag dienen.
 
Prüfen einzelner Sourcebereiche:
Auch das Programm RexxTry möchte ich an dieser Stelle erwähnen. Mit diesem Prg. lassen sich einzelne Statementfolgen sehr einfach testen, bevor man sie einbaut ! Auch so etwas kennt Basic nicht !
 
zurück


The functions, we need


 
Ich habe früher mal auf einem IBM Prozeßrechner gearbeitet, vielleicht kommt es daher, daß das erste was ich suchte, so ein Befehl wie "Suspend" war. Mit diesem Befehl kann man eine Aktion verzögert starten ohne die CPU für für andere Prozesse mit unnötigen Befehlen zu blockieren. Der richtige Tip kam von Carsten M. Er schrieb mir damals "Schau mal unter SysSleep nach" !
 
Das erste Rexx Programm
Unter einem solchen Schlagwort hätte ich das Gesuchte nie vermutet. - Das reichte, damit hatte ich meinen Zeitgeber fertig und keine Hausarbeit brannte mehr an, während ich am PC die Zeit vertrödelte. Das ist nicht zum Lachen, manche meiner WinKaos Freunde versuchen so etwas immer noch mit Rechenschleife in einer Stapeldatei (arme CPU) !
 
Testen wir den Befehl "SYSSLEEP". Einfach eine CMD Datei mit folgendem Inhalt anlegen und starten, aber Achtung, die Kommentarkennung /* */ muß in Zeile 1 mit Spalte 1 beginnen, sonst wird kein Rexx daraus ! /* */ rc = SysSleep(5*60); /* in Einheiten Sekunden */ CMDBefehl = "call C:\MMOS2\PLAY.CMD FILE=C:\MMOS2\SOUNDS\BOING.WAV" CMDBefehl exit; Bei Euch funktioniert das nicht ? Halt, da fehlte noch etwas. Etwas, was auch die Testfunktion RexxTry benötigt, um die volle Funktionalität zu entfalten. Es müssen noch die für Systemfunktionen notwendigen DLL's geladen werden. (Nachzuschlagen unter Start view rexx sysloadfuncs).
 
Die Systemfunktionen sind in der dynamische Link-Bibliothek RexxUtil hinterlegt und werden für Ein- und Ausgaben, für Systembefehle und zum Bearbeiten der OS/2 INI-Dateien benötigt. Ist dieses Util bereits im System resistent, können alle OS/2 Sitzungen darauf zugreifen.
 
Ergänzen wir diese beiden Zeilen. Das sieht dann so aus: /* */ call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'; call SysLoadFuncs; /* Die notwendige Systemfunktionen */
 
rc = SysSleep(5*60); /* in Einheiten Sekunden */ CMDBefehl = "call C:\MMOS2\PLAY.CMD FILE=C:\MMOS2\SOUNDS\BOING.WAV" CMDBefehl exit;
Und jetzt läuft es.
Ich habe bewußt keine weiteren Erklärungen dazu abgegeben. Beim Probieren müßte eigentlich klar sein, was da abläuft ! Bevor Ihr weiterlest, lest diesen Nachtrag. Eine ebenfalls nützliche SysSleep Anwendung wäre, einen Diavortrag bei gesperrter Tastatur zu starten ohne daß diese Sperre sichtbar ist. Folgende Schritte sind dazu notwendig:
 
  • Einen Diavortrag mit PMView vorzubereiten.
  • Diesen dann mit Hilfe der obigen Zeilen verzögert zu starten.
  • Das System sperren und die Verzögerungszeit abwarten.
Zeitgong, wie bei einer alten Standuhr
Ein weiteres Beispiel für die SysSleep Funktion wäre der Bau eines Chronometers. So ein Chron war mein zweites Rexx Programm. Es ist aus einem ähnlichen Grund entstanden. Dieser Chronometer wird bei mir im Systemstart als Hintergrundprozeß eingebunden. Das hat noch einen weiteren Vorteil. Es sind dann auch alle notwendigen DLL-Module im System eingebunden.
 
Dieser Link zeigt das Beispiel Pgr. Chron (Kopieren, die Zeilennummerierung entfernen, starten, läuft !)
 
zurück


Rexx Interna


 
Halt !
Nach diesem Ausflug aber erst einmal zurück zu den Grundlagen. Rexx kennt nur Strings. Jede Variable oder Konstante ist im Grunde genommen nur eine Zeichenkette. Erst zur Ausführungszeit wird geprüft, welchen Datentyp der Inhalt diese Zeichenketten hat. Das ist auch der Grund, warum manches viel einfacher funktioniert als bei Basic.
 
Wir haben nun einige Rexx Anweisungen kennen gelernt, doch damit diejenigen, die Rexx nicht kennen, nicht aufgeben, seien hier ein paar wichtige Erklärungen zur Einführung nachgereicht. Schaut mal in diesen Link: Anweisungen.
 
Arbeiten mit Dateien
Ich habe es immer als hilfreich empfunden, wenn ein Programmgerüst griffbereit vorliegt. Das will ich hier mit diesem ->Beispiel\Muster.cmd<- Musterscript<- anbieten. Es ist alles dabei was benötigt wird: Laden der CMD Aufrufparameter, Handhabung von Parametern bei Routinen, Öffnen einer Datei, Rewind, Lesen und Schreiben von Daten.
 
Arrays
Übrigens, auch Arrays sind in Rexx möglich. Viele Prozeduren geben als Ergebnis ein Array zurück, dabei werden die einzelnen Elemente einfach durchnummeriert. Eine solche Variable wird als "STEM."-Variable bezeichnet. Formal besteht eine solche Variable aus einem Namen mit einem Punkt und einer anschließenden Ziffern. Beispiel:
  • MEIN_FELD.1 MEIN_FELD.2 MEIN_FELD.3 ... MEIN_FELD.9
Das ist eine Stem Variable mit 9 Elementen, hinzu kommt das Element 0, in dem die Zahl der Elemente eingetragen wird. Bei fleißigem Gebrauch hat man schnell eine Menge Müll im Speicher, daher ist es sinnvoll dieses recht bald wieder mit drop MEIN_FELD freizugeben. Dazu ein Beispiel aus der Rexx Hilfe. Das Beispiel nennt die Zahl der DEVICE Einträge der Config.sys Stem.0 und gibt anschließend die Zeilen mit den ersten zwei Treffer in Stem.1 und Stem.2 aus. /* Suchen der DEVICE-Anweisungen in CONFIG.SYS */ rc = SysFileSearch('DEVICE', 'C:\CONFIG.SYS', Stem.) Say "Anzahl Entrys" Stem.0 Say "Erstes Vorkommen" Stem.1 Say "Zweites Vorkommen" Stem.2 drop Stem.
zurück


Rechnen mit Rexx


 
Einfaches Rechnen:
OS/2 stellt für den Test von Rexx Anweisungen das, selbst in Rexx geschriebene, Programm ->Beispiel\RexxTry.html<- RexxTry<- zur Verfügung. Prüfen wir mal, ob dieses Prg. als Taschenrechner brauchbar ist.
 
Dazu bitte ich Euch über folgende Gegebenheit nachdenken: Es kommt nicht nur in meinem Umkreis vor, daß Kollegen sich den WIN*-Taschenrechner holen, diverse Zahlenkolonnen eintippen und dann das Ganze wiederholen müssen, um ganz sicher zu gehen, daß kein Tipfehler vorliegt. Nö, das ist kein Witz, das ist Tatsache ! Ich kann da nur Kopfschütteln !
 
Zu Hause nutze ich für solche Dinge immer Rexx. Mit dem Programm RexxTry kann ich Eingaben und Ergebnisse immer gleichzeitig betrachten evtl. falsche Eingaben direkt ausbessern. REXXTRY say 23.4 + 13.5 + 51.4 + 13.4 + 23.7 + 43.4 + 24.4 Bitte beachtet, mit so einer Krücke, wie den Win* Commandinterpreter geht das Ausbessern alter Eingaben nur begrenzt. Ergo Rexx unter WIN ? Nee ! Die Vorteile eines runden Systems werden in manchen Vorstandsetagen wohl 'gewollt' nicht gesehen. Muß ich's noch deutlicher belegen ? Dann schaut genau hin!
 
Zurück zu Rexx, schlagt in der Rexx Hilfe nach unter "Variablen und arithmetische Funktionen" und, wenn es um logische Operatoren handelt, auch hier Operatoren.
 
Rexx kennt die Regel Punktrechnung geht vor Strichrechnung und kennt auch die Klammerregel: Ist also bestens als Taschenrechner geeignet. Also nehmen wir den CMD und rufen RexxTry mit dem Befehl "say" auf (jeweils als ein einzeiliges Kommando!). Anschließend können wir ein paar Werte korrigieren und erneut rechnen: REXXTRY say (3+4)/7 + 12 + 7*3 - 3*10      /* Ergebnis 4 */ REXXTRY say ( 3 = 4 )      /* Ergebnis: 0; 0 = falsch */ REXXTRY say \ ( 3 = 4 ) & ( 5 = 5 )      /* 1 = wahr */ Bearbeitet obiges mal mit dem MS Taschenrechner !
 
Hinweis
Was unter dem klassischen Rexx im RexxTry als Zeilenkommando nicht geht, ist die Bestimmung des Divisionsrestes (15 // 10) bzw. das Abschneiden der Nachkommastellen (15 % 10). Das aber ist eine Folge dessen, daß einer Rexx Script Datei für solche Fälle nicht der volle String weitergereicht wird. Will man obiges testen, muß man RexxTry ohne Parameter aufrufen oder solche Rechnungen innerhalb einer *.cmd Datei definieren. Im ORexx dagegen, wurde mir berichtet, sind diese Probleme behoben. Das Problem mit der Parameterübergabe wird nochmals weiter unten im Kapitel Erweiterte Datei Attribute behandelt.
 
Schleifen
Selbstverständlich kann jede Scriptsprache Schleifen bearbeiten. Auch unter einem einzeiligen RexxTry Aufruf ist das möglich. Die einzelnen Terms einer Anweisungen müssen zu diesem Zweck jeweils mit einem SEMI getrennt werden. Vielleicht sollte man sich dann doch generell das Semikolon am Ende einer jeden Rexx Anweisung angewöhnen. Hier ein Schleifenbeispiel für das kleine "Ein mal 8": REXXTRY do i=1 to 10; say 8*i; end; Bitte probieren. Damit sind wir bei den Schleife angelangt. Weitere Möglichkeiten sind unter =>rexx "Automatisierung sich wiederholender Funktionen" <= nach zu lesen. Hier ein Beispiel, das aufzeigt, mit welchen Mitteln man einen Schleifenschritt auslassen bzw die Schleife verlassen kann: Do i = 1 to 100 By 2; Quadrat_von_I = i * i; if Quadrat_von_I = 25 then ITERATE; /* 5 * 5 Umgehen */ if Quadrat_von_I > 81 then LEAVE; Say Quadrat_von_I; end; Ich jedenfalls finde, diese Konstruktionen sind sehr prägnant, zumal sie ohne Schachtelung auskommt !
 
  • ITERATE überspringt die nachfolgenden Aktionen,
  • LEAVE bricht die Schleife ab.
Mathematische Funktionen
Ja, auch die gehen, sofern die DLL MathLoadFuncs im System eingebunden ist. Am besten Ihr baut auch gleich diese DLL in die o.g. Chron Prozedur ein. Diese RxMathFn.DLL ist leider nicht im Standardpaket Warp 4 enthalten. Sie kann aber kostenlos bei der IBM unter dem Schlagwort Employee Written Software Programs geholt werden.
 
  • rc = RxFuncAdd("MathLoadFuncs", "RxMathFn", "MathLoadFuncs");
  • rc = MathLoadFuncs(quiet)
REXXTRY Say sqrt(81); /* Wurzel */ REXXTRY w = pi(); /* Wert von PI */ REXXTRY w = pi(); say tan(w/4); /* Tangens 45 Grad */ Noch Zweifel ?
 
Taschenrechner + hohe Rechengenauigkeit
Zu diesem Thema bekam ich von Kollegen Peter aus Dänemark ein Beispiel zugeschickt:
 
/* EVAL.CMD */ numeric digits 35; arg Param; interpret say Param; exit; /* -- */ Phantastisch, hier haben wir nun alles bei einander: einprägsames Kommando, hohe Genauigkeit und kompakte Darstellung.
 
Die Zahl 35 habe ich hier gewählt, um das im Ergebnis deutlicher darzustellen. Mit numeric digits wird die Rechengenauigkeit festgelegt, arg läd das Argument, mit interpret kann extern definierte Anweisungen ausführen. Ich habe beim dritten Term des Statements auch zuerst gestutzt. Es wird klarer, wenn man man das obige Stm so interpretiert: interpret "say " || Param; Für alle, die so wie ich auch stutzen: Say ist in diesem Fall eine mit "SAY" vorbelegte Variable, die zum Interpretzeitpunkt als Rexx Schlüsselwort eingesetzt wird. Evtl ist folgendes leichter verständlich:
 
  Ausdruck = "205/79"; Aktion = "Erg ="; interpret Aktion Ausdruck; Say Erg;
 
Die, in der Variable Aktion definierte, Zeichenkette Erg = wird in der Rexxfunktion Interpret als eine Anweisung erkannt ! Gleiches gilt auch für andere Rexx Funktionen und OS/2 Kommandos ! So nun können wir obiges Argument "Param" einsetzen. Daraus wird dann:
 
  numeric digits 35; arg Param; Aktion = "Say"; interpret Akion Param; exit;
 
Ich finde das Statement von Peter herrlich kompakt, meine Schreibart ist vergleichsweise stupid.
 
Rekursionen Bei Rekursionen rechnet man gerne bis zur Null-Differenz. Numeric fuzz hilft dabei, es reduziert den Wert von DIGITS für einen Vergleich. Die Zahlen, die miteinander verglichen werden sollen, werden mit einer Genauigkeit von DIGITS minus FUZZ Ziffern voneinander subtrahiert. Das Ergebnis wird dann mit 0 verglichen. Nutzen wir diese Funktion bei der Berechnung der Wurzel von 2.00 mit einer Genauigkeit von 35 (!) Stellen: /* SQRT.cmd */ parse arg Param; numeric digits 36; numeric Fuzz 1; if \ (Param > 0) then exit; Alt = 1; Do forever Neu = 2 * Param / (Alt + Param/Alt) if abs(Alt-Neu) = 0 then LEAVE Alt = Neu End say "Der Wurzelwert beträgt " Neu exit; Der Aufruf SQRT.cmd 2.00 liefert:
Der Wurzelwert beträgt 1.414213562373095048801688724209698079
 
Ich weiß nicht, wo die Grenze für numeric digits liegt. Ich habe numeric digits bis zu einem Wert von 200 gesteigert, weitere Wurzel-Experimente wurden mir dann zu langweilig, ich hatte keine Lust mehr. Überhaupt, bei rekursieven Funktionen kann man die Genauigkeit ins Unermeßliche steigern.
 
zurück


Ermitteln der Größe von Ordnern


 
Reden wir mal in diesem Abschnitt nicht von Ordnern sondern von Directories, das macht die Sache einfacher.
 
Immer wieder mal begegnet einem meiner Bekannten das Problem, daß, aus welchen Gründen auch immer, die Festplatte voll ist. Und dann wird nach einem Tool gesucht, daß die Größe solcher Direktories ermittelt. Warum eigentlich wenn man OS2 hat ? Das erinnert mich an meine Vorgesetzten, die da immer behaupten, für OS2 gibt es keine Programme.
 
FALSCH, oder hat einer der Vorgesetzten mal behauptet, auch er sei phantasievoll und kanns deshalb behaupten ? OS2 hat alles, was man so braucht an Bord. Einbißchen Phantasie braucht man allerdings auch.
 
Das einzige Problem besteht doch, daß man die Summe aller Datein bilden muß, die mit dem Dir-Befehl in der 3. Spalte angezeigt werden ! Außerdem müssen dann noch die Zeilen ignoriert werden, die das <DIR> enthalten.
 
Beim Testen habe ich allerdings noch feststellen müssen, daß, bei Verwendung des 4OS2, außerdem der Punkt in den File-Größen stört, der die tausender Markierung setzt (der CMD kennt den Tausenderpunkt nicht). Wenn man das auch noch berücksichtigt, wird das Ganze mit einem 8 zeiligen Script (die Rexx Initialisierung nicht mit gezählt) erledigt:
 
/* Summe.cmd, korrigiert für den 4OS2 Interpreter */ call rxfuncadd 'sysloadfuncs', 'rexxutil', 'sysloadfuncs'; call sysloadfuncs; Summe = 0; Do while Lines() Zeile = LineIN() zw = subword(Zeile,3,1);; if pos(".",zw) > 0 then zw = delstr(zw,pos(".",zw),1); if datatype(zw) = "NUM" then Summe = Summe + zw; end; Say Summe
 
Das was's schon, das ist doch die Stärke von Rexx. Und so sieht dann die Anwendung aus: [c:\]dir office51 /s | Summe.cmd 297478144 Mit dem 4OS2 als Command Interpreter, den ich ausschießlig verwande, liefert das ganze auch dann korrekte Ergebnisse, wenn man die Subdirectories im DIR Befehl einschließt.
 
Ich habe es somit bereits angedeutet: Wir brauchen eine Unabhängigkeit vom Command Interpreter ! Rexx stellt die Möglichkeit zur Verfügung das DIR-Kommando zu ersetzen. Das Script wurde noch etwas designt, darum will ich es hier unter dem Namen RexxSize bereitstellen. Hier ein Funktionsbeispiel:
 
[c:\]RexxSize C: Ermittelt wird die Größe von c:\* c:\4OS2301 1.285 kB, Summe 1.285 c:\Achive 29.697 kB, Summe 30.982 c:\ACROBAT3 15.763 kB, Summe 46.745 c:\AcrobatReader4 7.561 kB, Summe 54.306 c:\appl 71.020 kB, Summe 125.326 c:\Arbeitsoberfläche 948 kB, Summe 126.274 c:\ARJ 362 kB, Summe 126.636 c:\ASTRO 688 kB, Summe 127.324 c:\Astronomie 91.941 kB, Summe 219.265 :
 
zurück


Rexx & Tabellenkalkulation


 
Rexx fremde Anweisungen werden während der Verarbeitung dem übergeordneten Programm übergeben, wo ist hier der Nutzen ? Die Firma Sundial Systems Corporation hat Rexx vollständig in ihre Tabellenkalkulationsprogramm MESA/2 integriert. Hierzu stellt Sundial eine DLL zur Verfügung. Integriert in ein Rexx Script, können dann Mesa/2 Tabellen vollständig gefüllt oder Ausgelesen werden, Rechenoperationen gestartet und Ergebnisse gedruckt werden. In einer OS/2 CMD-Datei sieht das dann so aus: /* MesaSample.cmd */ call RxFuncAdd "MesaLoadFuncs", "MESASCPT.DLL", "MesaLoadFuncs" call MesaLoadFuncs /* Mesa DLL */
 
do i=1 to 10 Wert = i*8; /* das "Ein mal 8" */ SeiteSpalteZeile = "[A]B" || i; /* Seite A, Z 1 ..10 */ rc = mesa2PUTC(Wert,SeiteSpalteZeile) /* Wert Spalte B */ rc = mesa2PUTC("" i "mal 8" ,"[A]A" || i) /* Wert Spalte A */ end; /* Summe bilden und dann gesamte Seite drucken */ Erg= mesa2CALCULATEFUNCTION("SUM(B1:B10)") rc = mesa2PUTC(Erg,"B12") rc = mesa2PUTC("Summe","A12") rc = mesa2PRINT("[A]") /* ist ja wohl sprechend */ exit;
Das Ergebnis sieht dann so aus.
 
Aber auch der umgekehrte Weg geht. In Mesa/2 wird eine Seite bereit gestellt, in der ein Rexx Script hinterlegt werden kann (Achtung, die Mesa/2 Befehle haben hier eine etwas andere Syntax). Das Bild zeigt die Mesa/2 Script Seite. Ich kann das Produkt sehr empfehlen, bevor ich mich in der Dokumentation von Excel verlaufe, habe ich meist eine Rexx Lösung im Clippboard. Bitte jetzt nicht wieder eine solche Rexx Schnittstelle mit der Schnittstelle VBA und Excel vergleichen ! Einen solchen Vergleich habe ich bereits oben vollzogen !
 
Weiteres nur als INFO !
Es gibt leider nur wenige Programme, die ein Rexx Entry bereitstellen: PMMail (Blueprint Software Works) gehört dazu. Dort nutze ich die Rexx Schnittstelle, um Mails zu scannen und somit weiterzuleiten oder auszuwerten / zu vernichten. Eine gute Möglichkeit, einen automatischen Oparator bereit zu stellen. Ich habe 2004 entdeckt, daß die Webseite de.os2.org solches für die Bereitstellung der auf Hobbes neu eingegangenen Software nutzt !
zurück


Erweiterte Datei Attribute


 
Auch hier erst mal eine Anekdote. Teamer Carsten hat einen Downloadmanager entwickelt und im Forum angeboten. Was der denn so kann, hatte ich nicht so richtig verstanden. Ich dachte immer, das PRG ist zur automatische Kontrolle und zum Wiederaufsetzen von Downloads gedacht. Nö, der Name ist nur unglücklich gewählt !
 
Immer wenn Carsten etwas auf die Festplatte speichert, geht ein Fenster auf, im dem er Schlagworte zur geholten Datei hinterlegen kann. Gute Idee, so findet man Dateien und Infos schnell wieder.
 
Ich bearbeite solches seit 96 mit dem Describe Kommando vom 4OS2. Warum sollte ich mich da umstellen ? Dieses Describe nutze ich auch für andere Zwecke, z.B: zum Ablegen von Infos zu speziellen Directories.
 
Mit dem 4OS2 Dir Befehl und der Option /i (Schlagwort Suche) lassen sich solche Dateien auch schnell wieder auffinden. Aber ich muß gestehen, daß manchmal alle Dateibeschreibungen selbstverschuldet verschwinden, verursacht durch ein manuelles "move" ganzer Directories, aber auch verursacht durch das Draw and Drop von Dateiobjekten. Das ist keine gute Integration mit dem Betriebssystem !
 
Unter NT lösen einige Kollegen dieses mit einem File Rename der Form AlterName, NeuerName {Schlagworte}. Doch damit ist das Problem eigentlich nicht erschlagen. Was ist dann zu tun, wenn andere Gesichtspunkte hinzukommen ? Noch ein Rename ? Eigentlich bräuchte man neben Schlagworten auch die gesamte Filehistorie !
 
ListEA.cmd
OS/2 kann so etwas. Es kennt erweiterte File Attribute, genannt EA. Dort können Keyworte, Historie und sogar Binärdaten hinterlegt werden. Zuvor möchte ich jedoch aufzeigen, wie solche Informationen ausgelesen werden können. Dazu tragen wir mal einen ->Images\ExtAttrib1.jpg<- Kommentar<- mit Hilfe des Systems via Notizbuch: Lasche Datei, Dritte Seite ein. Jetzt schauen wir uns das mal mit diesem kleinem (!) Script an. /* ListEA.cmd. Diesen Script bitte als ListEA.cmd speichern */ /* und starten. Aufrufbeispiel "ListEA.cmd MyFile.txt */ Datei = Arg(1); if SysGetEA(Datei,".Comments","Info") = 0 then Do say Info; end; exit; Probiert es mal ... und ? Jo, da ist der Text ! Auch die anderen EAs lassen sich so auslesen. Ohne Garantie, daß die Liste hier vollständig ist, sind mir nachfolgende Schlüsselworte bekannt: .Type, .Keyphrases .Comments .Assoctable .Subject .Icon .History und .Classinfo. Nur Mut, probiert es mal !
 
ReadEAComments.cmd Bei der Betrachtung der Ausgaben mißfallen einige Sonderzeichen, diese gilt es heraus zu filtern. Schauen wir uns den Aufbau dieser Strings an. Das EA .comment ist vom String Typ EA_MVMT (Multi Value Multi Type). Ein Daten-Type, in dem mehrere Werte unterschiedlicher Typen, in einem String hinterlegt werden können. Gute Dokumentationen dazu findet Ihr in den Inf-Dateien von Tip&Tricks. Seht nach mit Hilfe von view rxtt33.INF "Extendet Attributs used by the WPS"
 
Der Aufbau dieses EA ist:
Datatype Codepage Anzahl_Eintrage Datatype1 Laenge1 Eintrag1 ... Datatype# Laenge# Eintrag#
 
Mit diesem Wissen können wir nun auch das zweite Beispiel lesen. Es listet Files mit Comment-EA der aktuellen Directory an. Soll gezielt nach einem Begriff gesucht werden, so kann die Ausgabe mit Hilfe eines FIND Kommandos und dem Pipe-Operator gefiltert werden, probiert es mal. Aufrufbeispiel einer solchen Suche: ReadEAComments.cmd | find /i "Hura"
 
Aha, Hier liegt die Datei -;)
 
RexxUpdateEA.cmd
Wir möchten aber solche EAs ablegen und nutzen können. Dazu kann ich ein drittes Beispiel ->Beispiel\RexxUpdateEA.cmd<- RexxUpdateEA<- anbieten. (In den Userkreisen habe ich dazu eine Warnung erhalten, die ich hiermit weitergeben möchte: Beim Schreiben von EAs ist zu berücksichtigen, daß Intel Prozessoren 32-Bitwerte im Little Endian Format speichern - d.h. mit vertauschten Bytes. Beispielweise "1234" als "3412". Das müßte überprüft werden. Bei mir läuft die Source auf einem Pentium 3 Prozessor).
 
Aufrufbeispiele:
  • _RexxUpdateEA Dateiname /t beschreibender Text_
  • _RexxUpdateEA Da* /t beschreibender Text_. In diesem Falle werden alle Treffer der Dateimaske DA* mit dem selben Text versorgt.
  • _RexxUpdateEA Dateiname /ti beschreibender Text_ Mit dem /ti wird zur Kontrolle ein Hexdump der Infostrings angezeigt.
Ich habe diesen Weg gewählt, um die Editiermöglichkeiten vom eingesetzten Commandinterpreter (CMD.exe bzw 4OS2.exe) nutzen zu können.
 
Autsch, da habe den Salat. Das Programm ist ein Teil aus dem nachfolgenden Script DescUebg.cmd. Fehler sind mir bis dato nicht bekannt. Jedoch ist mir beim Arbeiten mit RexxUpdateEA aufgefallen, daß Internet Link-Adressen nicht übernommen werden, wenn diese ein // enthalten, wie z.B. in ftp://ftp.software.ibm.com/ps/products. Gleiches Problem besteht, wenn Pipe-Operatoren im Kommentar verwendet werden.
 
Das Problem kennen wir doch ! Das hatten wir schon bei der Bestimmung des Divisionsrestes !
 
Enthält der Aufrufparameter einer Rexx Script Datei die Zeichen // so wird nur eine Zeichenkette bis zum Auftreten von // weitergereicht. Das Problem tritt NICHT bei CMD-Dateien auf, die kein Rexx nutzen. Die einzigen mir bekannten Lösungen sind, solche Strings über Hilfsdateien oder Queues weiterzureichen oder mittels LineIN/CharIN abzufragen.
 
Der Workaround
Die Rexx Tip&Tricks Empfehlung lautet: Indirekter Aufruf des Rexx Programmes mittels eines Batch-Files. In diesem Batchfile wird eine Enviromentvariable mit Namen REXXParms stückweise zusammen gesetzt und anschließend das Rexxprogramm gerufen. So sähe der Batch-File aus: @ECHO OFF SET REXXParms= :PLOOP IF '%1' == '' GOTO CALLREXX SET REXXParms=%REXXPARMS% %1 SHIFT GOTO PLOOP :CALLREXX CALL MYRXPRG.cmd Und im Rexxprogramm wird dann die Enviromentvariable wie folgt abgerufen: /* MYRXPRG.cmd */ parse arg VarName . thisParms = value( VarName , , "OS2ENVIRONMENT" ) thisParms = strip(thisParms)
 
EAs und Programme
Es gibt leider noch einen weiteren Wermutstropfen. Alle Dos-, alle mir bekannten Windows- und auch einige Nativ OS/2 Programme löschen die in Arbeit befindliche Originaldatei um diese dann direkt wieder neu anzulegen. Die EAs der Originaldatei sind dann weg. Also bitte nicht wundern, wenn ihr nach einer kleinen Korrektur eines Worddokumentes Eure EAs nicht mehr findet. An mir liegt es nicht !
 
desc.cmd
Für mich kommt nur eine Lösung in Frage, die mehr als das bisherige kann:
  • Es müssen ältere EAs bequem editiert und ergänzt werden können,
  • Es soll das Editieren der EAs in einem (bei mir stets offenen und meistens weitgehen verdeckten) Commmand-Fenster möglich sein (ein aktives NPSWPS Programm ermöglicht so ein XWindow-Verhalten, wie man es vom UNIX her kennt),
  • Es darf das aktuelle Fenster, aus dem man ja die Stichworte ermittelt,
  • NICHT durch ein neues Fenster auch nur kurzzeitig verdeckt werden,
  • Es muß möglich sein, die nach einem Neuanlegen von Originaldateien verschwundenen EAs wieder zu restaurieren.

Da das meiste bereits vom 4OS2 unterstützt wird, bot sich die Verwendung der dort verwendeten Hilfsdatei an. Im diesem Script ->Beispiel\desc.cmd<- desc.cmd<- wird das Describe Kommando aufgerufen, das die Informationen entgegen nimmt und das Ergebnis dann als EA unter ".Comment" weggepackt. Die EAs lassen sich jetzt sehr bequem von der Commandozeile aus editieren. Einfacher geht es wirklich nicht, allerdings muß das 4OS2 installiert sein !
 
Das 4OS2 ist freigegeben, es stehen also keine Gründe im Wege es sich herunterzuholen und zu installieren. Übrigens ist dieses Script ein Beleg, daß das vom 4OS2 aus aufgerufene Rexx Script die 4OS2 Kommandos und nicht die CMD-Kommandos verwendet.
 
Unhandlich ?
Für die 'mouse' Fetischisten ist das ganze in der Praxis sicherlich etwas unhandlich. Man befindet sich meisten in der falschen Arbeitsoberfläche in der GUI statt auf der Commad-Ebene oder umgekehrt. Um Comments zu pflegen oder Recherchen anzustoßen, müßte man dann die Arbeitsoberfläche wechseln können. Auch dieses kann unter OS/2 listig gelöst werden. Wie, das kann im nächsten Kapittel nachgelesen werden.
 
zurück


Arbeiten mit Ordnern

Ordner öffnen.
Stellen Sie sich vor, Sie haben sich mit der Command Interpreter tief ins System hinein gehangelt (z.B nach: C:\Arbeitsoberfläche\ Programme\ Developer Kit,^Java(TM)^Technology\ Beispiele^zur^Java-Programmierung und möchten nun mit einem Befehl dieses Directory als graphisch dargestellten Ordner in der GUI sehen. Mit diesem ->Beispiel\OpenFLDR.cmd<- Script<- haben wir so einen Befehl. Ich habe da gleich 4 OpenFldr Varianten eingebaut mit den Parametern.
 
  I (Öffnen Icon View), D (Detail View), T (Tree View) und A (Sicht als Tree und Icons)
 
Auch hier zeigt sich die Überlegenheit der Tastatur gegenüber der 'mouse'. So schnell wie mit diesem Script kann man die Sicht auf Objekte in einem alternativen Format via 'mouse' nicht öffnen ! Fehlt uns noch das Gegenstück, das Starten der Kommandozeile für einen vorgegebenen Ordner.
 
Öffnen einer CMD-Sicht des Ordners
Hierzu gibt es zwei Varianten: Die Erste nutzt die eingebauten Systemfeatures, die zweite erreicht das gleiche über den Umweg Rexx. Doch zuerst die Nutzung der OS/2 Systemfeatures. Gefunden habe ich entsprechende Unterlagen in den eZime News, (hier das Original). Das ganze nun in vereinfachter Abänderung:
 
Man ziehe aus dem Schablonenordner das "Programm" Objekt auf die Arbeitsoberfläche und trage in die drei Felder des sich öffnenden Notizbuches:
 
  • Feld "Pfad und Dateiname" : *
  • Feld "Parameter" : /K %**D && CD %**N
  • Feld "Arbeitsverzeichnis" bleibt leer
  • unter Tabulator Symbol, Feld "Titel" den Text "Command Sicht" ein.
Dann schließe man das Notizbuch.
 
Jetzt muß dann das Kontexmenü "Öffnen" der "Lieblingordner" erweitert werden. Dazu öffne man das Notizbuch der jeweiligen Ordner, schlage den Tabulator "Menü, Seite 2" auf, klicke unter Verfügbare Menüs auf "~Öffnen" und ziehe das soeben erstellte Objekt "Command Sicht" in das Feld "Aktionen. Dann schließe man auch dieses Notizbuch.
 
Ab sofort hat man im Kontexmenü dieses Ordners unter "Öffnen" einen weiteren Eintrag. Das war's.
 
Möchte man stattdessen seinen Commander einbinden, so geht man genauso vor, nur daß stattdessen im Feld "Pfad und Dateiname" : eine Scriptdatei genannt wird. Probieren Sie es das mal, so müßte das Notizbuch aussehen und so das Kontexmenü des Ordners.
 
Ordner Schließen
Zu diesem Thema gehört auch ein Beispiel zum Schließen eines ->Beispiel\ClosFLDR.cmd<- Ordners<-. Dieses Beispiel schließt (falls der Ordner mehrfach geöffnet wurde, sogar alle) gleichnamigen Ordner. Auch hier ist die Überlegenheit der Kommandozeile gegenüber der 'mouse' deutlich: Es geht in einem solchen Fall einfach bequemer und schneller, vorausgesetzt der eigene Commandinterpreter hat eine "Filename Completion".
 
Resume
Damit haben wir alle Freiheiten, um aus einem geöffneten Ordner heraus, für diesen Ordner die Commandozeile zu starten, die EAs der Dateien dieses Ordners zu durchforsten und dann beliebig, ohne 'mouse' Aktion die Arbeitsoberfläche wieder freizuräumen.
 
zurück


Setzen der Assoziationen für Programm

Ich muß nachfolgendes, ohne weiteren Kommentar, einfach mal so zum Schmunzeln für Euch einfügen. Ohne diese Post wäre mir dieser Teil der Rexx-Hilfe nicht klar geworden - übersehen hatte ich in der zugehörigen Onlinehilfe den Begriff "vollständiger Dateiname".
 
Hi Uwe,
 
Jetzt bin ich auch mal zum Lesen gekommen. Sieht gut aus - vielen Dank für die Mühe! Erwähnenswert iust meiner Ansicht nach noch zur Funktion SysOpenObject. Mit dieser Funktion lassen sich nicht nur Objekte identifiziert über die ObjectId, sonder auch Dateiobjekte über Ihren Namen öffnen.
 
z.B. benutzt Du ein externes OS/2 Kommando um ein Wavdatei abzuspielen:
   Zitat:
   CMDBefehl = "call C:\MMOS2\PLAY.CMD FILE=C:\MMOS2\SOUNDS\BOING.WAV"
   CMDBefehl
 
Meiner Ansicht nach ist die elegantere Methode:
   file = 'C:\MMOS2\SOUNDS\BOING.WAV'
   rc=SysOpenObject(file, 0, 'TRUE')
 
Damit nutzt Du die Assoziationen der WPS (diese müssen natürlich entsprechend gesetzt sein), und Du brauchst Dich nicht um das ausführende Programm kümmern. Letztlich läuft diese Routine dann auf jedem Rechner, und benötigt kein Setup. Damit können im Prinzip alle bekannten Dokumente, Ordner etc geöffnet werden.
 
Gruß Frank

 
Wumm, ins Schwarze getroffen.
Das habe ich übersehen und auch nicht gewußt, obwohl das aus der Prozedurbeschreibung eindeutig hervorgeht. Dabei ist mir auch bewußt geworden, wie wichtig ein Absatz über das Setzen der WPS Assoziationen wäre.
 
Danke Dir.
 
Setzen der Assoziationen für Programm
Wozu eigentlich ? Einfach nur deshalb, damit man mit dem Klick der Mouse auf ein Datenobjekt dieses öffnen lesen kann ? Meistens hat das bei mir nicht richtig funktioniert, außerdem navigiere ich und starte ich zu 95% Programme mit der Tastatur.
 
Beispiel, ich nutze wegen der Rechtschreibkontrolle gerne für meine schwedischen Dokumente das schwedische StarOffice und für die übrigen Dokumente das deutsche StarOffice. Ein Doppelklick auf ein Objekt öffnet das Dokument mit dem falschen Programm. Auch mittels Programm AssoEdit ist dieses Problem nicht lösbar. Ich habe nun das mit den Zuordnungen bei der Registrierung nochmals durchgearbeitet. Vielleicht ist das Problem jetzt lösbar.
 
Setzen der Assoziationen für Programm
 ... damit man mit einem "Mouseklick" auf ein Datenobj... Nein nicht nur deshalb, bleiben wir bei der Tastatur ! Manche Commandinterpreter können ebenfalls ein Datenobjekt einem Programm zuordnen !
 
Mit diesem Einschub will ich aufzeigen, wie wichtig Kenntnisse über Abläufe bei der Registrierung sind, um obige Probleme verstehen und lösen können. Ausnahmen erkennt man meistens erst im Nachherein.
 
zurück


Setzen der WPS Assoziationen

Anmerkung In den nachfolgenden CMD-Dateien habe ich vorsichtshalber eine Bremse für unbeabsichtigtes Starten eingebaut und deshalb die einzelnen Optionen nicht als Parameter implementiert sondern im Programm selbst hinterlegt.
 
Es soll hier das Zusammenwirken der Registrierung (OS2.INI) und der Erweiterten Attribute betrachtet werden, darum habe ich die Parameter der Funktionen SysDestroyObject, SysIni, SysCreateObject, SysGetEA, SysPutEA und SysOpenObject hier zusammengetragen.
 
Objekt erstellen
Die nachfolgende Skizze entspricht etwa der Source des ersten ->Beispiel\Registrieren1.cmd<- CMD-Files<-. Hier wird das Programm ARJ als Objekt registriert. Die Zeile 02 löscht zuvor evtl vorhandene Einträge in der OS2.INI, soweit diese registriert sind. Weitere Einträge müssen evtl manuell (Zeile 03 und 04) gelöscht werden. Danach (Zeile 12) wird das Objekt neu registriert. Die zugeordneten Assozationen und Aufrufparameter (Zeile 11) werden dabei in die OS2.INI eingetragen. Prüfen kann man das sehr schön mit diesem ->Beispiel\ListUserIni.cmd<- Script<-. 01 /* Remove old Object and all old associations, if any */ 02 call SysDestroyObject '<ARJFolder>' 03 Call SysIni 'USER', 'PMWP_ASSOC_FILTER', '*.ARJ', 'DELETE:' 04 Call SysIni 'USER', 'PMWP_ASSOC_TYPE', 'ARJ File', 'DELETE:' 05 06 /* Create Arj Folder with an Arj object */ 07 rc = SysCreateObject("WPFolder", , 08 "Arj Files","<WP_DESKTOP>","OBJECTID=<ARJFolder>;","R") 09 ObjektName = "ARJ Obj" 10 Location = "<ARJFolder>" 11 Optionen = ... || "ASSOCTYPE=ARJ File;ASSOCFILTER=*.ARJ;" || ... 12 rc = SysCreateObject("WPProgram", ObjektName, Location, , 13 Optionen, R)
 
Hinweis zu Optionen:
Eigentlich sollten alle Felder, die man im Notizbuch findet auch unter Rexx steuerbar sein, ich habe jedoch die notwendigen Schlüsselworte nicht gefunden. Bei Filterangaben wird zwischen großen und kleinen Buchstaben unterschieden. Obwohl unterschiedliche Schreibweisen im zugehörigem Objekt nicht angezeigt werden, sind diese existent.
 
Ergebnis.
Jetzt haben wir die folgende Situation: In der Config.sys braucht für ein Objekt keine PATH-Angabe definiert werden. Bei allen neuerstellten *.ARJ Files funktioniert SysOpenObject (natürlich auch der doppelte Klick auf das Objekt). Bei allen älteren Files nicht. Obwohl das richtige Objekt im Notizbuch unter Open vorhanden ist, geht bei diesen Files nur das Notizbuch auf.
 
Leider ändert sich dieses Verhalten auch nicht, wenn - über einen zweiten Datentyp - eine zweite Open Möglichkeit hinkommt.
 
Programm und Datenfile
Man kann aber auch ohne ein Objekt auskommen und stattdessen die notwendigen Eigenschaften im Notizbuch des Programms bzw der Datenfiles setzen. Aber - wie denn setze ich mit Rexx Parameter, Sitzungsdaten und Zuordnung in den .Classinfo der EAs ? Das ist mir leider derzeit verschlossen und ohne Einsatz von C sehe ich da kein Vorwärtskommen. Es bleibt an dieser Stelle leider nur die Handarbeit. Naja, vielleicht sind es ja nur einzelne Programme, dennoch ist das für mich sehr unbefriedigend.
 
Bei den Datenfiles ist es wieder etwas leichter. Mit dem Programm Registrieren3 kann ein weiterer Associations-Eintrag nachgerüstet bzw an Stelle 1 der Openauswahl gesetzt werden, dieses ist also eine feine Möglichkeit die Festplatte nach speziellen Kennungen wie å oder Å zu scannen und den Datentyp für die gefundenen *.sdw Dokumente auf das schwedische Staroffice zu setzen, jedoch ...
 
Ergebnis.
Bei allen neuerstellten Files funktioniert auch hier das SysOpenObject. Bei allen älteren Files nicht, obwohl das richtige Objekt im Notizbuch unter Open vorhanden ist. Beim Test ist mir allerdings aufgefallen, daß neue Files nicht immer mit dem richtigen Typ versehen werden (?) !
 
zurück


Eigene Klickstartleiste

nochmals SysCreateObject
Beim Aufbereiten der Script-Beispiele mußte ich feststellen, daß die Klickstartleiste, besonders, wenn man diese nach eigenen Bedürfnissen zusammenstellt, auch ihren Charme hat. Allerdings muß man auf die Kommandozeile und etwas Rexx anwenden. Übrigens, auch ein Beleg, daß die Microsoft Fan Gemeinde da hoffnungslos überfordert ist, die sehen einfach nicht, was für ein steifes und inflexibles System sie bevorzugen.
 
Zurück zu eigener zusätzlichen Klickstartleiste. Mit diesen wenigen Scriptzeilen hat man so etwas: (*1) /* Neue Klickstartleiste erzeugen */ curObjectID = "<MyNewLaunchPad>" klasse = "WPLaunchPad" title = "KlickstartLeiste2" ziel = "<WP_DESKTOP>" Optionen = , "LPDRAWERTEXT=YES;LPTEXT=YES;LPVERTICAL=YES;OBJECTID=", || curObjectID || ";" Objekte = , "FPOBJECTS=<WP_OS2SYS>,<WP_INFO>,<WP_PROMPTS>," , || "<MYSQL_3_23_FOLDER>,c:\Appl;"
 
rc=SysCreateObject(Klasse,title,Ziel,Objekte || Optionen,"R"); if RC <> 1 then say "Oops, something went wrong!" rc=SysOpenObject(curObjectID,"DEFAULT",1)
Einpaar wichtige Hinweise dazu: Unterlagen zu den Optionen können unter view rxtt33.INF "Setup Strings for LaunchPad objects" nachgelesen werden. Mit diesen Optionen können erheblich mehr individuelle Gestaltungen eingestellt werden, als mit Hilfe des Eigenschaft-Notizbuches erreichbar. Die einzelnen Objekte, erkennbar an den Klammern <> wurden der OS2.Ini entnommen. Ein Script diese Einträge auszulesen, findet man unter view rexx Sysini. Ist eines dieser Objekte nicht vorhanden schadet es auch nichts, es erscheint dann ein ? anstelle des Objektes.
 
Wirklich interessant wird die Klickstartleiste erst, wenn man die einzelnen Fächer erweitert. Wichtig sind dabei allerdings zwei Dinge:
  • Die Objekt ID, im obigen Fall habe ich MyNewLaunchPad gewählt, muß bekannt sein, sonst kann man sie nicht erneut ansprechen.
  • Falls, wie hier im ->Images\KlickstartLeiste.jpg<- Beispiel<- ein Programm mehrfach mit unterschiedlichen Parametern eingebunden werden soll (im Beispiel die Anzeige der unterschiedlichen Hilfen mit dem View.exe), darf das Programm nicht direkt via Programmpfade angegeben werden, sondern es muß ein Programmobjekt verwendet werden. Das ->Beispiel\CreateObjekt.cmd<- Beispiel<- zeigt, wie man solche Objekte definiert. Die Objekt ID dieser Programmobjekte sind für die nachfolgende Klickstarterweiterung wichtig. Und so könnte das aussehen: ->Beispiel\KlickObjekte.cmd<- (*1)<-
/* Objekt für view.exe mit Referenz zur CMDREF erzeugen */ Ziel = "C:\Arbeitsoberfläche\System" Titel = "CMD Hilfe" OBJ1 = "EXENAME=C:\OS2\View.exe;PARAMETERS=CMDREF.INF;" , || "OBJECTID=<VIEW CMDREF>" rc = SysCreateObject("WPProgram", Titel, Ziel, OBJ1, "R") exit; Genauso können wir für die anderen Onlinebücher Rexx, Objekt Rexx, etc. Objekte erzeugen. Die Erweiterung der eigenen Klickstartleiste könnte dann so aussehen: (*1) /* Erweiterung der Klickstartleiste */ curObjectID = "<MyNewLaunchPad>" /* alte ID der KL'Leiste */ say "Adding some objects to drawer 2" RC = SysSetObjectData(curObjectID,"DRAWEROBJECTS=2," , || "<VIEW REXX>,<VIEW TIPPS>,<VIEW CMDREF>;" ) if RC <> 1 then say "Oops, something went wrong!" exit; Als Anhang habe ich den Script meiner momentanen Klickstartleiste hinzugefügt.
 
Anmerkung zum Script CreateObjekt:
Die anzulegenden Objekte benötigen einen Ordner als Heimathafen. Als Ziel wurde C:\Arbeitsoberfläche\System\Objekte gewählt. Dieser Zielordner muß natürlich ebenfalls angelegt werden (nicht vorhanden im Script). Auch das Bootlaufwerk (im Beispiel "C:") müßte angepaßt werden. Dazu liefert ORexx den nötigen Befehl "Drive = SysBootDrive()".
 
Diese Feinheit könnt ihr nun selbst einarbeiten.
 
_(*1)_ Leider mußten einige Zeilen in der HTML Darstellung geteilt werden, da diese Sourcen über die zulässigen Zeilenbreite hinaus gehen. Die richtige Darstellung steht als Link daneben.
zurück


Applikationen einrichten

nochmals SysCreateObject, Details dazu
Für die Kollegen, die eine Applikation mit einer eigenen Installationsroutine installieren möchten, sei hier ein Beispiele zusammen gestellt. - Zu aller erst muß abgewogen werden, was man mit so einem Script erreichen will, ob man sich für einen CMD Befehl "MKDIR \Arbeitsoberfläche\MyFolder" und "COPY MyFile to .... " entscheidet oder ob man lieber mit Objekten arbeitet. Arbeiten wir mit Objekten, so können wir uns zwischen "CreateObject" und "CreateShadow" entscheiden.
 
Im Beispiel entscheide ich mich für ein CreateObject, es ist mächtiger.
 
Weiter ist zu entscheiden:
   a) Was wollen wir anlegen (welchen Objekt-Typ)
   b) Unter welchem Schlagwort soll es erscheinen (Title)
   c) Wohin wollen wir das neue Objekt installieren (Ziel).
   d) Mit welchen Bedingungen wollen wir das knüpfen (Optionen) und
 
Dazu ein paar Schlüsselworte:
anlegbare Objekte sind ::=
   "WPLaunchPad", "WPProgram", "WPFolder".
 
Ziele können sein ::=
   Die WPS, ID = "<WP_DESKTOP>;"
   ObjektID eines zuvor angelegten Ordners, Beispiel-ID "<MyObjectID>;"
   oder ein Verzeichnis, z.B: "Directory()"
 
Optionen sind ::=
   "OBJECTID=<XXXXXX>;", "ALWAYSSORT=NO;", "NODELETE=YES;",
   "NOMOVE=YES;", "NORENAME=YES;", "NOTVISIBLE=YES;", "PROGTYPE=PM;",
   "OPEN=TREE;", "OPEN DETAILS;", "OPEN ICON;",
   "ICONFILE=<XXXXXX.ICO>;",
   "EXENAME=MyProgram.exe;PARAMETERS=<XXXXXX>;",
   "ASSOCFILTER=*.ZIP,*.JAR,*.RAR,*.ARJ,*.LZH,*.*GZ,*.WPI;"
   "ASSOCTYPE=ZIP File;" "SHOWALLINTREEVIEW=YES;"
   "STARTUPDIR=" || Directory() || ";"
 
Als SysCreateObject Aktion sind zugelassen ::=
   "U" (Update) bzw. "R" (Replace)
 
Wenn die eigenen Vorstellungen festgelegt wurden, kann es losgehen. Mit Hilfe der beiden nachfolgenden Routinen sollte das Gewünschte einstellbar sein. Wenns funktioniert steht Result auf TRUE (Wert = 1).
  • call SysCreateObject Objekt_Typ, Title, Ziel ,Optionen, Aktion
  • call SysCreateShadow Objekt, Ziel
In der Musterdatei wurde festgelegt, daß ein Ordner mit vorgegebenen Titel auf der Arbeitsoberfläche erscheinen soll, dort fest eingebrannt (Optionen NoDelete) ist und sowohl ein Prgramm als auch eine Datei enthalten soll.
 
Damit 's auch funktioniert, sind auf zwei Dinge zu achten:
   1. Die einzelnen Teilstrings zu den Optionen müssen mit einem ; enden
   2. Die übrigen Parameter dürfen nicht mit ; enden.
 
zurück


HTML Dokumente

Dieses Dokument wurde mit dem Systemeditor e.exe erstellt. Aus folgendem einfachen Grund: Er ist im Startverhalten der schnellste, läßt sich separat mit der Hintergrundfarbe auf schwarz einstellen, ist somit augenschonend, erzeugt eine, mit jedem anderen Programm verarbeitbare, Datei und verschwindet, wie früher bei den Großrechnern gewohnt, mit der Taste F3, erspart mir somit den Zweifingergriff "alt & F4". Alles andere ist ausreichend.
 
Die Umsetzung nach HTML mache ich mit keinem Wordprogramm, das ist mit zu aufwendig ! Da kommt wieder Rexx zum Einsatz.
 
Zur Historie:
Ich habe lange mit dem Druck- und Dokumentationsfacility DCF der IBM gearbeitet: Mit diesem Facility schriebt man seinen Text in einem SPF Editor herunter, streut ein paar Formatbefehle ein und hatte damit ganz schnell ein optisch sauberes Druckbild. Die Formatbefehle sind sehr prägnant: ,lz (für Leerzeile) ,a (für Absatz) ,aufz (für das Einleiten einer Tabelle) und andere mehr. Alle diese Befehle mußten, in Spalte 1 der jeweiligen Zeile beginnen, ansonsten wurden sie ignoriert. Feine Idee, denn ein Komma als erstes Zeichen einer Zeile kann es nicht geben.
 
Mit wenigen Formatierungen war ein Dokument ganz schnell gestaltet oder auch wieder umgestaltet oder man änderte einfach die Programmparameter.
 
Genau das ist die Vorgehensweise in dem Script. Das kleine RexxPrg ersetzt diese einfachen Formatbefehle in HTML 'Tags'. Abhängig vom HTML Kopf wird die Seite zweispaltig oder einspaltig aufgebaut. Referenzen werden automatisch generiert, wenn ein ,ü (für Überschrift) auftaucht. Änderungen für ein HTML Format gehen auch schneller, ich ändere oder erweitere einfach einpaar HTML Befehle im Script. Ich brauche dazu kein HTML auswendig lernen, einfach im Script hinterlegt und schon wieder vergessen, Rexx macht's für mich und dem DCF sei ein nachträgliches Dankeschön gewiß !
 
Zumindest können so Verse und Prosa und Programm-Dokumente sehr viel einfacher heruntergeschrieben und als HTML aufbereitet werden als mit den allgemein bekannten Word Werkzeugen. Zum Testen nehmt mal den kleinen Ausschnitt dieses Dokumentes und unterwerft es diesem 2Html Script, einmal mit und einmal ohne HTML-Kopfdaten.
  • Aufruf 2html.cmd DokumentKopf.txt DokumentenKopf.html Header.txt
zurück


In eigener Sache

Tack ska du har
Ich habe auf meinem Rechner 'nur' das normale Classic Rexx installiert. Überrascht war ich allerdings, als ich beim Zusammenstellen dieser Unterlagen feststellen mußte, daß ich, um den vorgestellten Scripten den letzten Schliff zu geben, das ORexx benötige. Einige Hinweise in diesem Dokument zielen bereits darauf hin. Insofern war diese kleine Zusammenstellung sehr lehrreich für mich. Als nächstes wird ORexx bei mir istalliert.
 
Ein paar Zusagen:
die nachstehenden Themen werden folgen. Sie alle sollten ursprünglich noch in dieses Dokument. Es braucht jedoch noch eine Weile das notwendige Wissen präsentieren zu können. Was noch fehlt und derzeit auf meiner Liste steht, sind:
 
  • Rexx und CGI Scripte oder Rexx und Web,
  • Erstellung von GUI Programmen mit Hilfe von VRexx,
  • Zugriffe auf Datenbanken DB2 bzw MySQL mit Rexx,
  • FTP Funktionen, kontrollieren mit Rexx.
Unter den Tools, die GUI Bearbeitung mit Rexx ermöglichen, habe ich mir DRDialog angeschaut. Hierzu möchte ich, ohne viel Kommentar, ein Beispiel bereit stellen. Es ist ein kleiner Rechner, der für Ingenieure und Physiker interessant sein könnte, also physikalische Konstanten und mathematische Funktionen kennt. Ganz sicher ist dieser Rechner nicht ausgereift, dennoch ist er jetzt schon eine wirkliche Anternative zum MS$ Taschenrechner. Für diejenigen, die sich immer noch scheuen zusätzlich neben Windows OS/2 zu installieren und daher den Rechner nicht ausprobieren können, hier ein Abbild des Taschenrechners.
 
Downloads Ich wurde angesprochen, dieses Dokument in gepackter Form bereitzustellen. Zum Teil haben die einzelnen Files EAs, ich habe mich auch deshalb für ein ARJ Archive entschlossen. Dieses Dokument sollte mit folgendem Kommando entpackt werden.
  • ARJ x RxCompendium.arj
Die zugehörigen Packer/Entpacker für OS/2 findet man bei Hobbes bzw für den Rest der Welt hier
 
... kritische Gedanken
Es sind mir zwei Dokumente aufgefallen, die kritisch die in die Zukunft sehen: ->http://heise.de/newsticker/data/hps-02.04.03-000/<- Heise<-: MS Office: von Größe S bis XXL und ->http://aaxnet.com/editor/edit029.html<- Automation Access<-: 2003 and Beyond. Das sieht nicht gerade rosig aus. Da sollte man kritische Fragen stellen. Einige Fragen an unsere Großindustrie habe ich hier aufgelistet:
 
Warum opfert Ihr Eure Rechnenzentrum, in denen das, über viele Jahre gesammelte, Wissen zentral abrufbar war, zugunsten einer PC Landschaft, bei der jetzt diese Daten, abgelegt in unterschiedlichsten und individuell aufgebauten Archiven, nur noch vor Ort zur Verfügung stehen.
 
Warum vertraut Ihr, aus den Vorstandsetagen der Industrie, einem mehrerer illegaler Geschäftspraktiken überführten Geschäftsmann und unterstützt mit eurer Softwareausstattung ausgerechnet diesen ? Er wird ganz sicher, aus Angst unterzugehen, diese Praktiken weiter fortsetzen !
 
Insofern möchte ich dem Teil der Banken danken, die sich 2000 entschieden haben OS/2 weiterhin einzusetzen und somit IBM in die Pflicht nahmen dieses feine System via Conveniece Vertrag weiterhin zu Pflegen. Hier ist Solidarität gefordert.
 
Ich schätze,
daß alleine für die MS$ Software jährlich ca. 100 Mio Euro in die USA fließen, die zur Finanzierung heimischer Arbeitsplätze benötigt würden. Ich kann mir gut vorstellen, daß es eine Herausforderung und eine reizvolle Aufgabe wäre, Microsoft wieder zurück zu drängen. Einen enormen Motivationsschub auf die Mitarbeiter wäre das alle Mal !
 
 
Updates 4. Mai 2003
So einpaar Dinge hatte ich übersehen oder derzeit nicht gewußt.
a) Neue Datei Desc.cmd, die Source vom Call RexxUpdateEA wurde in diesen File integriert.
b) Der Link zur Copy der de.os2.org/Editional-Seite geht jetzt (die OS2.Org Grafiken wurden eliminiert).
c) Der Absatz Was RexxTry nicht kann wurde korrigiert.
 
Updates 17. Juni 2003
Tipfehler eleminiert (für mich gilt weiterhin die alte Rechtschreibung !)
Ergänzung zur Registrierung
Alle Snapshots aus der Rexx Hilfe sind nun als HTML-Text vorhanden
 
Updates 19. Juni 2003
ARJ Links nachgereicht
 

 
Spruch zum April 2003:
Pack OS2 zusammen mit Rexx und Deine Commandozeile ist mächtiger als die Maus
OS2, denn OS2 kennt keine Vieren>(Gefunden bei commtalk.de)