Dialogboxen in GFA-BASIC Teil IV

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



Aus: ST-Computer 11 / 1987, Seite 72

Links

Copyright-Bestimmungen: siehe Über diese Seite