Tips und Tricks für GFA-Programmierer

In immer mehr kommerziellen und Shareware-Programmen ist zu sehen, daß sich der Mauszeiger mit einem Symbol (z.B. Drucker oder Diskette) an die gerade ausgeführte Aktion anpasst. Wie ist das in GFA-Basic zu verwirklichen ?

Um den Mauszeiger zu verändern, existiert in GFABasic der Befehl »DEFMOUSE x«. Feste Werte für die bekannten Formen wie Pfeil, Biene, zeigende und offene Hand, Fadenkreuze usw. sind vom Betriebssystem vordefiniert. Wollen Sie eine eigene Mausform verwenden, müssen Sie ein eigenes Bitmuster aus 37 Worten übergeben. Im ersten Wort steht die x-Koordinate des »Hot Spot«, bezogen auf die 16x16 große Darstellfäche des Mauszeigers. Der zweite Wert enthält die y-Koordinate. Diese Koordinaten geben an, an welchem Punkt eine Aktion ausgeführt wird, wenn Sie etwa einen Rahmen aufziehen oder einen Punkt setzen. Wort drei enthält den Wert »1 «. In der Wortgröße vier und fünf geben Sie die Masken- und Cursorfarbe an. Hiernach folgen zwei Bitmuster mit je 16 Wörtern, die das Aussehen des Mauszeigers bestimmen.

Die Mausdaten setzen sich aus einem 16 x 16 großen Bitmuster zusammen. Jedem horizontal gesetzten Bit ist der entsprechende Wert aus dem Dualsystem zugeordnet. Bit 0 erhält demnach den Wert 1, Bit 1 den Wert 2, Bit 2 den Wert 4 usw. Sie müssen also nur die Werte der gesetzten Bits aufaddieren und die so gewonnenen Zahlen dem Bitmuster der neuen Mausform mit »MKI$ (wert%)« übergeben. Nach dem gleichen Schema berechnen Sie die Maske des neuen Mauszeigers. Sie sorgt zum Beispiel dafür, daß der Desktop nicht durch die Mausform schimmert. Die eigene Mausform läßt sich dann durch »DEFMOUSE neue_form$« aufrufen.

Zum besseren Verständnis sehen Sie in unserem Listing, wie einfach es ist, eigene Mausformen zu benutzen. Einige fertige Mausformen, wie Diskette, Lupe, Drucker, Telefonscheibe und acht animierte Formen einer Sanduhr sind schon vorhanden. Die neuen Mauszeiger setzen Sie mit »@defmouse (nr%)«. In nr% steht dabei der Wert für die neuen Mauszeiger. Die 10 für die Diskette, 11 für die Lupe, 12 für den Drucker, 13 für die Telefonscheibe und 14 bis 19 für die acht Animationsstufen der Sanduhr. Auf der TOS-Diskette finden Sie eine Datei »MOUSEBIT.IMG«. Sie beinhaltet ein Raster mit 16 x 16 Kästchen. Dieses läßt sich ohne Probleme mehrfach ausdrucken. Das hilft sehr beim Entwerfen der eigenen Mausform.

In meinem Programm, das sich nur über die Tastatur bedienen läßt, verwende ich die Befehle »ON MENU KEY GOSUB ... « und »taste%=ASC(INKEY$)«. Obwohl ich am Programmanfang, vor und nach jeder Tastaturabfrage mit »HIDEM« den Mauszeiger verschwinden lasse, erscheint er immer wieder. Wie kann ich das umgehen?

Diesen Effekt haben Sie GFA-Basic zu verdanken. Immer wenn der Tastaturpuffer abgefragt wird, schaltet GFA-Basic den Mauszeiger ein. Da es im oben beschriebenen Fall nur um die optische Präsenz der Maus geht, läßt sich dies mit einem kleinen Trick umgehen. Mit unserem Listing definieren wir zum Programmanfang den Mauszeiger neu, jedoch als völlig leere Fläche. Das bedeutet, daß zwar der Mauszeiger und seine Funktion noch aktiv sind, er bleibt jedoch unsichtbar.

@hidem          ! Prozedur aufrufen
DEFMOUSE hidem$ ! Mauszeiger unsichtbar
PROCEDURE hidem
    LOCAL z%, mzf$
    FOR z% = 1 TO 16    ! Maus mitsamt Maske
        mzf$ = mzf$ + MKI$ (0)  ! löschen
    NEXT z%
    hidem$ = MKI$(1) + MKI$(1) + MKI$(1)    ! String für
    +MKI$(0) + MKI$(0) +  mzf$+ mzf$    ! DEFMOUSE aufbereiten
RETURN

Immer wieder erreicht uns die Frage, wie sich die aktuelle TOS-Version und deren Erstellungsdatum ermitteln läßt. Die nachfolgenden Routinen übernehmen diese Aufgabe. Mit »PRINT tos_version$« erhalten Sie die aktuelle TOS-Version, »PRINT @tosdatum$« informiert Sie über das Systemdatum.

FUNCTION tos_version$
    LOCAL tos_vers%, tos_vers$
    tos_vers% = LPEEK (&H4F2)
    tos_vers% = LPEEK (tos_vers% + 8)
    tos_vers$ = CHR$ (ADD (48, PEEK (ADD (tos_vers%, 2)))) + "."
              + CHR$ (ADD (48, PEEK (ADD (tos_vers%, 4))))
              + CHR$ (ADD (48, PEEK (ADD (tos_vers%, 3))))
    RETURN tos_version$
ENDFUNC
FUNCTION tos_datum$
    LOCAL tos_datum%, tos_datum$
    tos_datum% = LPEEK (&H4F2)
    tos_datum% = LPEEK (tos_datum% + 8)
    tos_datum$ = CHR$ (48 +SHR(PEEK (tos_datum% + &H19),4))
    tos_datum$ = tos_datum$ + CHR$ (48+(PEEK (tos_datum% + &H19) AND &HF))
    tos_datum$ = tos_datum$ + "." + CHR$ (48 + SHR (PEEK (tos_datum% + &H18),4))
    tos_datum$ = tos_datum$ + CHR$ (48+(PEEK (tos_datum% + &H18) AND &HF))
    tos_datum$ = tos_datum$ + "." + CHR$ (48 + SHR (PEEK (tos_datum% + &H1A),4))
    tos_datum$ = tos_datum$ + CHR$ (48+(PEEK (tos_datum% + &H1A) AND &HF))
    tos_datum$ = tos_datum$ + CHR$ (48+SHR(PEEK (tos_datum% + &H1B),4))
    tos_datum$ = tos_datum$ + CHR$ (48+(PEEK (tos_datum%+ &H1B) AND &HF))
    RETURN tos_datum$
ENDFUNC

Da in meiner Software das Erstellungsdatum und die Uhrzeit wichtig sind, möchte ich diese auf meinem eigenen Desktop anzeigen lassen. Woher bekomme ich diese Informationen?

Die gewünschten Informationen erreichen wir über die DTA. In dieser Struktur legt GEMDOS allerlei Informationen zur aktuellen Datei an. Den genauen Aufbau entnehmen Sie der Tabelle. Die Anfangsadresse der DTA erfragen wir über die Basepage (Offset 0). Nach Programmstart zeigt dieser Wert auf den Anfang der Kommandozeile.

Folgendes Programm ermittelt die gewünschten Daten und stellt das Datum und die Uhrzeit »leserlich« zusammen. Die Funktion »fileinfo« liefert nach dem Aufruf die Zeit und das Datum der Erstellung zurück. Außerdem erhalten Sie die Länge der Datei. Existiert die gewünschte Datei nicht, bricht die Funktion mit »FALSE« ab.

(Sandro Lucifora/ah)

REPEAT
    FILESELECT "D:*.*", "", datei$
    IF @fileinfo (datei$, uhrzeit$, datum$, 1$)
        PRINT "Datei »"; datei$; "« wurde am datum$; "um "; uhrzeit$; "Uhr mit"
        PRINT "einer Länge von "; 1$; " Byte erstellt."
    ELSE
        PRINT "Datei »";datei$;"« existiert nicht."
    ENDIF
UNTIL datei$ = ""
EDIT
FUNCTION fileinfo (datei$, VAR zeit$, datum$, datei_laenge$)
    LOCAL uhrzeit&, datum%, f&, datei_laenge%, my_dta%
    my_dta% = LPEEK (BASEPAGE+32)
    IF EXIST (datei$)
        uhrzeit&      = WORD {my_dta% + 22}
        datum&        = WORD {my_dta% + 24}
        datei_laenge% = {my_dta& + 26}
        sekunde$      = STR$ (MUL((uhrzeit&     AND &X11111), 2)
        minute$       = STR$ (SHR(uhrzeit&, 5)  AND &X111111)
        stunde$       = STR$ (SHR(uhrzeit&, 11) AND &X11111)
        tag$          = STR$ (datum& AND &X11111)
        monat$        = STR$ (SHR (datum&, 5) AND &X1111)
        jahr$         = STR$ ((SHR (datum&, 9) AND &X11111) + 1980)
        zeit$ = LEFT$ ("00", SUB(2, LEN (stunde$))) + stunde$
              + ":" + LEFT$ ("00", SUB (2, LEN (minute$)))  + minute$
              + ":" + LEFT$ ("00", SUB (2, LEN (sekunde$))) + sekunde$
        datum$ = LEFT$ ("00", SUB (2, LEN (tag$))) + tag$ + "."
               + LEFT$ ("00", SUB (2, LEN (monat$))) + monat$ + "."+ jahr$
        datei_laenge$ = STR$ (datei_laenge%)
        RETURN TRUE
    ELSE
        RETURN FALSE
    ENDIF
ENDFUNC

Aufbau der DTA

Offset Name Bedeutung
0 d_reserved für GEMDOS reserviert
21 d_attrib Datei-Attribut
22 d_time Uhrzeit
24 d_date Datum
26 d_length Dateilänge
30 d_fname Dateiname (14 Byte)


Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]