← ST-Computer 11 / 1987

Dialogboxen in GFA-BASIC Teil IV

Kurs

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