Tips und Tricks für GFA-Programmierer

Wie kann ich einer Datei (kein Programm) eine Kennung zuordnen, mit der sich deren Zugehörigkeit 100%ig bestimmen läßt? Die Kennung muß zahlenabhängig sein und darf nicht im ASCII-Text vorliegen.

Dazu definieren Sie anfangs eine Zahl »code%«, die nicht größer als 214783643 sein darf. Mit dem Aufruf »code_schreiben()« schreiben Sie die Kennung in die ersten vier Byte der neuen Datei. Hierzu benutzen wir eine einfache Methode. Der Befehl »BPUT VARPTR (code%), 4« schreibt die vier Byte der Variablen »code%« auf Diskette. Jetzt folgen die eigentlichen Daten. Der Aufruf »code_lesen()« legt nach dem Öffnen der Datei die zuvor geschriebenen vier Byte in der Variable »lesecode%« ab. Somit steht in »lesecode%« wieder der gewünschte Wert. Ob dieser dem geforderten Wert entspricht, überprüft die IF...ENDIF-Verkettung.
(Sandro Lucifora/ah)

code% = 280469
@code_schreiben ("\CODE.DAT")
@code_lesen ("\CODE.DAT")
´
PROCEDURE code_schreiben (pfad$)
    OPEN "O", pfad$
    BPUT VARPTR (code%), 4
    CLOSE
RETURN
PROCEDURE code_lesen (pfad$)
    LOCAL lesecode%
    OPEN "I", pfad$
    BGET VARPTR (lesecode%), 4
    IF lesecode% = code%
        ALERT 1, "Code:|" + STR$ (code%), 1, "Return", wahl|
    ELSE
        ALERT 1, "Code unbekannt !", 1, "Return", wahl|
    ENDIF
    CLOSE
RETURN

Oft ertönt beim Aufruf einer ALERT-Box ein Dauerton, der sich erst abschaltet, wenn der Mauszeiger auf einen Button zeigt. Kann ich diesen Effekt umgehen?

Dieser Dauerton kommt zustande, wenn unmittelbar nach einem Mausklick eine ALERT-Box erscheint. Das Betriebssystem hat offenbar Probleme, den zuvor losgelassenen Mausknopf zu registrieren. Um dem vorzubeugen, genügen zwei Befehle. Bevor eine ALERT-Box erscheinen soll, wartet das Programm mit

REPEAT
UNTIL MOUSEK
ALERT .....

auf das Loslassen der Maustaste. (Sandro Lucifora/ah)

Ich möchte ohne besonderen Aufwand den Druck einiger Tasten abwarten. insbesondere geht es um die F-Tasten und die Cursor-Tasten. Wie geht das?

Eine einfache Lösung bietet »INKEY$«. Fast jeder, der es mit diesem Befehl schon versucht hat, ist bei der Abfrage von Sondertasten verzweifelt. Hierzu muß man wissen, daß nach einem Tastendruck INKEY$ nicht nur ein Byte pro Zeichen, sondern gelegentlich zwei Byte liefert. Im ersten Byte steht der ASCII-Wert des Zeichens der gedrückten Taste. Bei Sondertasten ist dieser Wert null. Das zweite Byte enthält in diesem Fall den Scan-Code, mit dem sich jede Taste eindeutig bestimmten läßt. Ist dieser Umstand bekannt, lassen sich auch Sondertasten ohne großen Aufwand mit »INKEY$« abfragen. Das erste Listing zeigt bis zum nächsten Mausklick die Werte einer gedrückten Taste. Nachdem der Inhalt von »INKEY$« zwischengespeichert ist, überprüft das Programm den Inhalt der Variablen. Jetzt läßt sich über die Länge »LEN()« herausfinden, ob es sich um eine Sondertaste handelt. Entsprechend gibt das Programm die Werte aus.

PRINT "Stringlänge:", "Erstes Byte:", "Zweites Byte:", "Zeichen:"
REPEAT
    t$ = INKEY$     ! ein zeichen aus tastaturpuffer auslesen
    IF t$ <>" " ! wenn taste gedrückt ...
        PRINT LEN(t$), ASC(t$)  ! länge und ASCII-Wert des ersten Zeichen
    IF LEN(t$) = 2  ! wenn taste mit zwei zeichen ...
        PRINT ASC (RIGHT$ (t$)) ! ASCII des rechten Zeichen
    ELSE
        PRINT ,LEFT$ (t$)   ! sonst ASCII des linken zeichen
    ENDIF
    ENDIF
UNTIL MOUSEK

Im zweiten Listing werden diese Werte abgefragt und zugeordnet. Wie im ersten Listing entscheidet die Länge von »INKEY$« über die Art der Taste. Entsprechend verzweigt die SELECT-CASE-Anweisung zu den einzelnen Tastencodes. Sinnvollerweise sind hier nur die Sondertasten berücksichtigt.

REPEAT
    t$ = INKEY$
    IF t$<> ""
        PRINT LEN(t$), ASC(t$)
    IF LEN(t$) = 2
        SELECT ASC (RIGHT$ (t$))
´   CASE 59 bis 68 -> F01 bis F10
´   CASE 84 bis 93 => F11 bis F2O
            CASE 97     ! UNDO
            CASE 98 ! HELP
            CASE 71 ! ClrHome
            CASE 82 ! Insert
            CASE 72 ! Cursor hoch
            CASE 80 ! Cursor runter
            CASE 75 ! Cursor links
            CASE 77 ! Cursor rechts
        ENDSELECT
    ELSE            ! wenn taste mit einem zeichen 
    ENDIF
    ENDIF
UNTIL MOUSER

Sicherheit voraus

Programme bearbeiten Daten, die sie gegebenenfalls speichern. Egal, ob es sich hierbei um eine Text-, Daten- oder Bild-Datei handelt - die Datensicherheit bleibt oft unberücksichtigt. Das folgende Listing bietet eine Routine an, die vor dem Sichern bereits existierende Dateien mit gleichem Namen in ».BAK« umbenennt. Als Übergabeparameter dient der Pfad- und Dateiname. Zunächst überprüfen wir, ob eine Datei mit gleichem Namen existiert. Ist dies der Fall, ändern wir den Extender in ».BAK«; die ersten acht Zeichen des Dateinamens bleiben erhalten. Eine bereits vorhandene Kopie löschen wir.

@file_check ("D:\menux.app")
PROCEDURE file_check (filename$)
    LOCAL fileneu$, pos%
    IF EXIST (filename$)
        pos% = RINSTR (filename$, ".")
        IF pos% < 0
            fileneu$ = LEFT$ (filename$, pos%) + "BAK"
        ELSE
            fileneu$ = filename$+".BAK"
        ENDIF
        IF EXIST (fileneu$)
            KILL fileneu$
        ENDIF
        RENAME filename$ AS fileneu$
    ENDIF
RETURN

Warum wechselt der DEFAULT-Button beim Verlassen des Editors von GfA-Basic scheinbar willkürlich von »JA« auf »NEIN« ?

Diese Tatsache hat einen sinnvollen Hintergrund. Der »JA«-Button ist zugleich der DEFAULT-Button, wenn der Programmierer im aktuellen Listing seit dem Laden oder letzten Speichern keine Veränderungen vorgenommen hat. Wurde der Quelltext jedoch bearbeitet, ist die Antwort der Frage »Wollen Sie den Interpreter wirklich verlassen ?« mit »NEIN«vorbelegt. Ist man sich also nicht sicher, ob das Programm schon gesichert ist, reicht ein Tastendruck auf . ist der Button »JA« dick umrandet gezeichnet, dürfen Sie den Interpreter sorglos verlassen.



Links

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