Major Weenie's Engine Room - V1N5 (German)





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

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

Aber dann &uuml;bernahmen die Gesetze der Marktwirtschaft die Gesellschaft. Es ist ganz einfach: Hat einen &Uuml;berschu&szlig; an Zahn&auml;rzten, steht man anschlie&szlig;end ohne Z&auml;hne da, so wie der Major. Hat man zu viele Anw&auml;lte, endet das Ganze mit Schildern auf Haartrocknern. Hat man zu viele Leute mit PCs, h&ouml;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 &uuml;ber Blacks Strand und Volleyball; genau, daher habe ich dieses Karo-Muster.

Aber kommen wir zum Thema dieses Monats. H&ouml;rt dahinten mit dem Gekicher auf; ja, der Major hat dieses Muster &uuml;berall. Ich glaube, ich versprach euch letzten Monat, da&szlig; wir diesmal erforschen w&uuml;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&szlig;w&ouml;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&uuml;ssen, ist, die REXX Utility Library zu laden. Wenn sie an dem Tag nicht den Unterricht geschw&auml;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&auml;ftigen sich mit dem relativ allt&auml;glichen Dingen, von SysSleep, mit dem man eine Pause in ihr Programm einf&uuml;gen kann, bis zu fast esoterischen Dingen wie SysDeregisterObjectClass, bei dem der Major immer darauf Wert legt, da&szlig; sie nicht damit herumpfuschen, solange sie kein Backup haben. . . oder zwei oder drei.

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

Der Geruch? Nein, ich bin in keinen Salat gefallen! Der Major i&szlig;t keinen Salat! Zu hart f&uuml;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&ouml;sung des Majors zu bleiben, l&auml;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&uuml;ssen sie sie nicht in jedem Programm aufrufen.

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

Nein, der Major wird sich anschlie&szlig;end nicht ein&ouml;len und ausruhen. Wenn man im Alter des Majors angekommen ist, verbringt man schon gen&uuml;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&uuml;ssen sie das SysCreateObject Kommando benutzen. Wenn sie in der On-Line Hilfe bei diesem Kommando nachsehen, werden sie feststellen, da&szlig; ein Haufen der Elemente des Kommandos &uuml;berhaupt nicht beschrieben werden.

Wenn sie gerne mehr Informationen &uuml;ber ein Kommando h&auml;tten, kann ich ihnen ein wirklich hilfreiches Referenz Buch empfehlen: REXX Reference Summary Handbook from C F S Nevada, Inc. In manchen F&auml;llen ist es sogar n&uuml;tzlicher als die On-Line Hilfe (andererseits gibt es bei einem Buch kein Ausschneiden und Einf&uuml;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 &lt;g&gt;). Das grunds&auml;tzlichste Kommando f&uuml;r SysCreateObject ist

result = SysCreateObject(classname, title, location <,setup> <,option>)

Einige dieser Parameter erkl&auml;ren sich von selbst. classname zum Beispiel, ist nat&uuml;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&uuml;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 BonusPack installiert, erhalten die neuen Obekte 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&ouml;nnen, um sich die registrierten Klassen auf ihrem System anzusehen. Genaugenommen, werden sie einen Blick auf die Ordnerklasse vom Typ WPFolder werfen m&uuml;ssen.

Jetzt ist die Frage, wo findet man diese Klasse. Genau-- &uuml;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 weiss man, da&szlig; der Desktop 'WP_Desktop' heisst? Nun, eine offensichtliche Antwort ist, da&szlig; es in der Anleitung steht. Aber eine weitere, viel esoterischere Antwort ist: Sie werden sich daran erinnern, da&szlig; wir letzten Monat an unseren ini.rc und inisys.rc Files mutig herumgefummelt haben. W&auml;hrend sie alles durchgelesen haben, ist ihnen vielleicht diese Zeile in ini.rc aufgefallen:

"PM_InstallObject" "Desktop;WPDesktop;?:\" "OBJECTID=&lt;WP_DESKTOP&gt;"

Kein Grund, sich nach weiteren Hinweisen umzusehen. ..

Nun, sie werden feststellen, da&szlig; es ein Reihe weiterer optionaler Parameter gibt. &lt;,setup&gt; und &lt;,option&gt; und leider hat die Anleitung nicht viel &uuml;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&uuml;nde, warum sie diese &Uuml;bung durchlaufen, ob sie jetzt ihre eigenen Ordner einfach so zum Spa&szlig; erstellen oder es f&uuml;r Geld machen. Wenn sie lange genug im Internet herumsuchen, werden sie Beispiele &uuml;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, &uuml;ber die man sich wirklich sorgen machen braucht. Replace sorgt daf&uuml;r, da&szlig; das Objekt, das erschaffen wird, ein existierendes Objekt mit dem selben Namen ersetzt. Benutzen sie das mit Vorsicht! Fail l&auml;&szlig;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&uuml;ssen nur den ersten Buchstaben f&uuml;r option benutzen, nicht das ganze Wort.

Was der Major am h&auml;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&szlig; das kein komplettes Code Fragment ist, aber wenn sie in ihrer Akademiezeit nicht geschlafen haben, wissen sie das bereits.) Zuallererst bemerken sie, da&szlig; ich mehrere Parameter als Ersatz benutzt habe, um den Code ein wenig lesbarer zu gestalten.

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

Hier also zwei Vorschl&auml;ge, um das Ganze noch etwas flexibler zu gestalten. Als erstes fangen sie den Ordnernamen auf der Kommandozeile ab, wenn das Programm ausgef&uuml;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&uuml;heren Diskussionen. Wenn nicht, genau-- schauen sie noch einmal in ihr Buch. Parse arg stellt sicher, da&szlig; auch das, was sie auf der Kommandozeil eingeben, als Ordnername angenommen wird, ansonsten konvertiert arg automatisch alles, was sie eintippen, in Gro&szlig;buchstaben.

Ein zweiter Vorschlag ist, da&szlig; sie anstelle des Ordnernamens auf der Kommandozeile den Namen des Bitmaps abfangen. Erinnern sie sich daran, da&szlig; die &Auml;nderung des Ordnernamens so simpel ist, da&szlig; sie nur mit gedr&uuml;cktem ALT auf den Ordnernamen klicken und den neuen Namen eingeben m&uuml;ssen. Die &Auml;nderung des Hintergrundbitmaps bedeutet, da&szlig; man die Ordnereinstellungen &ouml;ffnen mu&szlig; und wir wissen alle, wie &auml;ngstlich einige Leute davor zur&uuml;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&auml;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&szlig; der Ordner, den sie gerade erstellt haben, FOLDERNAME heisst, weil wir das noch nicht definiert haben. Wenn ihnen diese Herangehensweise gef&auml;llt, f&uuml;gen sie die Zeile

FolderName = pic

hinzu, damit der Ordner den Namen des Bitmaps bekommt!

Offensichtlich sorgt das f&uuml;r ziemlich komische Ordnernamen. Es gibt noch eine weitere Herangehensweise, dazu m&uuml;ssen sie ein Verzeichnis w&auml;hlen, in dem sie immer ihre Bitmap lagern werden, zum Beispiel OS2\BITMAP. Dann ver&auml;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&uuml;bsch machen wollen. ..

Mist, der Sonnenbrand des Majors juckt wie verr&uuml;ckt. Ich mu&szlig; 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&auml;nden zu bekommen, also mu&szlig; ich das selber machen.

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

Also bis zum n&auml;chsten Monat, Ihr

Major Weenie

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