In diesem dritten Teil der "GFA-BASIC - Tips und Tricks"-Reihe werde ich zeigen, wie Datensätze mit GFA-BASIC exportiert, d.h. gedruckt und auf einem Datenträger (Diskette, Festplatte) gespeichert werden können und wie man diese Daten vom Datenträger wieder zurück in den Speicher lädt.
Zuerst wird das kleine Programm geplant und dazu ein Nassi-Shneidermann-Struk-togramm erstellt. Die Symbole wurden im letzten Teil dieser Reihe erläutert, wer die Bedeutung nicht mehr kennt, kann also dort nachlesen. Als Anmerkung sei gesagt, dass alle Bildschirmausgaben dieses Beispielprogramms direkt auf den Bildschirm erfolgen. Somit wird im compi-lierten Programm der Bildschirm des Desktops gelöscht und überschrieben. Für die Erläuterung der Datei- und Druckfunktion soll das aber genügen.
Wie aus dem Struktogramm (Abb.l) zu erkennen ist, soll das Hauptprogramm aus einem Auswahlmenü und zwei Unterprogrammteilen bestehen. Das erste Unterprogramm "Datensicherung" führt Eingaben verschiedener Daten durch, ruft dann den Fileselector auf und speichert die Daten unter dem gewählten Namen in einer Datei.
Das zweite Unterprogramm "Listendruck" ruft den Fileselector auf, lädt die Daten aus der gewählten Datei und gibt sie auf dem Drucker aus. Der Quelltext sieht wie folgt aus (hinter dem Ausrufezeichen oder Apostroph stehen gegebenenfalls Kommentare) - siehe Listing l:
Der Befehl "REPEAT...UNTIL" steht für eine Schleife, die genau solange wiederholt wird, bis bei der Eingabe das ASCII-Zeichen 48 (Null) eingegeben wird. CLS löscht den Bildschirm. Diesen Befehl sollte man allerdings in "sauberen" Programmen nicht verwenden, da so zum Beispiel unter Multitasking-Betriebssystemen der komplette Desktop gelöscht wird. PRINT führt eine Ausgabe des Textes in den Anführungszeichen aus und setzt den Cursor danach in die nächste Bildschirmzeile. Um einen solchen Zeilenumbruch zu vermeiden, kann am Zeilenende ein Semikolon gesetzt werden. Zur Ausgabe einer Leerzeile genügt der Befehl PRINT ohne weiteren Zusatz (Anführungszeichen). Der Befehl "FORM IN-PUT n,variable$" (ohne die Anführungszeichen) liest maximal n Zeichen über die Tastatur ein und übergibt sie an die String-variable (erkennbar durch angehängtes Dollar-Zeichen) variables. In der "IF...ELSE IF...ENDIF"-Fallabfrage wird kontrolliert, welches Zeichen eingegeben wurde. Für das ASCII-Zeichen 49 (Eins) wird dann das Unterprogramm datensi-cherung durch den vorangestellten Klammeraffen (alternativ GOSUB vorangestellt) und für das ASCII-Zeichen 50 (Zwei) das Unterprogramm Hstendruck aufgerufen und abgearbeitet. Der jeweils andere Teil wird übersprungen. Wird ein anderes Zeichen als 0, 1 oder 2 eingegeben, wird die Abfrage wegen der Schleife wiederholt.
PROCEDURE beginnt und RETURN beendet das Unterprogramm. Zum Beginn sind alle in dem Unterprogramm vorkommenden Variablen mit vorangestelltem LOCAL aufgelistet. Hiermit ist sichergegeben, dass diese Variablen lokal behandelt werden und außerhalb der Procedure nicht verändert werden können. Die Befehle CLS, PRINT, FORM INPUT habe ich weiter oben beim Hauptprogramm schon erläutert und verzichte hier deshalb darauf. Durch den Funktionsaufruf FN wird der GEM-Fileselector aufgerufen. Der erste Übergabeparameter kann ein Text (auch leer) in Anführungszeichen oder eine String-Variable sein. Sie legt bei neueren AES-Versionen fest, welcher Text in der Kopfzeile des Fileselectors stehen soll; bei älteren AES-Versionen bleibt diese Variable unberücksichtigt, sie muss aber dennoch übergeben werden. Der zweite Parameter legt die Dateiendung fest, die die Datei haben soll; falsch eingegebene Endungen werden durch sie ersetzt. Der dritte Parameter stellt einen vorgegebenen Dateipfad ein, er kann aber auch frei gelassen ("") werden. An vierter Stelle kann TRUE zur
Überprüfung auf Vorhandensein eingegeben werden. Soll nicht geprüft oder eine Datei gesichert werden, muss hier FALSE stehen. Die fünfte und letzte Variable (Wichtig: Hier muss eine Variable und keine Zeichenkette stehen!) kann einen vorgegebenen Dateinamen enthalten. Sie enthält nach dem Verlassen des Fileselectors auch den ausgewählten Dateinamen. Die Funktion gibt den kompletten ausgewählten Dateipfad mit Dateinamen zurück, wird er nicht wie im Beispielprogramm gebraucht, so kann hier einfach die Tilde (~) stehen. Die Alternative "IF dateiname$<>""…ENDIF" fragt ab, ob ein Dateiname ausgewählt/eingegeben wurde. Die zweite Alternative kontrolliert über den Befehl EXIST, ob die ausgewählte Datei schon existiert oder nicht. Existiert die Datei, so wird mittels dem Befehl "OPEN "A",#l,dateipfad$" die vorhandene Datei über den Kanal 1 zum Anhängen der zu speichernden Daten geöffnet. Existiert die Datei nicht, so wird die Datei neu erstellt und ebenfalls über den Kanal 1 zum Schreiben geöffnet. Wichtig ist hierbei, dass man niemals einen Kanal zweimal öffnet, dieses würde zum Programmabsturz führen (der Drucker benutzt Kanal 10). Als nächstes werden im Programm mit dem Befehl "PRINT #n,variable$" die Daten gespeichert. Das n (ganzzahliger Wert) steht hier für den zuvor geöffneten Kanal. Die Variable muss eine String-Variable sein. Nach dem Speichern der drei Stringinhal-te (jeder in eine eigene Zeile) wird der Dateikanal mit dem Befehl CLOSE #1 geschlossen.
Außer dem RECALL-Befehl und der Funktion exp_prn wurden alle Befehle dieser Procedure bereits erläutert bzw. ergeben sich aus den Bemerkungen im Quelltext. Der Befehl RECALL lädt eine vorgegebene Anzahl an Zeichen in ein zuvor definiertes String-Feld. In diesem Fall wurden 3 Feldelemente (0, 1 und 2) zuvor definiert, dann drei Zeilen aus der gewählten Datei eingelesen und an die Feldelemente übergeben. Die Variable zeilen-zahl% enthält nach dem Einleseversuch die Anzahl der wirklich eingelesenen Zeilen.
Die Funktion exp_prn gibt String-Variablen oder Zeichenketten über den Drucker aus und kontrolliert, ob dieser überhaupt druckbar (ON-Line) ist. Die erste Übergabevariable soll die String-Variable oder die Zeichenkette, die zweite und die dritte müssen FALSE enthalten. Die beiden letzten Parameter sind ohne Bedeutung, sie sind nur noch zur Kompatibilität zu früher verwendeten Funktionsaufrufen enthalten.
Benötigte Unterprogramme zum Ersatz von GFA-BASIC-Befehlen
Da der GFA-BASIC-Aufruf des Fileselec-tors sowie die Druckausgabe unter neueren Versionen des TOS, auf dem Falcon und auch unter MagiC Probleme bereitet, biete ich Ihnen einen funktionstüchtigen Ersatz an, den Sie über die Spezial-Dis-kette 7-8/1999 und unser Internet-Angebot von www.atari-world.com erhalten. Die Benutzung erfolgt wie in den oberen Listings.
Ersatz für den Befehl FILESELECT
Ersatz für den Befehl LPRINT
Diese Listings befinden sich auf der Spezial-Diskette 7-8/1999 und im Web.
Im nächsten Teil werde ich zeigen, wie sich ganz leicht SD-Dialoge erstellen und in GFA-BASIC einlesen lassen.