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

  1.  
  2.  
  3.  
  4. ÿÿÿÿÿÿÿÿÿÿ Programmieren des WIMP ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  5.  
  6.  
  7. Teil 5.
  8.  
  9. In der letzten Folge haben wir das normale Icon-Menu erstellt, mit den beiden
  10. Standard-EintrΣgen "Info" und "Quit". Weder k÷nnen wir allerdings durch An-
  11. wΣhlen des Quit-Eintrages das Programm beenden, noch erscheint rechts vom
  12. "Info"-Eintrag der kleine Pfeil, der zu dem Info-Window fⁿhrt.
  13.  Das AmwΣhlen des Quit-Eintrages werde ich in der nΣchsten Folge behandeln,
  14. womit dann das Programm auch schon fast beendet wΣre. Das ist natⁿrlich leicht,
  15. da es ja nichts macht, au▀er "da" zu sein. Das wollen wir nun Σndern:
  16.  
  17. In dieser Folge werden wir also ein Window kreieren, und zwar das "Info"-
  18. Window.
  19.  
  20. Es gibt nun zwei prinzipiell verschiedene Methoden, um ein Window zu erstellen
  21. und in sein Programm einzubinden:
  22.  
  23. a) man erstellt es mit einem Template-Editor (!FormEd, !TemplEd, u.v.a.m.)
  24.    und lΣdt die damit erstellten Template-Files in sein Programm ein
  25. b) man legt die Window-Definitionen fest im Programmcode selbst ab, mittels
  26.    DATA, EQUD oder wie auch immer
  27.  
  28. Ich werde hier nur Methode a) besprechen, da sie die einfachste ist und zudem
  29. auch die Methode, die in beinahe allen Programmen verwendet wird. Au▀erdem
  30. hat man zu jeder Zeit einfachen Zugriff auf die Templates und kann sie beliebig
  31. Σndern, was bei Methode b) etwas schwierig werden kann, da man hier nur auf
  32. unzΣhlige Zahlen blickt, und ─nderungen z.T. nur durch Ausprobieren so werden
  33. wie man sie haben m÷chte.
  34. Zudem kann jeder, wenn er denn auf Methode b) besteht, sein Template-File
  35. nachtrΣglich noch mit z.B. DATA in sein Programm einbinden, wenn er denn kein
  36. Template-File haben m÷chte.
  37.  
  38. Ein von mir erstelltes Template-File liegt dieser Ausgabe des HL bei (im
  39. "Examples"-Directory), so da▀ Ihr nicht unbedingt auf den Template-Editor
  40. angewiesen seid und Euch nicht mit der Erstellung abquΣlen mⁿ▀t.
  41. Da es au▀erdem mit einigen Editoren unm÷glich ist, rein durch meine ErklΣrungen
  42. zu denselben Windows zu kommen wie ich, werde ich nur erklΣren, wie das
  43. Window ungefΣhr aussehen soll. Die einzige ▄bereinstimmung mu▀ darin bestehen,
  44. da▀ bestimmte Icons, die noch im Laufe des Programmes verΣndert werden, auch
  45. dieselbe Icon-Nummer besitzen, wie ich sie hier vorgebe, damit im Programm,
  46. wo auf ein Icon immer ⁿber seine Icon-Nummer Bezug genommen wird, auch das
  47. richtige Icon angesprochen wird.
  48.  
  49. Wir nehmen uns also den Template-Editor (z.B. !FormEd) vor und erstellen ein
  50. Window mit Namen "info". Dieses ÷ffnen wir nun. Es dⁿrfte noch alle Icons
  51. haben, die ein Window haben kann, d.h. Back-,Quit-,Toggle-,Size-Icon und
  52. beide Scrollbars. Wir brauchen fⁿr unser Info-Window nichts davon, also ist
  53. unsere erste Aktion die, da▀ wir alle Icons entfernen, au▀er einer Scrollbar
  54. und dem Size-Icon (das ist das in der rechten unteren Ecke).
  55. Nun ziehen wir mit dem Size-Icon das Window auf ungefΣhr die Gr÷▀e, die unser
  56. Info-Window haben soll, auf. Ich habe hier in x-Richtung 636, in y-Richtung
  57. -216, das braucht Ihr aber keineswegs genauso zu machen. Die Gr÷▀e ist bei
  58. diesem Window sogar v÷llig egal, da es vom WIMP automatisch ge÷ffnet wird
  59. (dazu komme ich spΣter). Dann begrenzen wir den Work-Area auf diese Gr÷▀e,
  60. und nun k÷nnen wir auch die Scrollbar und das Size-Icon entfernen. Damit haben
  61. wir das Window in der Form wie es spΣter erscheinen soll.
  62.  Der Text in der Window-Titelzeile soll Acorn-konform "About this Program"
  63. hei▀en.
  64.  Nun k÷nnen wir schon daran gehen, die Icons zu erstellen, die dann das
  65. typische Info-Window darstellen:
  66.  
  67.     Name:         Program
  68.  Purpose:       Just a test
  69.   Author:  ⌐ 1993 Martin Willers
  70.  Version:    0.00 (01-Jan-1993)
  71.  
  72. Bei diesem Window ist nur eines wichtig: Das Icon mit der Versionsnummer +mu▀+
  73. die Nummer 3 haben, darauf ist das Programm ausgelegt, das spΣter hier die
  74. aktuelle Versionsnummer hineinschreibt. Ansonsten habt Ihr freie Hand, was
  75. die Gestaltung angeht. Ihr k÷nnt auch mehr als die 8 Icons benutzen, die ich
  76. hier vorgesehen habe. Das geht deshalb, weil dies ein passives Window ist, das
  77. keine weitere AktivitΣt erlaubt, sondern nur angeschaut wird. Ihr k÷nnt auch
  78. die Reihenfolge der Icons wild durcheinanderwⁿrfeln, solange das Icon #3 die
  79. Versionsnummer beinhaltet.
  80.  
  81. Bei der Erstellung der Icons ist zu beachten, da▀ die richtige Anzahl an Bytes
  82. fⁿr den Text reserviert wird. Jedes Icon kann bis zu 12 Zeichen Text enthalten
  83. (inklusive Text-Endkennung, also normalerweise <CR>). M÷chte man mehr Text
  84. als diese 12 Zeichen, so reicht dafⁿr der reservierte Bereich fⁿr ein Icon
  85. nicht aus, und in diesem Icon-Bereich wird nur der Zeiger auf den eigentlichen
  86. Text abgelegt. Darum mⁿssen wir uns aber nicht kⁿmmern, denn dies macht der
  87. Editor fⁿr uns automatisch (wenn Ihr nicht gerade eine Halb-Alpha-Test-0.01-
  88. Vorversion habt!!). Das hei▀t, da▀ Ihr nur den Text einzugeben habt, und der
  89. Editor merkt, ob es mehr als 12 Zeichen sind und organisiert entsprechend den
  90. Icon-Bereich um. Dieser Modus, wenn im Icon-Bereich nur der Zeiger auf den
  91. Text abgelegt wird, hei▀t "indirected". So kann es natⁿrlich sein, da▀ Ihr in
  92. Eurem Editor erst einen Button drⁿcken mⁿ▀t, der diese Aufschrift hat. Ist dies
  93. der Fall, solltet Ihr Euch nach einem besseren Editor umsehen, denn das sollte
  94. er doch alleine schaffen!
  95.  
  96.  In meinem Beispiel oben gibt es nur zwei Icons, die mehr als 12 Zeichen
  97. enthalten:
  98.  ⌐ 1993 Martin Willers       und      0.00 (01-Jan-1993)
  99.  
  100. Den ersten Text gibt man einfach so ein, beim zweiten mⁿ▀t Ihr nun etwas
  101. aufpassen: Im Programm wird vorausgesetzt, da▀ dieses Icon auch mindestens
  102. 19 Zeichen aufnehmen kann. Reserviert Ihr dafⁿr weniger, so ⁿberschreibt das
  103. Programm eventuell nachfolgende Daten, was dann zu Fehlern, Abstⁿrzen etc.
  104. fⁿhren kann. Ihr mⁿ▀t also darauf achten, da▀ bei einem Icon, das im Programm
  105. noch verΣndert wird, mindestens soviel Platz reserviert ist, wie im Programm
  106. verlangt wird.
  107.  
  108. Zum ─ndern des Icon-Textes: GrundsΣtzlich kann nur der Text solcher Icons
  109. geΣndert werden, die in ihrem Icon-Block nur den Zeiger auf den Text haben.
  110. Steht der Text selber im Icon-Block, so KANN ER NICHT VER─NDERT WERDEN!!
  111. Wollt Ihr also den Text eines Icons Σndern, der weniger als 12 Zeichen hat,
  112. so mⁿ▀t Ihr bei der Erstellung des Icons darauf achten, da▀ explizit die
  113. "indirected"-Option angewΣhlt wird. Ist ein Icon indirected, so ist au▀er dem
  114. Zeiger auf den Text im Icon-Block noch die LΣnge des Textes und ein weiterer
  115. Zeiger abgelegt.
  116.  
  117.  Den Zeiger auf den Text habe ich schon erlΣutert, ich werde es nocheinmal tun,
  118. wenn wir das Template-File in unser Programm laden wollen.
  119.  Die Angabe der LΣnge des Textes wird in Bytes angegeben und ist verbindlich,
  120. d.h. kann auch nicht nachtrΣglich verΣndert werden. Natⁿrlich kann der Text
  121. kⁿrzer sein als diese LΣnge, denn dem Text eines Icons folgt immer eine
  122. Zeilenendkennung (&0D = ASCII 13 = <CR>).
  123.  Der zweite Zeiger ist nun ein Zeiger auf einen sog. "validation string".
  124. Dies ist eine Folge von bestimmten Zeichen, die bei der Darstellung des Icons
  125. eine bestimmte Wirkung ausⁿben. HauptsΣchlich ist dies fⁿr Icons interessant,
  126. die beschreibbar sind (writable), denn hier kann man bestimmte Tasten bei der
  127. Eingabe sperren, die Cursor-Tasten behandeln u.a. Doch ab RISC OS 3.00 kann
  128. einem Icon auch ein 3-dimensionaler Rahmen spendiert werden, sogar 3D-Buttons
  129. k÷nnen mit 2 simplen Zeichen in diesem "validation string" realisiert werden.
  130. Ihr k÷nnt das ganze einmal ausprobieren, wenn Ihr RO 3 habt: Leider unter-
  131. scheidet sich allerdings das Kommando fⁿr RO 3.00 von dem fⁿr RO 3.10 und
  132. spΣteren Versionen. Da aber ja wohl hoffentlich jeder 3.00-Besitzer inzwischen
  133. auf 3.1x umgestiegen ist, dⁿrften daraus ja wohl keine Probleme resultieren?!
  134. Fⁿgt einfach als validation string den Buchstaben "r" (RO 3.00: "b") mit nach-
  135. folgender Ziffer von 0-7 ein. Die Spanne reicht von "einfacher Rahmen" ⁿber
  136. "Relief-Rahmen" bis hin zu den z.B. aus Impression bekannten OK-Buttons mit
  137. gelbem Graben um den eigentlichen Button.
  138.  
  139. Habt Ihr Euer Window fertig, so speichert es unter dem Namen "Templates" in
  140. das !Program-Directory ab.
  141.  
  142.  
  143. Nun nehmt Euch wieder das Programm !Runimage vor:
  144. Wir brauchen zum Laden der Window-Definitionen zwei Speicherbl÷cke:
  145. -in den einen werden die reinen Window-Parameter und die Icon-Bl÷cke geladen
  146. -in den anderen werden alle Texte geladen, die "indirected" sind, deren
  147.  Zeiger also in den entsprechenden Icon-Bl÷cken stehen
  148.  
  149. Der zweite Block ist permanent, d.h. die Daten stehen immer dort drin, solange
  150. bis das Programm beendet wird. Aus diesem Grund k÷nnen wir auch diese Texte
  151. Σndern und nicht die anderen, die in den anderen Speicher geladen werden, wo
  152. sie nur zwischengelagert werden. Denn mit der Anweisung an den WIMP, diese
  153. Window-Definitionen auch als Window anzusehen, kopiert sich der WIMP diese
  154. Daten des ersten Blocks in eigene Speicherbereiche, auf die wir keinen Zugriff
  155. haben.
  156. Den indirected-icon-Speicher mⁿssen wir also wahren, wΣhrend der andere, der
  157. zum "Zwischenlagern" der Window-Definitionen benutzt wird, spΣter noch anderen
  158. Aufgaben zugefⁿhrt werden kann. Wir wollen uns also zu Anfang zwei weitere
  159. Bl÷cke reservieren, dazu Σndern wir Zeile 200 in:
  160.  
  161. 200  DIM pollblock% 256,menublock% 76,temp% 1024,indirected% 256,indirend% 0
  162.  
  163. womit wir als workspace-fⁿr-alles 1024 Bytes reservieren (temp%) und 256 Bytes
  164. fⁿr alle indirected icons, wo dann die Texte abgelegt werden. Die letzte
  165. Dimensionierung mit 0 mag vielleicht etwas komisch erscheinen, doch hat diese
  166. Definition das Resultat, da▀ die Variable "indirend%" auf das Ende des
  167. indirected%-Blockes zeigt. Wir brauchen fⁿr die Parameterⁿbergabe den Anfang
  168. und das Ende dieses indirected-Icons-Speicherblocks, wobei "indirected%" den
  169. Anfang und "indirend%" das Ende darstellt.
  170.  
  171. Wir wollen direkt vor der Menu-Definition die Window-Definitionen laden:
  172.  
  173. 203  is%=indirected%:ie%=indirend%
  174. 204  SYS "Wimp_OpenTemplate",,"<Program$Dir>.Templates"
  175. 205  SYS "Wimp_LoadTemplate",,temp%,is%,ie%,-1,"info",0 TO ,,is%
  176. 206  SYS "Wimp_CreateTemplate",,temp% TO window_info%
  177. 209  SYS "Wimp_CloseTemplate"
  178.  
  179. In Zeile 204 wird unser Template-File angemeldet, so da▀ alle folgenden Lese-
  180. Befehle sich auf dieses Template-File beziehen.
  181. In Zeile 205 werden dann die Daten fⁿr das Window mit dem Namen "info"
  182. geladen, und zwar in den zuvor reservierten Bereich temp%. Nicht dorthinein
  183. geladen werden die indirected-icon-texte, diese werden in den Block
  184. indirected% geladen (automatisch), und da der Zeiger auf diesen Block nach dem
  185. Laden verΣndert wird, um fⁿr das nachfolgend zu ladende Template wieder auf
  186. +freien+ Speicher zu zeigen, machen wir in Zeile 203 Kopien der Variablen
  187. indirected% und indirend%, damit wir diese Anfangswerte nicht verlieren.
  188. Die -1 besagt, da▀ +keine+ Outline-Fonts benutzt werden sollen, und die 0 als
  189. letzter Parameter lΣ▀t die Suche nach diesem Window mit Namen "info" ganz
  190. vorne im Template-File beginnen.
  191. Wieder ⁿbergeben wird nach dem TO wie oben schon erwΣhnt, der neue Zeiger auf
  192. den indirected-icon-workspace, nach dem letzten dorthin geschriebenen Zeichen.
  193. So k÷nnen wir diese Variable is% auch zum Lesen fⁿr alle folgenden Windows
  194. benutzen, da sie immer auf den restlichen freien Speicher dieses Blocks zeigt.
  195. Aufpassen mⁿ▀t Ihr, da▀ dafⁿr genug Speicher reserviert ist. Es ist zwar unter
  196. RO 3 m÷glich, vor dem Lesen in Erfahrung zu bringen, wieviel Platz wofⁿr
  197. verbraucht werden wird, doch m÷chte ich dies in diesem kleinen Programm nicht
  198. einbringen.
  199.  Nun liegt also die Window-Definition im Speicher ab temp%. In Zeile 206 werden
  200. diese Daten dann in ein vom WIMP erkanntes Window verwandelt. Der WIMP kopiert
  201. alle diese Daten in temp% in eigene Speicherbl÷cke (weshalb wir den Bereich
  202. ab temp% wieder ⁿberschreiben k÷nnen, z.B. mit dem nΣchsten Window), und
  203. weist unserem Window eine einmalige Zahl zu, das +Window-Handle+. Dieses legen
  204. wir in der Variablen "window_info%" ab, da es spΣter die einzige Referenz-
  205. m÷glichkeit auf dieses Window darstellt.
  206.  Mit Zeile 209 wird dann das ge÷ffnete Template-File wieder geschlossen. Wir
  207. brauchen es nicht mehr.
  208.  
  209. Das einzige, was wir nun noch machen mⁿssen, um das Window dargestellt zu
  210. bekommen, ist eine ─nderung in den Menu-Daten:
  211.  
  212. 240  EQUD &00:EQUD window_info%: ...
  213.  
  214. Erkennt der WIMP beim Erstellen eines Menus, da▀ das zweite Word eines Icons
  215. ungleich -1 ist, so sieht er es wahlweise als Window-Handle (1-&7FFF) oder
  216. als Submenu-Pointer (>=&8000) .
  217. Damit stellt der WIMP automatisch bei ╓ffnen des Menus einen Pfeil nach rechts
  218. dar, und wenn man mit der Maus auf diesen Pfeil kommt, ÷ffnet er das Window,
  219. dessen Window-Handle wir dort angegeben haben.
  220.  
  221. Probiert es aus, und Ihr merkt, da▀ das zwar alles klappt, da▀ Ihr jedoch das
  222. Window nicht herumbewegen k÷nnt. Dies liegt daran, da▀ wir das Bewegen von
  223. Windows bisher noch nicht vorgesehen haben. Es ist aber ganz einfach:
  224.  
  225. Bewegt man ein Window von einer Position in eine andere, so sucht sich der
  226. WIMP die Ziel-Koordinaten heraus und legt sie in einem Speicherbereich ab.
  227. Dann sendet er an unsere Applikation ein Open_Window_Request, damit wir unser
  228. Window an der neuen Position wieder aufbauen. Diese Daten legt er gⁿnstiger-
  229. weise in dem Block ab, den wir fⁿr alle Konversation mit dem WIMP reserviert
  230. haben und bei jedem Wimp_Poll ⁿbergeben. Er hei▀t bei uns "pollblock%".
  231. Wir brauchen jetzt nur noch den Befehl auszufⁿhren, ohne uns noch um irgend-
  232. welche Daten kⁿmmern zu mⁿssen, denn die liegen bereits alle an der richtigen
  233. Stelle. Wir Σndern also:
  234.  
  235. 700    WHEN 2 : SYS "Wimp_OpenWindow",,pollblock%
  236.  
  237. Dasselbe gilt fⁿr das Schlie▀en eines Windows mittels des Close-Icons; hier
  238. legt der WIMP das entsprechende Window-Handle im pollblock% ab und sendet ein
  239. Close_Window_Request:
  240.  
  241. 800    WHEN 3 : SYS "Wimp_CloseWindow",,pollblock%
  242.  
  243. Nun k÷nnen wir das Window frei bewegen.
  244.  
  245. In der nΣchsten Folge wollen wir dann das zweite Window auf den Bildschirm
  246. bringen. Zudem wollen wir z.B. die aktuelle Versionsnummer in das Info-Window
  247. schreiben, also Icons Σndern. Schlie▀lich werden wir das Menu aktivieren, so
  248. da▀ man mit AnwΣhlen des "Quit"-Eintrages das Programm beenden kann.
  249.  
  250.  
  251.                                                              - Martin Willers -
  252.  
  253.