home *** CD-ROM | disk | FTP | other *** search
/ ftp.uni-stuttgart.de/pub/systems/acorn/ / Acorn.tar / Acorn / acornet / fun / mags / hl-03-93.arc / !HL-03_93_Text_WIMP-Kurs < prev    next >
Text File  |  1993-06-07  |  10KB  |  191 lines

  1.  
  2.  
  3.  
  4. ÿÿÿÿÿÿÿÿÿÿ Programmieren des WIMP ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  5.  
  6.  
  7. Teil 3.
  8.  
  9. In der letzten Folge haben wir den Anfang des Grundgerⁿstes besprochen, aus
  10. dem unser WIMP-Program besteht. Zum Schlu▀ haben wir sogar das Icon auf die
  11. Iconbar gebracht, und wenn Ihr jene Programmzeilen aus der letzten Folge
  12. als Zeilen 201-208 in das Gerⁿse einfⁿgt, so habt Ihr schon ein Programm, das
  13. in der Taskliste und auf der Iconbar erscheint, wenn es aus dem Desktop ge-
  14. startet wird. Ihr k÷nnt das jetzt mal ausprobieren: gebt die paar Zeilen ein,
  15. speichert das BASIC-Programm im !Program-Directory unter dem Namen !Runimage
  16. ab, und startet das BASIC-Programm durch Doppelklick. Achtet aber darauf, da▀
  17. Ihr auch das Spritefile aus der letzten Ausgabe erstellt und in das !Program-
  18. Directory abgelegt habt. Wenn Ihr alles richtig gemacht habt, so erscheint
  19. jetzt unten in der Iconbar Euer selbsterstelltes Icon.
  20.  Das war aber auch schon alles, was unser Programm schon kann, es hat kein
  21. Menu, und so kann man es auch nicht beenden! Auch nicht aus dem Taskmanager!
  22. In der Tat hat sich das Programm jetzt fest bei Euch im Rechner eingenistet
  23. und lΣ▀t sich nicht vertreiben (es sei denn, Ihr habt ein Programm zum
  24. Task-Terminaten zur Hand).
  25.  
  26.  Nachdem wir also einen Reset durchgefⁿhrt haben, wollen wir uns einmal ⁿber-
  27. legen, wie wir dieses Maleur beim nΣchsten Mal vermeiden k÷nnen.
  28. Das Menu (mit dem 'Quit'-Eintrag) auf den Bildschirm zu bringen, erfordert
  29. etwas Vorbereitung, und so will ich zuerst die andere M÷glichkeit hier ein-
  30. fⁿhren: Wir wollen unser Programm jetzt so prΣperieren, da▀ eine Beendigung
  31. ⁿber den 'Quit'-Eintrag im Taskdisplay m÷glich ist!
  32.  
  33. Wenn der Benutzer im Taskdisplay ⁿber einem Tasknamen Menu drⁿckt und beim
  34. Eintrag ╗Task '....' ë½ auf den Pfeil rechts steuert, so erscheint ein Unter-
  35. menu, in dem der 'Quit'-Eintrag steht. WΣhlt man diesen nun an, so schickt der
  36. WIMP eine Nachricht an unser Programm, da▀ es sich doch bitte zu entfernen
  37. hat, sprich: da▀ es beendet werden soll. Diese Nachricht erreicht unser
  38. Programm natⁿrlich ⁿber unseren SYS "Wimp_Poll"-Befehl in Zeile 500.
  39.  Der eventcode%, der hierbei zurⁿckkommt, hat die Nummer 17 bzw. 18 und hei▀t
  40. User_Message. Wir schauen uns also unser Programm an der Stelle an:
  41.  
  42.    SYS "Wimp_Poll",0,pollblock% to eventcode%
  43.    CASE eventcode% OF
  44.     WHEN 0 :
  45.     WHEN 2 :
  46.     ...
  47.  
  48. Wir fⁿgen hier als letzte WHEN-Anweisung vor dem ENDCASE ein:
  49.  
  50.     WHEN 17,18 : PROCmessage_received
  51.  
  52. womit also beim Auftreten dieses Eventcodes 17 oder 18 (die identisch behan-
  53. delt werden) unsere erste Prozedur aufgerufen wird.
  54.  
  55. Diese Prozedur wollen wir nun schreiben (ich benutze hier die Zeilen ab
  56. 3000 zur ▄bersichtlichkeit, obwohl im ganzen Programm keine Zeilennummern ge-
  57. braucht werden, also v÷llig frei gewΣhlt werden k÷nnen):
  58.  
  59.  3000  DEFPROCmessage_received
  60.  3010   action_code%=pollblock%!16
  61.  3020   CASE action_code% OF
  62.  3030    WHEN 0 : fertig% = TRUE
  63.  3040   ENDCASE
  64.  3050  ENDPROC
  65.  
  66. Das ist die ganze Prozedur, wie wir sie im Moment brauchen.
  67. Was wird nun dort gemacht? Nun, wenn also der Task Manager unserem Programm
  68. diese Nachricht schickt, dann schickt er gleich mit, was denn ⁿberhaupt los
  69. ist, was gemacht werden soll. Das sind Sachen wie: wer hat die Nachricht ab-
  70. geschickt (der WIMP), eventuelle Bezugsdaten (sozusagen my_ref, your_ref),
  71. und natⁿrlich, was von unserem Programm erwartet wird.          
  72.  Diese Daten legt der WIMP in unserem dafⁿr vorgesehenen Speicherblock ab:
  73. im pollblock%. Alle diese Daten liegen in 32bit-Words vor.
  74.  Dieses letztere ist das einzige was uns fⁿrs erste interessiert: der Action
  75. Code der Nachricht ist hier 0, das ist Message_Quit, und sagt dem Task, da▀
  76. er sich unverzⁿglich aus dem Speicher zu entfernen hat.
  77.  Andere Action Codes sind z.B. Message_ModeChange (ein Mode Change hat statt-
  78. gefunden), Message_TaskInitialise (ein Task meldet sich gerade mit
  79. SYS"Wimp_Initialise" beim WIMP an) u.v.a.m. Aber all dies soll uns nicht
  80. interessieren. Der Action Code (hier also eine 0) befindet sich im pollblock%
  81. an der Position 16. Also holen wir uns dieses Word und legen es in der
  82. Variablen action_code% ab, wo wir es dann in einer CASE-Schleife abfragen:
  83.  Es mag vielleicht ein wenig overpowered aussehen, wie dort fⁿr nur einen
  84. Wert extra eine CASE...ENDCASE-Konstruktion bemⁿht wird, doch wollen wir das
  85. Programm ja vielleicht noch etwas erweitern und andere Action Codes hinzu-
  86. fⁿgen. Wenn wir also den Action Code 0 (Message_Quit) erkannt haben, setzen
  87. wir einfach unsere Endkennung fertig% auf logisch wahr (TRUE) und beenden
  88. diese Prozedur. Das Programm wird dann in Zeile 2100 nach dem ENDCASE fort-
  89. gesetzt, wo dann auch gleich diese Variable fertig% ⁿberprⁿft wird. Und da sie
  90. jetzt nicht mehr FALSE ist, sondern TRUE, wie es dort abgefragt wird, wird die
  91. gro▀e REPEAT...UNTIL-Schleife nicht erneut durchlaufen, sondern der erste
  92. Befehl nach der Schleife wird abgearbeitet, in unserem Programm also der
  93. Befehl
  94.  
  95.    SYS "Wimp_CloseDown"
  96.  
  97. welcher den WIMP veranla▀t, diesen unseren Task aus der Liste der aktiven
  98. Tasks zu streichen, ebenso aus der Liste des Task Managers und von der Icon-
  99. Bar. Der Befehl funktioniert zwar so kurz, wie er dort steht, doch sollte man
  100. Acorn-konform die korrekte Version verwenden, und zwar:
  101.  
  102.    SYS "Wimp_CloseDown",taskhandle%,&4B534154
  103.  
  104. wobei taskhandle% dieselbe Variable ist, die wir nach unserem Wimp_Initialise
  105. vom WIMP zugewiesen bekommen haben, und &4B534154 ist wieder der ASCII-Text
  106. "TASK", wie schon bei der Initialisierung.
  107.  Danach ist unser Task als Task beendet, und wir mⁿssen nur noch dem BASIC-
  108. Interpreter mitteilen, da▀ dieses Programm jetzt v÷llig beendet ist und
  109. aus dem Speicher gel÷scht werden kann: Dafⁿr gibt es in BASIC ein spezielles
  110. Kommando:
  111.  
  112.    END  (kennt wohl jeder?!)
  113.  
  114. Fⁿgen wir den END-Befehl nun also noch ein (als Zeile 2300), dann k÷nnen wir
  115. das Programm wieder abspeichern und aus dem Desktop starten, und siehe da:
  116. Es kann jetzt aus dem Taskdisplay heraus beendet werden!
  117.  
  118. Doch fΣllt im Taskdisplay gleich auf den ersten Blick eine unangenehme Sache
  119. auf: Unser Program belegt einen riesigen Block an Speicher. Auf meiner RO3
  120. 4MB Maschine sind das 640K, das mag bei RO2 oder weniger Speicher anders sein.
  121. Auf jeden Fall ist es wohl etwas zu viel fⁿr ein Programm das *nichts* tut.
  122.  
  123. Fⁿr Speicherreservierung gibt es den SYS "Wimp_SlotSize", mit dem man angeben
  124. kann, wieviel Speicher ein Programm wohl braucht. Dies macht man aber
  125. normalerweise nicht im BASIC-Programm, sondern im !Run-File, das wir jetzt
  126. schreiben wollen:
  127.  
  128. Wir nehmen uns !Edit vor und erstellen ein Obey-File (Filetype &FEB) mit
  129. folgendem Text:
  130.         
  131.    Set Program$Dir <Obey$Dir>
  132.    Iconsprites <Program$Dir>.!Sprites
  133.    Wimpslot -min 32K -max 32K
  134.    Run <Program$Dir>.!Runimage
  135.  
  136. und speichern es unter dem Namen !Run in unser !Program-Directory ab.
  137. Und da wir jetzt gerade !Edit geladen haben, wollen wir noch schnell ein
  138. !Boot-File erstellen. Dieses !Boot-File soll so aussehen:
  139.  
  140.    Set Program$Dir <Obey$Dir>
  141.    Iconsprites <Program$Dir>.!Sprites
  142.  
  143. Dies speichern wir dann unter dem Namen !Boot ab. Zusammen mit dem Spritefile
  144. !Sprites haben wir damit alle essentiellen !-Files zusammen.
  145.  
  146.    !Boot   !Run   !Runimage   !Sprites
  147.  
  148. Nun zu den Zeilen: *Set Program$Dir <Obey$Dir> definiert eine neue Variable
  149. mit Namen Program$Dir, die wir zwar jetzt noch nicht brauchen, die aber
  150. spΣter von Nutzen sein wird. Der Inhalt dieser Variable ist jetzt der kom-
  151. plette Pfad des Directories, in dem sich das Obey-File befindet, das gerade
  152. ausgefⁿhrt wird. Wenn also z.B. das !Run-File ausgefⁿhrt wird, so ist die
  153. System-Variable Obey$Dir genau der Pfad, wo das Programm bei Euch liegt.
  154. Im Root-Directory auf einer Diskette mit Namen 'Diskette_1' in Laufwerk 0
  155. wΣre das also:
  156.  
  157.    ADFS::Diskette_1.$.!Program
  158.  
  159. Damit fⁿllen wir also unsere eigene Variable Program$Dir und k÷nnen nun immer
  160. auf unser Directory zugreifen, indem wir Program$Dir als Pfad benutzten, auch
  161. wenn Obey$Dir lΣngst auf irgendein anderes Directory umgestellt ist, weil der
  162. User ein anderes Obey-File gestartet hat.
  163.  Mit *Iconsprites laden wir noch einmal explizit das Sprite in unserem Sprite-
  164. File !Sprites in den WIMP-Sprite-Pool, was der WIMP zwar automatisch macht,
  165. wenn diese Anweisung nirgendwo steht, doch kann es Situationen geben, in denen
  166. es nicht geschieht, so z.B. wenn man mit der gedrⁿckten Taste CONTROL bzw.
  167. STRG ein Directory ÷ffnet, was zuvor noch nie ge÷ffnet war. Probiert es aus,
  168. die !Boot-Files werden nicht ausgefⁿhrt, und es werden keine Sprites geladen,
  169. wodurch natⁿrlich alle Icons fehlen, und nur die Standard-Applikations-Icons
  170. angezeigt werden. Wenn nun im !Run-File nicht die Sprites geladen werden, so
  171. kann sich das Icon nicht auf der Iconbar installieren, weil der WIMP das
  172. Sprite mit diesem Namen gar nicht kennt!
  173.  Dann wird endlich mit *WimpSlot -min 32K -max 32K der Speicher reserviert,
  174. den unser Programm verbraucht. Hier mⁿ▀te man am Schlu▀ ein wenig herum-
  175. experimentieren, um einen genaueren Wert zu finden, 32K sind wohl auch noch
  176. zu viel, m÷glicherweise reichen schon 8K, doch mu▀ auch der Platz berⁿck-
  177. sichtigt werden, den die Variablen beanspruchen. Und zudem sind 8K-Schritte
  178. sowieso das Minimum auf einer 1MB-Maschine, wΣhrend 32K auf einer 4MB-Maschine
  179. der kleinstm÷gliche Block ist. Gibt man auf einer 4MB-Maschine einen kleineren
  180. Wert als 32K an, so rundet der WIMP das auf 32K auf.
  181.  In der letzten Zeile wird dann endlich das eigentliche Programm gestartet.
  182.  
  183. Nun k÷nnen wir also das !Program-Filer-Window schlie▀en und direkt das
  184. Applikations-Icon (Euer selbstgemaltes) anklicken, woraufhin dann automatisch
  185. das !Run-File und damit letztendlich auch das !Runimage-Programm gestartet
  186. wird. Nun belegt unser Programm nur noch 32K an Speicher, was wohl ein wenig
  187. angemessener ist.
  188.  
  189.                                                             -  Martin Willers -
  190.  
  191.