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