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 >
Wrap
Text File
|
1993-11-22
|
14KB
|
253 lines
ÿÿÿÿÿÿÿÿÿÿ Programmieren des WIMP ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Teil 5.
In der letzten Folge haben wir das normale Icon-Menu erstellt, mit den beiden
Standard-EintrΣgen "Info" und "Quit". Weder k÷nnen wir allerdings durch An-
wΣhlen des Quit-Eintrages das Programm beenden, noch erscheint rechts vom
"Info"-Eintrag der kleine Pfeil, der zu dem Info-Window fⁿhrt.
Das AmwΣhlen des Quit-Eintrages werde ich in der nΣchsten Folge behandeln,
womit dann das Programm auch schon fast beendet wΣre. Das ist natⁿrlich leicht,
da es ja nichts macht, au▀er "da" zu sein. Das wollen wir nun Σndern:
In dieser Folge werden wir also ein Window kreieren, und zwar das "Info"-
Window.
Es gibt nun zwei prinzipiell verschiedene Methoden, um ein Window zu erstellen
und in sein Programm einzubinden:
a) man erstellt es mit einem Template-Editor (!FormEd, !TemplEd, u.v.a.m.)
und lΣdt die damit erstellten Template-Files in sein Programm ein
b) man legt die Window-Definitionen fest im Programmcode selbst ab, mittels
DATA, EQUD oder wie auch immer
Ich werde hier nur Methode a) besprechen, da sie die einfachste ist und zudem
auch die Methode, die in beinahe allen Programmen verwendet wird. Au▀erdem
hat man zu jeder Zeit einfachen Zugriff auf die Templates und kann sie beliebig
Σndern, was bei Methode b) etwas schwierig werden kann, da man hier nur auf
unzΣhlige Zahlen blickt, und ─nderungen z.T. nur durch Ausprobieren so werden
wie man sie haben m÷chte.
Zudem kann jeder, wenn er denn auf Methode b) besteht, sein Template-File
nachtrΣglich noch mit z.B. DATA in sein Programm einbinden, wenn er denn kein
Template-File haben m÷chte.
Ein von mir erstelltes Template-File liegt dieser Ausgabe des HL bei (im
"Examples"-Directory), so da▀ Ihr nicht unbedingt auf den Template-Editor
angewiesen seid und Euch nicht mit der Erstellung abquΣlen mⁿ▀t.
Da es au▀erdem mit einigen Editoren unm÷glich ist, rein durch meine ErklΣrungen
zu denselben Windows zu kommen wie ich, werde ich nur erklΣren, wie das
Window ungefΣhr aussehen soll. Die einzige ▄bereinstimmung mu▀ darin bestehen,
da▀ bestimmte Icons, die noch im Laufe des Programmes verΣndert werden, auch
dieselbe Icon-Nummer besitzen, wie ich sie hier vorgebe, damit im Programm,
wo auf ein Icon immer ⁿber seine Icon-Nummer Bezug genommen wird, auch das
richtige Icon angesprochen wird.
Wir nehmen uns also den Template-Editor (z.B. !FormEd) vor und erstellen ein
Window mit Namen "info". Dieses ÷ffnen wir nun. Es dⁿrfte noch alle Icons
haben, die ein Window haben kann, d.h. Back-,Quit-,Toggle-,Size-Icon und
beide Scrollbars. Wir brauchen fⁿr unser Info-Window nichts davon, also ist
unsere erste Aktion die, da▀ wir alle Icons entfernen, au▀er einer Scrollbar
und dem Size-Icon (das ist das in der rechten unteren Ecke).
Nun ziehen wir mit dem Size-Icon das Window auf ungefΣhr die Gr÷▀e, die unser
Info-Window haben soll, auf. Ich habe hier in x-Richtung 636, in y-Richtung
-216, das braucht Ihr aber keineswegs genauso zu machen. Die Gr÷▀e ist bei
diesem Window sogar v÷llig egal, da es vom WIMP automatisch ge÷ffnet wird
(dazu komme ich spΣter). Dann begrenzen wir den Work-Area auf diese Gr÷▀e,
und nun k÷nnen wir auch die Scrollbar und das Size-Icon entfernen. Damit haben
wir das Window in der Form wie es spΣter erscheinen soll.
Der Text in der Window-Titelzeile soll Acorn-konform "About this Program"
hei▀en.
Nun k÷nnen wir schon daran gehen, die Icons zu erstellen, die dann das
typische Info-Window darstellen:
Name: Program
Purpose: Just a test
Author: ⌐ 1993 Martin Willers
Version: 0.00 (01-Jan-1993)
Bei diesem Window ist nur eines wichtig: Das Icon mit der Versionsnummer +mu▀+
die Nummer 3 haben, darauf ist das Programm ausgelegt, das spΣter hier die
aktuelle Versionsnummer hineinschreibt. Ansonsten habt Ihr freie Hand, was
die Gestaltung angeht. Ihr k÷nnt auch mehr als die 8 Icons benutzen, die ich
hier vorgesehen habe. Das geht deshalb, weil dies ein passives Window ist, das
keine weitere AktivitΣt erlaubt, sondern nur angeschaut wird. Ihr k÷nnt auch
die Reihenfolge der Icons wild durcheinanderwⁿrfeln, solange das Icon #3 die
Versionsnummer beinhaltet.
Bei der Erstellung der Icons ist zu beachten, da▀ die richtige Anzahl an Bytes
fⁿr den Text reserviert wird. Jedes Icon kann bis zu 12 Zeichen Text enthalten
(inklusive Text-Endkennung, also normalerweise <CR>). M÷chte man mehr Text
als diese 12 Zeichen, so reicht dafⁿr der reservierte Bereich fⁿr ein Icon
nicht aus, und in diesem Icon-Bereich wird nur der Zeiger auf den eigentlichen
Text abgelegt. Darum mⁿssen wir uns aber nicht kⁿmmern, denn dies macht der
Editor fⁿr uns automatisch (wenn Ihr nicht gerade eine Halb-Alpha-Test-0.01-
Vorversion habt!!). Das hei▀t, da▀ Ihr nur den Text einzugeben habt, und der
Editor merkt, ob es mehr als 12 Zeichen sind und organisiert entsprechend den
Icon-Bereich um. Dieser Modus, wenn im Icon-Bereich nur der Zeiger auf den
Text abgelegt wird, hei▀t "indirected". So kann es natⁿrlich sein, da▀ Ihr in
Eurem Editor erst einen Button drⁿcken mⁿ▀t, der diese Aufschrift hat. Ist dies
der Fall, solltet Ihr Euch nach einem besseren Editor umsehen, denn das sollte
er doch alleine schaffen!
In meinem Beispiel oben gibt es nur zwei Icons, die mehr als 12 Zeichen
enthalten:
⌐ 1993 Martin Willers und 0.00 (01-Jan-1993)
Den ersten Text gibt man einfach so ein, beim zweiten mⁿ▀t Ihr nun etwas
aufpassen: Im Programm wird vorausgesetzt, da▀ dieses Icon auch mindestens
19 Zeichen aufnehmen kann. Reserviert Ihr dafⁿr weniger, so ⁿberschreibt das
Programm eventuell nachfolgende Daten, was dann zu Fehlern, Abstⁿrzen etc.
fⁿhren kann. Ihr mⁿ▀t also darauf achten, da▀ bei einem Icon, das im Programm
noch verΣndert wird, mindestens soviel Platz reserviert ist, wie im Programm
verlangt wird.
Zum ─ndern des Icon-Textes: GrundsΣtzlich kann nur der Text solcher Icons
geΣndert werden, die in ihrem Icon-Block nur den Zeiger auf den Text haben.
Steht der Text selber im Icon-Block, so KANN ER NICHT VER─NDERT WERDEN!!
Wollt Ihr also den Text eines Icons Σndern, der weniger als 12 Zeichen hat,
so mⁿ▀t Ihr bei der Erstellung des Icons darauf achten, da▀ explizit die
"indirected"-Option angewΣhlt wird. Ist ein Icon indirected, so ist au▀er dem
Zeiger auf den Text im Icon-Block noch die LΣnge des Textes und ein weiterer
Zeiger abgelegt.
Den Zeiger auf den Text habe ich schon erlΣutert, ich werde es nocheinmal tun,
wenn wir das Template-File in unser Programm laden wollen.
Die Angabe der LΣnge des Textes wird in Bytes angegeben und ist verbindlich,
d.h. kann auch nicht nachtrΣglich verΣndert werden. Natⁿrlich kann der Text
kⁿrzer sein als diese LΣnge, denn dem Text eines Icons folgt immer eine
Zeilenendkennung (&0D = ASCII 13 = <CR>).
Der zweite Zeiger ist nun ein Zeiger auf einen sog. "validation string".
Dies ist eine Folge von bestimmten Zeichen, die bei der Darstellung des Icons
eine bestimmte Wirkung ausⁿben. HauptsΣchlich ist dies fⁿr Icons interessant,
die beschreibbar sind (writable), denn hier kann man bestimmte Tasten bei der
Eingabe sperren, die Cursor-Tasten behandeln u.a. Doch ab RISC OS 3.00 kann
einem Icon auch ein 3-dimensionaler Rahmen spendiert werden, sogar 3D-Buttons
k÷nnen mit 2 simplen Zeichen in diesem "validation string" realisiert werden.
Ihr k÷nnt das ganze einmal ausprobieren, wenn Ihr RO 3 habt: Leider unter-
scheidet sich allerdings das Kommando fⁿr RO 3.00 von dem fⁿr RO 3.10 und
spΣteren Versionen. Da aber ja wohl hoffentlich jeder 3.00-Besitzer inzwischen
auf 3.1x umgestiegen ist, dⁿrften daraus ja wohl keine Probleme resultieren?!
Fⁿgt einfach als validation string den Buchstaben "r" (RO 3.00: "b") mit nach-
folgender Ziffer von 0-7 ein. Die Spanne reicht von "einfacher Rahmen" ⁿber
"Relief-Rahmen" bis hin zu den z.B. aus Impression bekannten OK-Buttons mit
gelbem Graben um den eigentlichen Button.
Habt Ihr Euer Window fertig, so speichert es unter dem Namen "Templates" in
das !Program-Directory ab.
Nun nehmt Euch wieder das Programm !Runimage vor:
Wir brauchen zum Laden der Window-Definitionen zwei Speicherbl÷cke:
-in den einen werden die reinen Window-Parameter und die Icon-Bl÷cke geladen
-in den anderen werden alle Texte geladen, die "indirected" sind, deren
Zeiger also in den entsprechenden Icon-Bl÷cken stehen
Der zweite Block ist permanent, d.h. die Daten stehen immer dort drin, solange
bis das Programm beendet wird. Aus diesem Grund k÷nnen wir auch diese Texte
Σndern und nicht die anderen, die in den anderen Speicher geladen werden, wo
sie nur zwischengelagert werden. Denn mit der Anweisung an den WIMP, diese
Window-Definitionen auch als Window anzusehen, kopiert sich der WIMP diese
Daten des ersten Blocks in eigene Speicherbereiche, auf die wir keinen Zugriff
haben.
Den indirected-icon-Speicher mⁿssen wir also wahren, wΣhrend der andere, der
zum "Zwischenlagern" der Window-Definitionen benutzt wird, spΣter noch anderen
Aufgaben zugefⁿhrt werden kann. Wir wollen uns also zu Anfang zwei weitere
Bl÷cke reservieren, dazu Σndern wir Zeile 200 in:
200 DIM pollblock% 256,menublock% 76,temp% 1024,indirected% 256,indirend% 0
womit wir als workspace-fⁿr-alles 1024 Bytes reservieren (temp%) und 256 Bytes
fⁿr alle indirected icons, wo dann die Texte abgelegt werden. Die letzte
Dimensionierung mit 0 mag vielleicht etwas komisch erscheinen, doch hat diese
Definition das Resultat, da▀ die Variable "indirend%" auf das Ende des
indirected%-Blockes zeigt. Wir brauchen fⁿr die Parameterⁿbergabe den Anfang
und das Ende dieses indirected-Icons-Speicherblocks, wobei "indirected%" den
Anfang und "indirend%" das Ende darstellt.
Wir wollen direkt vor der Menu-Definition die Window-Definitionen laden:
203 is%=indirected%:ie%=indirend%
204 SYS "Wimp_OpenTemplate",,"<Program$Dir>.Templates"
205 SYS "Wimp_LoadTemplate",,temp%,is%,ie%,-1,"info",0 TO ,,is%
206 SYS "Wimp_CreateTemplate",,temp% TO window_info%
209 SYS "Wimp_CloseTemplate"
In Zeile 204 wird unser Template-File angemeldet, so da▀ alle folgenden Lese-
Befehle sich auf dieses Template-File beziehen.
In Zeile 205 werden dann die Daten fⁿr das Window mit dem Namen "info"
geladen, und zwar in den zuvor reservierten Bereich temp%. Nicht dorthinein
geladen werden die indirected-icon-texte, diese werden in den Block
indirected% geladen (automatisch), und da der Zeiger auf diesen Block nach dem
Laden verΣndert wird, um fⁿr das nachfolgend zu ladende Template wieder auf
+freien+ Speicher zu zeigen, machen wir in Zeile 203 Kopien der Variablen
indirected% und indirend%, damit wir diese Anfangswerte nicht verlieren.
Die -1 besagt, da▀ +keine+ Outline-Fonts benutzt werden sollen, und die 0 als
letzter Parameter lΣ▀t die Suche nach diesem Window mit Namen "info" ganz
vorne im Template-File beginnen.
Wieder ⁿbergeben wird nach dem TO wie oben schon erwΣhnt, der neue Zeiger auf
den indirected-icon-workspace, nach dem letzten dorthin geschriebenen Zeichen.
So k÷nnen wir diese Variable is% auch zum Lesen fⁿr alle folgenden Windows
benutzen, da sie immer auf den restlichen freien Speicher dieses Blocks zeigt.
Aufpassen mⁿ▀t Ihr, da▀ dafⁿr genug Speicher reserviert ist. Es ist zwar unter
RO 3 m÷glich, vor dem Lesen in Erfahrung zu bringen, wieviel Platz wofⁿr
verbraucht werden wird, doch m÷chte ich dies in diesem kleinen Programm nicht
einbringen.
Nun liegt also die Window-Definition im Speicher ab temp%. In Zeile 206 werden
diese Daten dann in ein vom WIMP erkanntes Window verwandelt. Der WIMP kopiert
alle diese Daten in temp% in eigene Speicherbl÷cke (weshalb wir den Bereich
ab temp% wieder ⁿberschreiben k÷nnen, z.B. mit dem nΣchsten Window), und
weist unserem Window eine einmalige Zahl zu, das +Window-Handle+. Dieses legen
wir in der Variablen "window_info%" ab, da es spΣter die einzige Referenz-
m÷glichkeit auf dieses Window darstellt.
Mit Zeile 209 wird dann das ge÷ffnete Template-File wieder geschlossen. Wir
brauchen es nicht mehr.
Das einzige, was wir nun noch machen mⁿssen, um das Window dargestellt zu
bekommen, ist eine ─nderung in den Menu-Daten:
240 EQUD &00:EQUD window_info%: ...
Erkennt der WIMP beim Erstellen eines Menus, da▀ das zweite Word eines Icons
ungleich -1 ist, so sieht er es wahlweise als Window-Handle (1-&7FFF) oder
als Submenu-Pointer (>=&8000) .
Damit stellt der WIMP automatisch bei ╓ffnen des Menus einen Pfeil nach rechts
dar, und wenn man mit der Maus auf diesen Pfeil kommt, ÷ffnet er das Window,
dessen Window-Handle wir dort angegeben haben.
Probiert es aus, und Ihr merkt, da▀ das zwar alles klappt, da▀ Ihr jedoch das
Window nicht herumbewegen k÷nnt. Dies liegt daran, da▀ wir das Bewegen von
Windows bisher noch nicht vorgesehen haben. Es ist aber ganz einfach:
Bewegt man ein Window von einer Position in eine andere, so sucht sich der
WIMP die Ziel-Koordinaten heraus und legt sie in einem Speicherbereich ab.
Dann sendet er an unsere Applikation ein Open_Window_Request, damit wir unser
Window an der neuen Position wieder aufbauen. Diese Daten legt er gⁿnstiger-
weise in dem Block ab, den wir fⁿr alle Konversation mit dem WIMP reserviert
haben und bei jedem Wimp_Poll ⁿbergeben. Er hei▀t bei uns "pollblock%".
Wir brauchen jetzt nur noch den Befehl auszufⁿhren, ohne uns noch um irgend-
welche Daten kⁿmmern zu mⁿssen, denn die liegen bereits alle an der richtigen
Stelle. Wir Σndern also:
700 WHEN 2 : SYS "Wimp_OpenWindow",,pollblock%
Dasselbe gilt fⁿr das Schlie▀en eines Windows mittels des Close-Icons; hier
legt der WIMP das entsprechende Window-Handle im pollblock% ab und sendet ein
Close_Window_Request:
800 WHEN 3 : SYS "Wimp_CloseWindow",,pollblock%
Nun k÷nnen wir das Window frei bewegen.
In der nΣchsten Folge wollen wir dann das zweite Window auf den Bildschirm
bringen. Zudem wollen wir z.B. die aktuelle Versionsnummer in das Info-Window
schreiben, also Icons Σndern. Schlie▀lich werden wir das Menu aktivieren, so
da▀ man mit AnwΣhlen des "Quit"-Eintrages das Programm beenden kann.
- Martin Willers -