Logo: Geos Online Print Archiv
G.O.P.A. - Geos Online Print Archiv
05.12.2020 Archiv  #  Recherche  #  Links  #  Kontakt  #  Gästebuch  #  Impressum

Index
Register
Login

Die Anzeige des Archivs erfolgt grafisch. Ändern

GeoCom-Workshop #8 - Diskettenoperationen

Autor: Olaf Dzwiza

Im letzten Teil haben wir unser Programm in mehrere Module aufgeteilt. Zwei fehlten, die nun nachgeschoben werden sollen:

   Modul 2: Laden von Datenreihen
   Modul 3: Speichern derselben

Sinn der Entwicklung dieser Module im Rahmen des Workshops kann es natürlich nicht sein, eine ausgefeilte Laufwerksprogrammierung unter GEOS zu zeigen. Würde man hierbei auf alle möglichen Feinheiten eingehen, ließe sich mühelos eine eigene Artikelreihe daraus machen, also verzeiht mir bitte die eine oder andere Oberflächlichkeit bzw. Auslassung. Vielmehr soll es hier um die wesentlichen Grundbegriffe gehen. Dazu wollen wir mit einer Arbeit in ObjectEdit beginnen:

Bevor eine Datei erstellt werden kann, müssen diverse Parameter festgelegt werden: Dateityp, GEOS-Klasse, Struktur, Autor, Icon, usw. All dies geschieht sehr einfach mit Hilfe von ObjectEdit.
Legt in der bereits vorhandenen Objectdatei einen neuen Eintrag "FileHeader" mit dem Bezeichner "header" an und bindet dies im Quellcode durch die Zeile
OBJECT header
unmittelbar nach den bisherigen "OBJECT"-Definierungen auf Seite 1 ein.

Dieser FileHeader sollte möglichst so (oder ähnlich) aufgebaut werden:

   C=-Typ:      USR
   GEOS-Typ:    Datendatei
   Struktur:    sequentiell
   Startflag:   nur 40-Zeichen
   Klasse:      Statdata V1.0

Alle anderen Angaben werden nicht zwingend für diesen Datentyp benötigt, nur irgendein Icon solltet Ihr noch entwerfen. Bitte genau auf die richtige Schreibweise der Klasse achten, acht Zeichen Text, vier Leerzeichen und das letzte Zeichen der Versionsnummer an Position 16. Dies entspricht zum einem dem GEOS-Standard, zum anderen ist es notwendig, damit die folgenden Routinen korrekt arbeiten.

Nachdem wir nun das Object erstellt und eingebunden haben, wollen wir es auch benutzen. Beginnen wir also bei Modul 3, dem Speichern.
Ein paar lokale Definitionen müssen zunächst gemacht werden:
FILEVAR data
BYTEVAR zähler
STRVAR16; filename
LABEL erstellen

Einzig erklärungsbedürftig ist allenfalls der Ausdruck "FILEVAR data". Bei Programmieren im Standardmodus gibt es viele trockene Zahlen, über die der Rechner geöffnete Dateien zuordnen und bearbeiten kann, die Kanalnummer. Unter GEOS verwenden wir dafür einfach Dateivariablen.
Eine solche Variable dient als eindeutige Identifikation für den Compiler, welche Datei gemeint ist und beim betreffenden Befehl bearbeitet werden muß. Dieser Name, hier "data", ist grundsätzlich beliebig, wie bei jeder anderen Variable auch.

Bevor wir die Speicherroutine starten, sollte zunächst getestet werden, ob überhaupt speicherfähige Daten vorliegen:

   IF (schongewürfelt<> 1) THEN
      STRNBOX "Es sind noch keine Daten","vorhanden.",""
      MAINLOOP
   ENDIF

Dann folgt der Programmteil "erstellen":

@erstellen
CREATEBOX filename,"/BNBeuer Dateiname:/P",0

"filename" ist der Name, in dem der eingegebene Dateiname gespeichert wird, die "0" soll hier mal nicht weiter interessieren, da dies die am meisten gebrauchte Einstellung ist und alles andere über das Ziel dieses Kurses hinausgehen würde.

Was kann nun alles passieren?

  • "Laufw." wird angeklickt
  • "Abbruch" wird angeklickt
  • Texteingabe und RETURN
  • RETURN ohne Texteingabe

Um die Texteingabe müssen wir uns nicht kümmern, dies tun die Routinen von GEOS und "CREATEBOX". Ebenso erfolgt die Laufwerksumschaltung auch automatisch, bleiben nur noch die letzten beiden Fälle und der Klick auf "Abbruch" übrig.

Doch halt! Was passiert, wenn ein Benutzer das Laufwerk gewechselt hat, dann auf Abbruch klickt und unser Programm wieder ein Modul nachladen muß, aber mittlerweile ein anderes Laufwerk als das des Programms das aktuelle ist? ...Richtig! Es kommt auf jeden Fall zu Fehlfunktionen. Was tun?

Im Modul 0, dem Initialisierungsteil, müssen wir die Nummer des Startlaufwerks gleich zu Beginn durch folgende Zeile sichern:
   proglfw=curdrive
Die Variable "proglfw" ist vorher als Byte-Variable im globalen Teil zu definieren.

Nun aber zurück zu unseren offenen Möglichkeiten:

1. "Abbruch":
Nach dem Erkennen des Klicks, was uns durch die Systemvariable dbstat sehr einfach gemacht wird - sie nimmt nämlich den Wert 2 ein - brauchen wir nur wieder auf das Programmlaufwerk zurückzuschalten und mit RETURN in die Hauptschleife zu springen:

   IF(dbstat==2) THEN
     DEVICE proglfw
     RETURN
   ENDIF

2. RETURN ohne Texteingabe
Hat im Prinzip die gleiche Folge wie der Klick auf Abbruch, nur muß die Abfrage anders lauten. Zwei Bedingungen sind zu erfüllen: Zunächst muß RETURN bestätigt werden (dbstat ist 13) und dann muß die Stringlänge von "filename" 0 sein:

   IF ((dbstat==13) AND ((LEN filename)==0)) THEN
     DEVICE proglfw
     RETURN
   ENDIF

3. Texteingabe und RETURN
Dieser Fall folgt nach den beiden anderen Abfragen und ist die eigentliche Reaktionsroutine:

Durch den folgenden Befehl
   FINDFILE filename
wird die Datei gesucht. Moment: Gesucht? Richtig. Wenn wir die Datei anlegen wollen, darf sie noch nicht vorhanden sein. Das heißt, der Befehl "FINDFILE..." muß in der Systemvariabel "iostat" den Wert "5" für "file not found" melden. Ist das der Fall, können wir die Datei anlegen und erzeugen. In jedem anderen Fall ist eine genauere Fehlerbetrachtung nötig.

Ich habe hier exemplarisch nur einen Fall eingebaut, der Rest kann anhand der Fehlertabelle aber leicht ausgebaut werden. Auch das hier gegebene Beispiel kann noch erweitert werden, man könnte u.a. eine Abfrage einbauen, ob die existierende Datei gelöscht und neu angelegt werden soll, oder ob ein neuer Name einzugeben ist. Wenn die Variable den Wert "iostat" hat, so ist die zu erzeugende Datei bereits vorhanden. Wir geben eine entsprechende Meldung aus und springen zum Anfang der Routine zurück. In den verbleibenden Fällen wird die Standard-Fehlerbox mit der entsprechenden Meldung aufgerufen und das Modul verlassen. Achtung: Vor dem Verlassen wieder auf das Programmlaufwerk zurückschalten!

Fertig sieht dies so aus:

   IF (iostat==5) THEN
     CREATE filename,header
     OPEN data,filename
     SETWRITE data
     zähler=0
     REPEAT
       PUT data,(würfelzahl<zähler>)
       INC zähler
     UNTIL(zähler==6)
     CLOSE data
   ELSE
     IF (iostat==0) THEN
       STRNBOX filename,"/Bist nicht vorhanden./P",""
       GOTO erstellen
     ELSE
       ERROR
     ENDIF
   ENDIF
   DEVICE proglfw
       (und dann folgt das schon in Teil 7 eingefügte RETURN)

Interessant ist noch der Teil zwischen IF... und ELSE, hier wird die Datei erzeugt:
Durch CREATE wird eine Datei mit dem Dateikopf (auch: FileHeader, Infoblock) "header" und dem Namen "filename" angelegt. Der OPEN-Befehl öffnet nun diese Datei und teilt dem Compiler mit, alle Operationen für dieses File über die Dateivariable "data" ablaufen zu lassen.
Da eine geöffnete Datei immer auf "einlesen" steht, werden wir sie bevor wir zum Schreiben kommen, erst darauf umschalten müssen, dies geht mit dem Befehl SETWRITE. Nun werden unsere 6 Byte Würfelzahltabelle geschrieben, das Ganze geschlossen und schon ist das Sichern erledigt.

Das Laden ist schneller erledigt, die meisten Elemente sind nun auch bereits bekannt, da es eine fast 100% Umkehrung des Speichern-Vorgangs ist. Also auf zu Modul 2:

   FILEVAR data
   BYTEVAR zähler
   STRVAR16; filename

   OPENBOX filename,3,"Statdata  V1.0",0
   IF(dbstat==2) THEN
     DEVICE proglfw
     RETURN
   ENDIF
   FINDFILE filename
   IF(iostat==0) THEN
     OPEN data,filename
     zähler=0
     REPEAT
       GET data,(würfelzahl<zähler>)
       INC zähler
     UNTIL (zähler==6)
     durchschnitt=0
     gesamtwert=0
     schongewürfelt=1
     CLOSE data
     DEVICE proglfw
     action=3
     GOTOMOD 1
   ELSE
     ERROR
     DEVICE proglfw
     RETURN
   ENDIF

OPENBOX ruft die Standard-Fileauswahlbox auf, der Dateiname ist in die Variable "filename" zu sichern, angezeigt werden sollen alle Dateien des Types "Datendatei" (=3) mit der Klasse "Statdata V1.0" (daher vorhin der Hinweis, daß die genaue Schreibweise so wichtig sei), die abschließende Null werden wir hier nicht weiter betrachten.

Hier haben wir nur den Fall "Klick auf ABBRUCH" und "Laufwerkswechsel" zu behandeln. Für den Laufwerkswechsel ist es am einfachsten, die bereits eingeführte Variable proglfw auch hier zum zurückschalten zu benutzen.

Mit FINDFILE wird die Datei gesucht, dann sind zwei Fälle zu unterscheiden:

1. Suche erfolgreich:
Die Datei wird geöffnet und gelesen, danach ein paar Variablen reinitialisiert und schließlich wieder geschlossen. Dann wird auf das Programmlaufwerk zurückgeschaltet und die Variable "action", die wir in Teil 7 eingeführt haben, auf die Methode 3 gesetzt, um schließlich Modul 1 aufzurufen. Zu dieser Methode gleich noch mehr.

2. Suche fehlgeschlagen:
Auch hier ist das Rezept einfach:
Fehlerbox ausgeben, Laufwerk umschalten, in die Hauptschleife mit RETURN zurück.

Die gerade erwähnte Methode 3 muß abschließend im Modul 1 ergänzt werden:
Folgende Abfrage ist unmittelbar vor dem Label "Simulation" einzufügen:

   IF (action==3) THEN : grafik_aufbauen : MAINLOOP : ENDIF

Beachtet bitte, daß hier, im Gegensatz zu den Zeilen mit action==1 oder ==2 auf ein GOTO verzichtet werden muß, da die Routine grafik_aufbauen eine Unterroutine ist und über RETURN verlassen wird.

Und damit geht der Workshop rund um GeoCom zu Ende. Ein paar abschließende Worte habe ich noch:

Zunächst einmal wieder: Die Workshop-Diskette ist ergänzt. Die nun endgültige Fassung ist in Kürze in der GeoThek zu haben. Die richtige Nummer wird Werner Weicht dann hier noch bekannt geben.

Dann ein großes Dankeschön an alle User, die sich für diese Reihe interessiert haben, und mir geschrieben haben. Es wird noch mehr zu GeoCom geben: Noch in diesem Jahr wird bei der GIG Süd über Manfred Frick ein GEOS-Sonderheft "GeoCom" mit mindestens 50 Seiten erscheinen.
Und zum Schluß etwas, daß nicht in der Anleitung steht: Klickt mal in ObjectEdit auf das Feld "xx von yy" unten rechts (Objektzähler) und Ihr erreicht eine schnelle "Gehe-Zu"-Funktion!

 

Olaf Dzwiza

 

 

 




Dieser Artikel ist Bestandteil von:

Ausgabe 40

! - - - - - M I C R O F I L M - - - - - ! | Jahreshaupttreffen '95 | Entwicklungen für 64'er und PC ... | ESCOM kauft Commodore Rechte | GWE Schulversion | Editorial | UMZUG - Versand - GEOS Laden - GEOS Clubraum | Hobbytronic & Computershow 1995 in Dortmund | 36. Regio-Treffen in Hannover ! | Regionalgruppe Baden - Regiotreffen der unheimlichen Art | Druckertreiber für HP Deskjet! | GeoKeys erweitert zu DOS-Keys | Test Manager-System v2.7 | Test: geoShell v2.2 GE | Test: The Best of ... GeoCom | Neues von CLI v3.0 | GeoCom-Workshop #8 - Diskettenoperationen | Neues von der GeoThek Teil #8 | Universum | CD-ROM Commander 128 | RAM-Link - Die Schwierigkeiten der Installation | PD Disk für GWE2 / Update des serial.geo Treibers | Programmierertreffen | Deutsches v2.01 Update ... ? | GEOS CD #1 | FAX 9000 | Neue Applikationen | IZL Kurs Teil #2 | Nicht professionell genug? / GeoCalc rechnet besser | Geoworks & PTS-Dos v6.42extended | Geos & Win 95 | PC/Geos, Win95 & OS/2 beim GUC | 5000. GUC Mitglied! | PC/Geos GeoThek - Fragen & Antworten | Beiträge für die GUP | Diverse Tips & Tricks - Bug oder Features?


Kurzlink hierhin: http://geos-printarchiv.de/2136


Letzte Änderung am 01.11.2019