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

Links

Copyright-Bestimmungen: siehe Über diese Seite