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