Major Weenie's Engine Room - V1N5 (German)





Nun, nach dem letzten Monat waren die Subraum Voicemail Leitungen des Majors ziemlich überlastet. Jeder scheint zu denken, daß ich verrückt bin, wenn ich erkläre, wie man Code zum Ersetzen von Desktop Objekten schreibt.

Ich schätze diese Leute haben recht. Damals, in der ersten Hälfte des 20. Jahrhunderts, schien man davon auszugehen, daß Leute nicht ihre Finger ablecken und danach in Steckdosen stecken würden. Es war nicht nötig, auf Haartrocknern kleine Schilder mit der Aufschrift "Nicht in der Badewanne benutzen" anzubringen. Es wurde angenommen, daß die Leute keine Idioten waren.

Aber dann übernahmen die Gesetze der Marktwirtschaft die Gesellschaft. Es ist ganz einfach: Hat einen Überschuß an Zahnärzten, steht man anschließend ohne Zähne da, so wie der Major. Hat man zu viele Anwälte, endet das Ganze mit Schildern auf Haartrocknern. Hat man zu viele Leute mit PCs, hört man andauernd: "Hilfe! Ich habe meine Festplatte formatiert und kann nicht mehr booten!" ...Vielleicht sollte der Major besser das Thema wechseln.

Oh. Der Sonnenbrand? Ja, der Major hat den Subraum selbst verbrannt, als er herauszufinden versucht, wie man einen Sonnenbrand auf dem Holodeck bekommt. Leutnant Mondstrahl wieder. Irgendetwas über Blacks Strand und Volleyball; genau, daher habe ich dieses Karo-Muster.

Aber kommen wir zum Thema dieses Monats. Hört dahinten mit dem Gekicher auf; ja, der Major hat dieses Muster überall. Ich glaube, ich versprach euch letzten Monat, daß wir diesmal erforschen würden, wie man die Original Systemobjekte mit REXX erstellt.

Nun, der Major hat sich die Tips zu Herzen genommen, also anstatt euch mit 15 Launchpads und 1117 Reißwölfe auszustatten, schauen wir uns doch einmal an, wie man programmtechnisch einen Ordner erstellt. Das ist ziemlich harmlos, nicht wahr?

Nein, wir machen kein Schild auf den Code!

Das erste, das wir in unserem Code anstellen müssen, ist, die REXX Utility Library zu laden. Wenn sie an dem Tag nicht den Unterricht geschwänzt haben, um Springball zu spielen, hat man ihnen gesagt, wie man das Kommando in der On-Line Rexx Anleitung findet. Man findet es unter REXX Utility Functions (RexxUtil). Die Utility Funktionen beschäftigen sich mit dem relativ alltäglichen Dingen, von SysSleep, mit dem man eine Pause in ihr Programm einfügen kann, bis zu fast esoterischen Dingen wie SysDeregisterObjectClass, bei dem der Major immer darauf Wert legt, daß sie nicht damit herumpfuschen, solange sie kein Backup haben ...oder zwei oder drei.

Nun, das erste was sie tun müssen, ist, die Funktionen zu laden. Ein eleganterer Programmierer als der Major würde wahrscheinlich nur die spezifischen Funktionen laden und später wieder entfernen, die er benutzen will.

Der Geruch? Nein, ich bin in keinen Salat gefallen! Der Major ißt keinen Salat! Zu hart für den Gaumen. Das ist Essig. Genau, man reibt Essig auf einen Sonnenbrand, es stillt die Schmerzen.

Wenn wir zum Beispiel SysSleep irgendwo am Anfang ihres Codes benutzen wollen, tippen sie folgendes ein: call RxFuncAdd 'SysCls', 'RexxUtil', 'SysSleep' Nun, das funktioniert gut, bedeutet aber auch allgemein viel Arbeit, weil man dazu gezwungen wird, sich an jede geladene Funktion zu erinnern, die man in seinem Programm benutzen will; um also bei der unaufwendigen Lösung des Majors zu bleiben, lädt er also einfach alle, indem er folgendes am Anfang des Programms eintippt: call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs' call SysLoadFuncs Dadurch werden alle Funktionen geladen.

Ok, ich gebe es zu. In Wirklichkeit hat der Major in seinem Systemstart Ordner ein Programmobjekt, das ein simples REXX Programm aufruft, das nichts anderes macht, als jede fehlerhafte Tempdatei zu entfernen und die Utility Funktionen zu laden. Auf diesem Weg, müssen sie sie nicht in jedem Programm aufrufen.

Es gibt bei dieser Lösung jedoch einen Nachteil. Der Major gibt oft seine Programme weiter und diese undankbaren Säcke ...äh, die Leute, denen er sie gibt, beschweren sich darüber, daß sie nicht funktionieren. Nun, natürlich funktionieren sie nicht, schließlich sind die Funktionen nicht geladen, also vergessen sie nicht diesen Nachteil, wenn sie es dem Major gleichtun.

Nein, der Major wird sich anschließend nicht einölen und ausruhen. Wenn man im Alter des Majors angekommen ist, verbringt man schon genügend Zeit mit "Ausruhen", er vertreibt sich die Zeit lieber auf der Bowling Bahn. Versuchen sie sich bitte zu konzentrieren...

So, der Funktionscode ist geladen, jetzt müssen sie das SysCreateObject Kommando benutzen. Wenn sie in der On-Line Hilfe bei diesem Kommando nachsehen, werden sie feststellen, daß ein Haufen der Elemente des Kommandos überhaupt nicht beschrieben werden.

Wenn sie gerne mehr Informationen über ein Kommando hätten, kann ich ihnen ein wirklich hilfreiches Referenz Buch empfehlen: REXX Reference Summary Handbook von C.F.S. Nevada, Inc. In manchen Fällen ist es sogar nützlicher als die On-Line Hilfe (andererseits gibt es bei einem Buch kein Ausschneiden und Einfügen ...noch nicht). Der Autor des Handbuchs ist Dick Goran, der die monatliche REXX-Kolumne in OS/2 Magazine schreibt. Die Zeitung wird von [Miller Freeman, Inc.] herausgegeben, die ihre OS/2 Magazine Webseite anscheinend noch nicht fertig gestellt haben (ich hoffe sie erkennen den Wink mit dem Zaunpfahl ). Das grundsätzlichste Kommando für SysCreateObject ist result = SysCreateObject(classname, title, location <,setup> <,option>) Einige dieser Parameter erklären sich von selbst. classname zum Beispiel, ist natürlich der Klassenname des Objekts. Es gibt verschiedene Objektklassen auf ihrem System. Wenn sie bei sich ein Programm installieren, installieren sie oft auch verschiedenen Objektklassen auf ihrem System.

Für alle, die von Objektorientierung keine Ahnung haben: Ein Programmobjekt bekommt sein verhalten, indem es Eigenschaften von dem Hauptobjekt im System erbt, der Workplace Shell Klasse und indem es weitere Charaktereigenschaften definiert. Haben sie zum Beispiel IBM Works aus dem BonusPak installiert, erhalten die neuen Objekte in ihrem Schablonen-Ordner ihr Verhalten sozusagen von den DLLs, die sie definierten.

Wenn sie sich in der Anleitung den Befehl SysQueryClassList ansehen, finden sie ein Codefragment, das sie benutzen können, um sich die registrierten Klassen auf ihrem System anzusehen. Genaugenommen, werden sie einen Blick auf die Ordnerklasse vom Typ WPFolder werfen müssen.

Jetzt ist die Frage, wo findet man diese Klasse. Genau - überall wo man will, aber in diesem Fall halten wir das Ganze lieber einfach. Wir sollten auf sicherem Terrain bleiben, wenn der Major anwesend ist. Also, wir wollen es am Ort WP_Desktop ablegen.

Woher kommt das jetzt? Leutnant Mondstrahl hat eine gute Frage gestellt: "Woher weiß man, daß der Desktop 'WP_Desktop' heißt? Nun, eine offensichtliche Antwort ist, daß es in der Anleitung steht. Aber eine weitere, viel esoterischere Antwort ist: Sie werden sich daran erinnern, daß wir letzten Monat an unseren ini.rc und inisys.rc Files mutig herumgefummelt haben. Während sie alles durchgelesen haben, ist ihnen vielleicht diese Zeile in ini.rc aufgefallen: "PM_InstallObject" "Desktop;WPDesktop;?:\" "OBJECTID=" Kein Grund, sich nach weiteren Hinweisen umzusehen...

Nun, sie werden feststellen, daß es ein Reihe weiterer optionaler Parameter gibt. <,setup> und <,option> und leider hat die Anleitung nicht viel über setup zu sagen, weil option einer der interessanteren Parameter ist. Damit kontrollieren sie Sachen wie das Anordnen von Icons und Hintergrund Bitmaps.

Offensichtlich sind Optionen einer der Hauptgründe, warum sie diese Übung durchlaufen, ob sie jetzt ihre eigenen Ordner einfach so zum Spaß erstellen oder es für Geld machen. Wenn sie lange genug im Internet herumsuchen, werden sie Beispiele über die Nutzung der verschiedenen Optionen finden.

Eine, die der Major gerne benutzt, ist BACKGROUND, durch die man ein Hintergrund-Bitmap in einem Ordner unterbringen kann.

So weit auch die option Einstellungen reichen, gibt es doch nur drei, über die man sich wirklich sorgen machen braucht. Replace sorgt dafür, daß das Objekt, das erschaffen wird, ein existierendes Objekt mit dem selben Namen ersetzt. Benutzen sie das mit Vorsicht! Fail läßt das Programm fehlschlagen, wenn es ein Objekt mit dem selben Namen findet und Update wird das existierende Objekt mit jedem Parameter erweitern, den sie angegeben haben. Sie müssen nur den ersten Buchstaben für option benutzen, nicht das ganze Wort.

Was der Major am häufigsten benutzt, ist, sich ein neues Bitmap, das er irgendwo hergeschafft hat, auf faule Art anzusehen. Der Major hat zum Beispiel gerade ein Bitmap von Snake Plissken aus dem Internet geholt und es auf seinem Desktop abgelegt. Der Code, um einen Ordner zu erstellen und Snake in den Hintergrund zu kleben, ist: FolderName = "Mein Vorbild, Snake!" Setup = 'ICONVIEW NON-GRID;BACKGROUND=C:\DESKTOP\SNAKE.BMP' ClassName = WPFolder Location = '' rc=SysCreateObject("WPFolder", FolderName,"", setup,'F') Exit rc Jetzt fallen einige Punkte auf. (Nicht zuletzt die Tatsache, daß das kein komplettes Code Fragment ist, aber wenn sie in ihrer Akademiezeit nicht geschlafen haben, wissen sie das bereits.) Zuallererst bemerken sie, daß ich mehrere Parameter als Ersatz benutzt habe, um den Code ein wenig lesbarer zu gestalten.

Der Parameter FolderName fügt den String "Mein Vorbild, Snake!" in den Aufruf an SysCreateObject ein, außerdem habe ich Setup hinzugefügt, das die Parameter Iconview und Background enthält.

Hier also zwei Vorschläge, um das Ganze noch etwas flexibler zu gestalten. Als erstes fangen sie den Ordnernamen auf der Kommandozeile ab, wenn das Programm ausgeführt wird. Das funktioniert, wenn sie FolderName = "My man Snake!" durch Parse arg FolderName ersetzen.

Sie erinnern sich wahrscheinlich an die arg Funktion aus früheren Diskussionen. Wenn nicht, genau - schauen sie noch einmal in ihr Buch. Parse arg stellt sicher, daß auch das, was sie auf der Kommandozeile eingeben, als Ordnername angenommen wird, ansonsten konvertiert arg automatisch alles, was sie eintippen, in Großbuchstaben.

Ein zweiter Vorschlag ist, daß sie anstelle des Ordnernamens auf der Kommandozeile den Namen des Bitmaps abfangen. Erinnern sie sich daran, daß die Änderung des Ordnernamens so simpel ist, daß sie nur mit gedrücktem ALT auf den Ordnernamen klicken und den neuen Namen eingeben müssen. Die Änderung des Hintergrundbitmaps bedeutet, daß man die Ordnereinstellungen öffnen muß und wir wissen alle, wie ängstlich einige Leute davor zurückschrecken.

In diesem Fall wollen sie ein arg Kommando an den Beginn ihres Programm setzen, und Setup = 'ICONVIEW NON-GRID;BACKGROUND=C:\DESKTOP\SNAKE.BMP' in Setup = 'ICONVIEW NON-GRID;BACKGROUND='pic verändern, wobei pic die arg Variable ist.

Wenn sie das tun, sieht das Kommando, das sie an snake.cmd weitergeben in etwa so aus: snake c:\desktop\snake.bmp.

Was ihnen gleich auffallen wird, ist, daß der Ordner, den sie gerade erstellt haben, FOLDERNAME heisst, weil wir das noch nicht definiert haben. Wenn ihnen diese Herangehensweise gefällt, fügen sie die Zeile FolderName = pic hinzu, damit der Ordner den Namen des Bitmaps bekommt!

Offensichtlich sorgt das für ziemlich komische Ordnernamen. Es gibt noch eine weitere Herangehensweise, dazu müssen sie ein Verzeichnis wählen, in dem sie immer ihre Bitmap lagern werden, zum Beispiel OS2\BITMAP. Dann verändern sie Setup = 'ICONVIEW NON-GRID;BACKGROUND='pic in Setup = 'ICONVIEW NON-GRID;BACKGROUND=C:\OS2\BITMAP\'pic Wenn sie das Ganze jetzt richtig hübsch machen wollen...

Mist, der Sonnenbrand des Majors juckt wie verrückt. Ich muß auf dieses Ding etwas Essig machen. Ich habe heute Morgen versucht, den Replikator in meinem Quartier in eine Essig-Dusche umzufunktionieren und ich brauchte eine Stunde, um den Ahorn-Sirup von den Wänden zu bekommen, also muß ich das selber machen.

Wenn sie einen Vorschlag für einen zukünftigen Besuch im Maschinenraum haben, schicken sie mir eine Nachricht an [kentr@ibm.net]

Also bis zum nächsten Monat, Ihr

Major Weenie

Major Weenie ist Kent Rebman, ein Amateur Software Crash Test Dummy im IBM Midwestern Open Systems Zentrum. -ed