Nachdem wir nun eine Ausgabe ausgesetzt haben, wollen wir im nunmehr letzten Teil unserer Serie noch einmal zwei kleine Beispiele zur Programmierung von Dialogboxen bringen. Mit den Routinen, die in den somit vier Teilen dieses Grundlagenkurses vorgestellt wurden, sollte es nun jedem möglich sein, selbsterstellte Dialogboxen zu verwalten.
Zuerst wollen wir ein letztes Mal eine notwendige Prozedur beschreiben, die unsere Sammlung an Routinen vervollstÀndigen sollen.
Eine neue Prozedur
Put_dialogtext - Schreiben eines Textstrings in ein EDIT-Feld
Put_dialogtext(Baum_adresse%, Objektindex%, Text$, *Textadresse%)
Mittels dieser Routine lĂ€Ăt sich ein beliebiger Textstring in ein EDIT-Feld schreiben. Sie bietet somit das genaue GegenstĂŒck zur bereits vorgestellten Routine Get_dialogtext. NatĂŒrlich muĂ man darauf achten, ob irgendwelche EinschrĂ€nkungen bei den Zeichen des EDIT-Feldes bestehen, also zum Beispiel, daĂ nur Zahlen oder GroĂbuchstaben beim Erstellen der Dialogbox zugelassen werden. Die Routine kann auch anstatt der Routine Ptadr verwendet werden, da sie ebenfalls die Textadresse im Speicher zurĂŒckgibt und es wenig Sinn hĂ€tte, den Cursor an den Anfang des EDIT-Feldes zu setzen (siehe Teil 1 in der Juni-Ausgabe).
Als Parameter benötigen wir die Baum_adresse, den Objektindex des EDIT-Feldes, sowie den eigentlichen Textstring, der in der Dialogbox erscheinen soll. ZurĂŒckgegeben wird dann nach der Abarbeitung der Routine die Textadresse in der Objektstruktur.
Schreiben in ein EDIT-Feld
Dieses kleine Beispiel zeigt uns wie man EDIT-Felder in Dialogboxen mit einem Text vorbelegen kann. Normalerweise ist dies bereits im Resource Construction Set möglich, doch viele Anwendungen erfordern, daĂ diese Vorbelegung erst im eigentlichen Programm stattfindet. In unserem Beispiel wird zum Beispiel das aktuelle Systemdatum ausgelesen und anschlieĂend als Vorschlag in die Dialogbox geschrieben. Es besteht dann die Möglichkeit, das Datum noch zu Ă€ndern, falls der Vorschlag keinen Gefallen findet. Am Ende wird das EDIT-Feld dann wieder ausgelesen, um zu sehen, ob sich das Datum geĂ€ndert hat.
Im ersten Programmbeispiel werden folgende Routinen benutzt: Rsrc_load, Rsrc_gaddr, Box_draw, Form_do, Form_center, Form_dial, Objc_draw, Rsrc_free, Box_undraw, Put_dialogtext, Get_dialogtext, Undo_objc.
Numero Zwo
Das zweite Beispiel erfordert keine neuen Prozeduren, da nur alte Bekannte verwendet wurden, die schon ausreichend in vorherigen Folgen besprochen wurden. Gezeigt werden soll die Manipulierung des Objektstatusflags DISABLED und wie man leicht eine ZĂ€hlbox erstellen kann, die per Maus gesteuert wird.
Zur Konstruktion
ZunÀchst benötigen wir in unserer Dialogbox die Objektelemente Boxchar, G_Box und String (siehe Bild 2). Wichtig ist das die beiden Boxchar-Objekte als TOUCHEXIT erklÀrt werden, damit die Form_do-Routine unterbrochen werden kann, wenn man auf sie klickt und somit die Möglichkeit besteht, den String zu verÀndern bzw. um zÀhlen zu können.
Bild 1:
Ferner ist es wichtig zu wissen, daĂ wir die Buttons Hundert und Tausend bereits im RCS als DISABLED erklĂ€rt haben. Dies kann man natĂŒrlich auch vom Programm aus machen und soll hier nur als ErklĂ€rung dienen.
Die ganze Box funktioniert nun folgendermaĂen. Man klickt einfach auf eines der beiden Boxchar-Objekte (< oder >) und sofort wird die Zahl in dem Feld zwischen ihnen herauf- oder heruntergezĂ€hlt. Je nachdem welchen Wert die Zahl gerade hat, werden die Buttons durch Setzen oder Löschen des DISABLED-Flags dis- oder reaktiviert. Zahlen werden im Beispiel nur bis zu drei Ziffern (max. 999) zugelassen. AuĂerdem sind nur positive Zahlen erlaubt. Die BeschrĂ€nkungen gelten natĂŒrlich nur fĂŒr unser Beispiel. Wer gerne negative Zahlen benutzt, kann dies selbstverstĂ€ndlich in eigenen Programmen tun, muĂ aber auf die Stellenzahl des Strings achten.
In diesem Programmbeispiel werden folgende Routinen benutzt: Rsrc_load, Rsrc_gaddr, Box_draw, Form_do, Form_center, Form_dial, Objc_draw, Rsrc_free, Box_undraw, Put_dialogtext, Get_dialogtext, Do_objc, Set_string, Objc_update, Undo_objc, Objc_offset, Get_objc_xywh.
Nach den ĂŒblichen Rsrc-Prozeduren erfolgt ein normales Box_draw mit Bildschirmhintergrund retten. Danach muĂ das Retten des Hintergrunds aber sofort wieder abgeschaltet werden (Rette = 0), da ansonsten bei jedem Aufruf von Objc_draw ein Retten erfolgen wĂŒrde. Objc_draw wird ja auch von anderen Prozeduren wie z. B. Objc_update benutzt.
Die Hauptroutine lĂ€uft in einer Do... Loop-Schleife und verlĂ€Ăt diese nur, wenn der weiter-Button angeklickt wurde. In der Schleife werden andauernd die beiden Boxchar-Objekte abgefragt. Wird eines angeklickt, erhöht bzw. erniedrigt sich der ZĂ€hler, der neue Wert wird in den String der ZĂ€hlbox geschrieben und die ZĂ€hlbox mit Objc update neu gezeichnet. Gleichzeitig wird der Wert abgefragt und die drei Buttons (0-10,11 -100,101-1000) werden entsprechend aktiviert bzw. disaktiviert. Damit die Abfrage sowohl beim Erhöhen als auch beim Erniedrigen funktioniert, wurde das Hilfsflag Disable eingefĂŒhrt. Da jedesmal alle drei Buttons neu gezeichnet werden mĂŒssen, haben wir dies in einer Prozedur am Ende des Programms erledigt, die jedesmal aufgerufen wird.
So, nun sind wir am Ende unseres Kurses angekommen. Hoffentlich haben wir nicht zu viele ST Leser gelangweilt, so daĂ nur ein lautes Aufatmen zu hören ist. Sie können uns ja einmal schreiben, was Ihnen an dieser Serie ge- bzw. miĂfallen hat. In diesem Sinne wĂŒnschen wir Ihnen viel SpaĂ beim weiteren Programmieren!
(HE)
' ********************************
' * *
' * Dialogboxen in GFA-BASIC *
' * *
' * Teil IV HE *
' * *
' * Schreiben in ein EDIT-Feld *
' * *
' ********************************
'
Baum=0 ! TREE
Ok=4 ! OBJECT in TREE #0
Datum=3 ! OBJECT in TREE #0
'
Gosub Rsrc_load("nov871.rsc",*Fehler%)
If Fehler%=0 Then
Print "RSC-Ladefehler"
End
Endif
'
Gtype%=0
Gindex%=Baum
Gosub Rsrc_gaddr(Gtype%,Gindex%,*Baum_adr)
'
Datum$ = Left$(Date$,2)+Mid$(Date$,4,2)+Right$(Date$,4)
Gosub Put_dialogtext(Baum_adr,Datum,Datum$,*Txt_adr)
Gosub Box_draw(Baum_adr,0,0,0,0)
Gosub Form_do(Baum_adr,Datum,*Ex_obj%)
Gosub Box_undraw(Baum_adr,0.0,0,0)
Gosub Undo_objc(Baum adr,Ex obj%,1)
Gosub Get_dia1ogtext(Txtadr,*Txt$)
Txt$=Left$(Txt$,2)+"."+Mid$(Txt$,3,2)+"."+Right$(Txt$,4)
Alert 1,"Der Text lautet :! !"+Txt$,1,"weiter",A
Gosub Rsrcfree
End
Procedure Put_dialogtext(Tree%,Obj_index%,Txt$,Txt_adresse)
'
Te_ptext=0
Obj_adresse%=Tree%+24 *Obj_index%
Tedinfo_adresse%=Lpeek(Obj_adresse%+12)
Txt_adresse%=Lpeek(Tedinfo_adresse%+Te_ptext)
I=0
While I<Len(Txt$)
Poke Txt_adresse%+I,Asc(Mid$(Txt$,I+1,1) )
Inc I
Wend
*Txt_adresse=Txt_adresse%
Return
Listing 1: Schreiben in ein Edit-Feld
Bild 2:
' *******************************
' * *
' * Dialogboxen in GFA-BASIC *
' * *
' * Teil IV (ZĂ€hlen & Disabled) *
' * HE *
' * *
' *******************************
'
Baum=0 ! TREE
Kleiner=4 ! OBJECT in TREE #0
Zaehlbox=5 ! OBJECT in TREE #0
Zahl=6 ! OBJECT in TREE #0
Groesser=7 ! OBJECT in TREE #0
Zehn=8 ! OBJECT in TREE #0
Hundert=9 ! OBJECT in TREE #0
Tausend=10 ! OBJECT in TREE #0
Ok=11 ! OBJECT in TREE #0
'
Gosub Rsrc_load("nov872.rsc",*Fehler%)
If Fehler%=0 Then
Print "RSC-Ladefehler"
End
Endif
'
Gtype%=0
Gindex%=Baum
Gosub Rsrc_gaddr(Gtype%,Gindex%,*Baum_adr)
'
Rette=1
Gosub Box_draw(Baum_adr,0,0,0,0)
Rette=0
Do
Exit If Ex_obj%*Ok
Gosub Formdo(Baum_adr,0,*Ex_obj%)
Zaehler_a1t = Zaehler
If Ex_obj%=Kleiner And Zaehler>0 Then
Dec Zaehler
Endif
If Ex_obj%=Groesser And Zaehler<1000 Then
Inc Zaehler
Endif
If Zaehler<11 And Zaehler<1000 And Disable=0 Then
Gosub Undo_objc(Baum_adr,Zehn,8)
Gosub Do_objc(Baum_adr,Hundert,8)
Gosub Do_objc(Baum_adr,Tausend,8)
Gosub Disable_update
Disable=1
Endif
If Zaehler<101 And Zaehler>10 And Disable*l Then
If Disable=1 And Zaehleralt<101 Then
Disable=0
Else
Disable=0
Endif
Gosub Do_objc(Baum_adr,Zehn,8)
Gosub Undo_objc(Baum_adr,Hundert,8)
Gosub Do_objc(Baum_adr,Tausend,8)
Gosub Disable_update
Endif
If Zaehler<1001 And Zaehler>100 And Disable=0 Then
Gosub Do_objc(Baum_adr,Zehn,8)
Gosub Do_objc(Baum_adr,Hundert,8)
Gosub Undo_objc(Baum_adr,Tausend,8)
Gosub Disableupdate
Disable=1
Endif
Zaehler$=Str$(Zaehler)
Gosub Set_string(Baum_adr,Zahl,Zaehler$,A)
Gosub Objc_update(Baum_adr,Zaehlbox)
Loop
Gosub Box_undraw(Baum_adr,0,0,0,0)
Gosub Undo_objc(Baum_adr,Ex_obj%,1)
Gosub Rsrc_free
End
Procedure Disableupdate
'
Gosub Objc_update(Baum_adr,Zehn)
Gosub Objc_update(Baum_adr,Hundert)
Gosub Objc_update(Baum_adr,Tausend)
Return
Listing 2: ZĂ€hlen und Disabled