Tips und Tricks für GFA-Basic

Wie erzeuge ich unter GFA-Basic 3.x blinkenden Text auf dem Bildschirm?

Die Prozedur in Listing 1 löst diese Aufgabe mit dem Befehl »RC_COPY« bzw. »GET« und »PUT«. Mit dem Aufruf »@txt_flash( ... )« übergeben Sie nacheinander die x- und y-Koordinate des ersten Buchstabens. Darauf folgt die Anzahl der blinkenden Buchstaben, der Zeilen und die Blinkfrequenz. Der letzte Parameter gibt den Blinkmodus an. Ist »mod& = TRUE«, blinkt der Text invertiert, setzen Sie »mod& = FALSE«, löscht die Funktion den Text kurzzeitig.

Ein Benutzer kann mein Programm auch mittels Tastatur bedienen. Drückt der Anwender aber während einer Prozedur weiterhin eine Taste, führt der Computer nach dem Rücksprung die weiteren Eingaben aus. Wie kann ich diesen Effekt verhindern?

Die Atari ST und TT haben einen Tastaturpuffer. In ihm speichert der Computer jede Tastatureingabe. Befehle wie »INKEY$« holen sich dann aus diesem Puffer Informationen. Sobald der Benutzer ein Taste drückt, findet sich im Tastaturpuffer der entsprechende Wert. Wenn Sie »INKEY$« anwenden, holt sich der Befehl den ersten Wert aus dem Puffer. Um dem oben genannten Effekt entgegenzuwirken, genügt es, den Puffer vor Aufruf von »INKEY$« zu löschen. Dies erledigt der Befehl:

	LPOKE XBIOS (14, 1) +6, 0

Wie kann man einen beliebigen Text durch Einfügen, von je einem Leerzeichen strecken?

Mit der Prozedur »every_letter_space« in Listing 2 übergeben Sie den zu sperrenden Text. Zurück erhalten Sie die Variable »string$«, die den veränderten Text enthält. Mit »UPPFR$« wandelt die Prozedur vorher alle Buchstaben in Großbuchstaben um.

Ich möchte einen Text, der unter 1st Word Plus geschrieben und im WP-Modus gespeichert ist, in meinem Programm als normalen ASCII-Text verarbeiten. Wie kann ich ohne viel Aufwand die Merkmale des WP-Modus löschen?

Texte, die im WP-Modus gespeichert sind, enthalten Textattribute sowie ein Textlineal. Außerdem entsprechen die 1st Word Plus-eigenen Leerzeichen einem anderen ASCII-Code. Listing 3 löscht die Merkmale aus dem Text, beginnend mit den Linealen. Diese erkennt das Programm durch das vorangestellte Zeichen »CHR$(31)«. Danach ersetzen wir die 1st Word Plus-Leerstellen (CHR$(30))» durch »normale« Leerzeichen (CHR$(32)). Die Textattribute leitet 1st Word Plus durch das Escape-Zeichen ein, gefolgt vom Attribut-Byte, die das Programm zum Schluß behandelt.
(Sandro Lucifora/ah)

Textattribute von 1st Word Plus

Attribut ASCII-Code
Kein Attribut 27+128
Fett 27+129
Unterstrichen 27+136
Kursiv 27+132
Hell 27+130
Hoch 27+144
Tief 27+160
Fett + Unterstrichen 27+137
+ Kursiv 27+133
+ Hoch 27+145
+ Tief 27+161
Unterstrichen + Kursiv 27+140
+ Hell 27+183
+ Hoch 27+152
+ Tief 27+168
Kursiv + Hell 27+134
+ Hoch 27+148
+ Tief 27+164
Hell + Hoch 27+146
+ Tief 27+ 162
Listing 1: Blinkende Schrift mit GFA-Basic
REPEAT 			! Schleife ...
	@txt_flash (3, 3, 30, 1, 10, FALSE)	! ruft procedure auf
UNTIL INKEY$ <> „„	! ... bis taste gedrückt
EDIT				! zum editor
PROCEDURE txt_flash (tx%, ty%, anz.bs%, anz.z%, flash.frq%, mod&)
	LOCAL tf_x%, tf_y%, tf_w%, tf_h%, bh%, ret$
	bh%   = MUL (XBIOS (4), 8)	! Buchstabenhöhe ermitteln
	bb%   = MUL (XBIOS (4)+1, 6)	! Buchstabenbreite ermitteln
	tf_x% = MUL (tx%-1, 8)	! x-koordinate ermitteln
	tf_y% = MUL (ty%-1, bh%)	! y-koordinate ermitteln
	tf_w% = MUL (anz.bs%, 8)	! breite ermitteln
	tf_h% = MUL (anz.z%, bh%)	! höhe ermitteln
	IF mod&
		RC_COPY XBIOS (2), tf_x%, tf_y%, tf_w%, tf_h%
		TO XBIOS(2), tf_x%, tf_y%, 10	! feld invertieren
		PAUSE flash.frq%	! zeit abwarten
		RC_COPY XBIOS (2), tf_x%, tf_y%, tf_w%, tf_h%
		TO XBIOS (2), tf_x%, tf_y%, 10	! feld invertieren
		PAUSE flash.frq%	! zeit abwarten
	ELSE
		GET tf_x%, tf_y%, tf_x% + tf_w%, tf_y% + tf_h%, ret$
		DEFFILL 0, 0
		PBOX tf_x%, tf_y%, tf_x% + tf_w%, tf_y% + tf_h%
		PAUSE flash.frq%
		PUT tf_x%, tf_y%, ret$
		PAUSE flash.frq%	! zeit abwarten
	ENDIF
RETURN

Listing 2: Die Prozedur »every _letter_space« fügt nach jedem Zeichen eine Leerstelle ein @every_letter_space („TOS, die Zeitschrift für den ATARI ST/TT“)

PROCEDURE every_letter_space (string$)
	LOCAL i%
	string$ = UPPER$ (string$)
	FOR i% = LEN (string$) DOWNTO 1
		string$ = LEFT$ (string$, i%) + „ “
		+ RIGHT$ (string$, LEN(string$)-i%)
	NEXT i%
	string$ = TRIM$ (string$)	! Leerzeichen an den Seiten entfernen
RETURN

Listing 3: In 1st Word Plus geschriebene Texte in ASCII-Format wandeln

@init
FILESELECT „*.*“,““, file$
´
wahl$ = file$
IF wahl$ <>-““ AND EXIST (wahl$)
	@wp_filter (file$)
	´
	FOR z% = 1 TO textlaenge%
		PRINT text$ (z%)
	NEXT z%
	~INP(2)
ENDIF
´
EDIT
´
PROCEDURE init
	DIM text$ (60)
RETURN
PROCEDURE wp_filter(wahl$)
	OPEN „i“‚ #1, wahl$
	textlaenge% = 0
	WHILE EOF (#1) <> TRUE
		INC textlaenge%
		INPUT #1, text$ (z%)
	WEND
	CLOSE #1
	@filtern
RETURN
´
PROCEDURE filtern
	LOCAL z%, zz%
	FOR z% = 1 TO textlaenge%
		WHILE ASC (LEFT$ (text% (z%))) = 31
			@zeile_loeschen (z%)
		WEND
		@varspace
		@attribute
	NEXT z%
RETURN
´
PROCEDURE zeile_loeschen (znr%)
	LOCAL z%
	DEC textlaenge%
	FOR z% = znr% TO textlaenge%
		text$ (z%) = text$ (z%+1)
	NEXT z%
RETURN
´
PROCEDURE varspace
	LOCAL pos%
	REPEAT
		pos% = INSTR (text$ (z%), CHR$(30))
		MID$ (text$(z%),pos%) - CHR$(32)
	UNTIL pos% = 0
RETURN
´
PROCEDURE attribute
	LOCAL pos%
	DO
		pos% = INSTR (text$(z%), CHR$(27))
		EXIT IF pos% = 0
		text$(z%) = LEFT$(text$ (z%), pos% - 1)
		            + RIGHT$ (text$(z%), LEN text$(z%)) - pos% -1)
	LOOP
RETURN


Aus: TOS 05 / 1991, Seite 93

Links

Copyright-Bestimmungen: siehe Über diese Seite