4.10.10 Text in Dateien speichern

Alle Textobjekte können ihren Text direkt in eine Datei schreiben und direkt aus einer Datei lesen. Das ist insbesondere für LargeText-Objekte interessant. Dazu werden die folgenden Methoden unterstützt.

Methode Aufgabe
WriteToFile Text in eine Datei schreiben
ReplaceFromFile Text aus einer Datei ersetzen
InsertFromFile Text aus einer Datei einfügen
FileTextSize Textumfang in einer Datei ermitteln
WriteToVMFile Text in eine VM-Datei schreiben
ReplaceFromVMFile Text aus einer VM-Datei ersetzen
InsertFromVMFile Text aus einer VM-Datei einfügen
VMFileTextSize Textumfang in einer VM-Datei ermitteln

Die Methoden WriteToFile, ReplaceFromFile, InsertFromFile und FileTextSize arbeiten mit normalen DOS-Dateien bzw. gleichwertig mit GEOS-DATEN-Dateien. Dabei kann gleichzeitig der Zeichensatz konvertiert werden (z.B. GEOS nach Windows), da im Hintergrund die Convert$-Funktion aufgerufen wird.

Die Methoden WriteToVMFile, ReplaceFromVMFile, InsertFromVMFile und VMFileTextSize arbeiten mit GEOS VM-Dateien. VM-Dateien sollten Sie verwenden, wenn Sie mehr als nur einen Text (z.B. mehrere unabhängige Texte oder Text und Bilder) in einer einzigen Datei speichern wollen. Alle "großen" Applikationen (z.B. GeoWrite, GeoDraw, R-BASIC) speichern ihre Dokumente in VM-Dateien.

Um diese Methoden verwenden zu können, müssen Sie die Library "VMFiles" includen. Diese Library kann separat von der R-BASIC Webseite heruntergeladen werden.

WriteToFile

WriteToFile schreibt den vom Textobjekt dargestellten Text in eine offene DOS- oder GEOS-Daten-Datei. Sie können auswählen, ob die Zeichen dabei in einen anderen Zeichensatz (z.B. DOS oder HTML) konvertiert werden sollen und ob der gesamte Text oder nur Teile davon in der Datei gespeichert werden sollen.

WriteToFile schreibt immer ab der aktuellen Dateiposition, vorhandene Daten werden überschrieben. Bei Bedarf wird die Datei verlängert.


     Syntax: <obj>.WriteToFile fh [, convertMode [, start [, end] ] ]
         fh: Variable oder Ausdruck vom Typ FILE.
             Die Datei muss offen sein.
convertMode: Bestimmt, zwischen welchen Zeichensätzen konvertiert
             werden soll. Siehe unten.
Defaultwert: Null (keine Konvertierung)
      start: Cursorposition, ab der geschrieben werden soll.
             Die Zählung beginnt bei Null. 
Defaultwert: Null (von Anfang an)
        end: Cursorposition, bis zu der geschrieben werden soll.
             Die Zählung beginnt bei Null.
             End darf größer als die Textlänge sein.
Defaultwert: 4 294 967 294 (alles)

 
Hinweise:

  • Für den Parameter convertMode sind alle Werte zugelassen, die auch für die Funktion Convert$ zugelassen sind. Als Ersatzzeichen für nicht konvertierbare Zeichen wird immer der Unterstrich '_' verwendet. Eine Beschreibung der Convert$-Funktion finden Sie im Kapitel 2.4.3 (Konvertierungsfunktionen) des Programmierhandbuchs.

  • WriteToFile verschiebt den Dateizeiger hinter den geschriebenen Bereich.

  • WriteToFile schreibt keine Ende-Null in die Datei. Verwenden Sie die Routine FileWrite, wenn Sie eine Ende-Null schreiben wollen.

  • Ist die Datei größer, als der geschriebene Text, so bleiben die nicht überschriebenen Daten erhalten. Verwenden Sie die Routine FileTruncate, wenn Sie die Datei nach dem Schreiben an der aktuellen Position abschneiden wollen. Diese Routinen und die Arbeit mit Dateien sind im Handbuch "Spezielle Themen", Kapitel 9, beschrieben.

  • WriteToFile setzt die globale Variable fileError. Ist der Parameter start größer als verfügbarer Text wird kein Laufzeitfehler erzeugt, sondern fileError auf ERROR_TEXT_TOO_SHORT (-22) gesetzt.

  • Ist der Parameter end kleiner als der Parameter start, so wird ein Laufzeitfehler erzeugt und das Programm beendet.

Beispiele:
 ' Kompletten Text in eine (offene) Datei schreiben.
 ' Zeichen in den Windows-Zeichensatz konvertieren
 ' GEOS-Zeilenumbrüche durch DOS-Zeilenumbrüche ersetzen

  MyTextObj.WriteToFile fh, GEOS_TO_WIN + CR_TO_CRLF
 ' 200 Zeichen mit HTML Codierung schreiben
 ' "trw" öffnet evtl. vorhandene Dateien und schneidet sie ab.

DIM fh as FILE

  fh = FileCreate "FILE.TXT", "trw"
  MyText.WriteToFile fh, GEOS_TO_HTML + CR_TO_CRLF, 0, 200
  FileClose fh


ReplaceFromFile

ReplaceFromFile ersetzt den aktuellen Text durch den in einer Datei (DOS-Datei oder GEOS-Daten-Datei) enthaltenen Text. Dabei wird der Text bis zum Dateiende oder bis zum Auftreten einer Ende-Null eingelesen. Eine Prüfung auf ungültige Zeichen erfolgt nicht.

Sie können die zu Textmenge begrenzen und festlegen ob der Text in einen anderen Zeichensatz (z.B. von HTML nach GEOS) konvertiert werden soll. ReplaceFromFile liest immer ab der aktuellen Dateiposition und verschiebt den Dateizeiger hinter den gelesenen Text.


     Syntax: <obj>.ReplaceFromFile fh [, convertMode [, maxLen ] ]
         fh: Variable oder Ausdruck vom Typ FILE.
             Die Datei muss offen sein.
convertMode: Bestimmt, zwischen welchen Zeichensätzen konvertiert
             werden soll. Siehe unten.
Defaultwert: Null (keine Konvertierung)
     maxLen: Maximale Anzahl zu lesender Zeichen. MaxLen bezieht
             sich auf die Datei, die Anzahl der erzeugten
             (d.h. an das Textobjekt übergebenen) Zeichen kann je
             nach convertMode abweichen.
Defaultwert: 4 294 967 294 (alles)

 
Hinweise:

  • Für den Parameter convertMode sind alle Werte zugelassen, die auch für die Funktion Convert$ zugelassen sind. Als Ersatzzeichen für nicht konvertierbare Zeichen wird immer der Unterstrich '_' verwendet.

    Eine Beschreibung der Convert$-Funktion finden Sie im Kapitel 2.4.3 (Konvertierungsfunktionen) des Programmierhandbuchs.

Warnung. Die Werte GEOS_TO_HTML, GEOS_TO_HTML_BR, GEOS_TO_UTF8 sowie das Flag CR_TO_CRLF für convertMode können den Text verlängern, so dass ein Textobjekt, z.B. ein Memo, ihn nicht mehr aufnehmen kann. Beim Lesen von Text ist es allerdings selten, dass man diese Werte verwendet.

Für LargeText-Objekte existiert dieses Problem nicht.

Beispiele:

 ' Den kompletten Text aus einer (offenen) DOS-Datei ersetzen

  MyTextObj.ReplaceFromFile fh, DOS_TO_GEOS + CRLF_TO_CR
 ' Den Text durch maximal 200 Zeichen aus einer (offenen) HTML-
 ' Datei ersetzen. Die 200 Zeichen beziehen sich auf die Datei.

  MyTextObj.ReplaceFromFile fh, HTML_TO_GEOS + CRLF_TO_CR, 200


InsertFromFile

InsertFromFile fügt Text aus einer Datei an der aktuellen Cursorposition ein. Wenn etwas selektiert ist, wird der neue Text hinter dem selektierten Bereich eingefügt. Ansonsten gelten die bei ReplaceFromFile angegebenen Hinweise.
Syntax: <obj>.InsertFromFile fh [, convertMode [, maxLen ] ]

 

FileTextSize

FileTextSize ermittelt die Anzahl der Zeichen, die aus einer offenen DOS- oder GEOS-Daten-Datei mit ReplaceFromFile oder InsertFromFile maximal gelesen werden können. Dabei wird ab der aktuellen Dateiposition begonnen und am Dateiende bzw. der nächsten Ende-Null abgebrochen. Die Ende-Null wird (wenn vorhanden) nicht mitgezählt.

Wird ein Parameter für convertMode angegeben, so wird die Anzahl der Zeichen nach der Konvertierung zurückgeliefert.


     Syntax: <numVar> = <obj>.FileTextSize ( fh [, convertMode ] )
         fh: Variable oder Ausdruck vom Typ FILE.
             Die Datei muss offen sein.
convertMode: Bestimmt, zwischen welchen Zeichensätzen konvertiert
             werden soll. Siehe ReplaceFromFile.
Defaultwert: Null (keine Konvertierung)

 
Anmerkung: FileTextSize ist zwar eine Textobjekt-Methode, verwendet aber die Eigenschaften des Textobjekts selbst nicht.

Beispiel

DIM size
  size = DemoMemo.FileTextSize(fh, GEOS_TO_HTML)
  IF size <= 4000 THEN
    DemoMemo.ReplaceFromFile fh , GEOS_TO_HTML
  ELSE
    MsgBox "Der Text wäre" + Str$(size-4000) + " Zeichen zu lang."
  End IF


WriteToVMFile

WriteToVMFile schreibt den Text als VMArray in eine offene VM-Datei und liefert das VMBlock-Handle des VMArrays zurück. Um WriteToVMFile verwenden zu können, müssen Sie die Library "VMFiles" includen. Diese kann separat von der R-BASIC Webseite heruntergeladen werden.
     Syntax: <hanVar> = <obj>.WriteToVMFile fh [, start [, end] ]
     hanVar: Variable vom Typ Handle
         fh: Variable oder Ausdruck vom Typ FILE.
             Die Datei muss offen und eine VM-Datei sein.
      start: Cursorposition, ab der geschrieben werden soll.
             Die Zählung beginnt bei Null. 
Defaultwert: Null (von Anfang an)
        end: Cursorposition, bis zu der geschrieben werden soll.
             Die Zählung beginnt bei Null.
             End darf größer als die Textlänge sein.
Defaultwert: 4 294 967 294 (alles)

 
Hinweise:

  • WriteToVMFile speichert den Text immer so, wie er im Text-Objekt angezeigt wird. Eine Konvertierung in andere Zeichensätze ist nicht möglich.

  • WriteToVMFile schreibt ein "Standard" VMArray mit einer Elementgröße von 1 Byte. Es enthält mindestens eine Ende-Null. Es ist erlaubt, das VMArray mit den VMArray-Routinen der VMFiles-Library zu manipulieren. Die Ende-Null darf aber nicht entfernt werden.

  • WriteToVMFile legt immer ein neues VMArray an. Arrays, die Sie nicht mehr brauchen, müssen Sie mit VMArrayDestroy vernichten.

  • WriteToVMFile setzt die globale Variable fileError. Ist der Parameter start größer als verfügbarer Text wird kein Laufzeitfehler erzeugt, sondern fileError auf ERROR_TEXT_TOO_SHORT (-22) gesetzt.

  • Ist der Parameter end kleiner als der Parameter start, so wird ein Laufzeitfehler erzeugt und das Programm beendet.
Beispiele: Siehe unten.

ReplaceFromVMFile

ReplaceFromVMFile ersetzt den aktuellen Text durch den in einer VM-Datei enthaltenen Text. Um ReplaceFromVMFile verwenden zu können, müssen Sie die Library "VMFiles" includen.
Syntax: <obj>.ReplaceFromVMFile fh, block
    fh: Variable oder Ausdruck vom Typ FILE.
        Die Datei muss offen und eine VM-Datei sein.
 block: Handle auf ein von WriteToVMFile geschriebenes VMArray.

 
Hinweise:

  • ReplaceFromVMFile beeinflusst die globale Variable fileError nicht.


InsertFromVMFile

InsertFromVMFile fügt den in einer VM-Datei enthaltenen Text an der aktuellen Cursorposition ein. Ist etwas selektiert, so wird der neue Text hinter dem selektierten Bereich eingefügt.

Ansonsten gelten die bei ReplaceFromVMFile angegebenen Hinweise.


Syntax: <obj>.ReplaceFromVMFile fh, block
    fh: Variable oder Ausdruck vom Typ FILE.
        Die Datei muss offen und eine VM-Datei sein.
 block: Handle auf ein von WriteToVMFile geschriebenes VMArray.

 
Beispiele

Die Routine SaveToVMFile speichert den Text eines Textobjekts in einer Datei. Der Parameter "t" bei VMOpen sorgt dafür, dass die Datei nach dem Öffnen abgeschnitten wird, also leer ist. Das neue VMArray wird als "Mapblock" gesetzt, damit man später einfach darauf zugreifen kann.

SUB SaveToVMFile()
DIM fh AS FILE
DIM blk AS HANDLE

  fh = VMOpen("VMTextFile", "trw")
  blk = DemoLargeText.WriteToVMFile(fh)
  VMSetMapBlock(fh, blk)
  VMClose(fh)

End SUB
Die Routine LoadFormVMFile liest den Text aus der von SaveToVMFile angelegten Datei. Bei VMOpen darf der Parameter "t" nicht angegeben werden, damit die Daten beim Öffnen der Datei erhalten bleiben.

Das VMArray mit dem Text wurde als "Mapblock" gesetzt, so kann man wieder darauf zugreifen.

SUB LoadFromVMFile()
DIM fh AS FILE
DIM blk AS HANDLE

  fh = VMOpen("VMTextFile", "rw")
  blk = VMGetMapBlock(fh)
  DemoLargeText.InsertFromVMFile(fh, blk)
  VMClose(fh)

End SUB
Da WriteToVMFile jeweils ein neues VMArray anlegt, ist das "Ersetzen" eines Texts in einem VMArray nicht möglich. Also muss man das "alte" VMArray manuell vernichten, und stattdessen das neue VMArray verwenden.
FUNCTION ReplaceVMArray(fh AS FILE) AS HANDLE
DIM oldArray, newArray AS HANDLE

  ' Neues VMArray anlegen und als MapBlock setzen
  ' danach altes Array vernichten (nur wenn existent!)
 
  oldArray = VMGetMapBlock(fh)
  newArray = DemoMemo.WriteToVMFile(fh)
  VMSetMapBlock(fh, newArray)
  IF oldArray <> NullHandle() THEN VMArrayDestroy (fh, oldArray)
 
  RETURN newArray

End FUNCTION
Ein Beispiel, wie man mehrere unabhängige Texte in einer einzigen VM-Datei speichert, finden Sie in der Beispieldatei "Text Speichern, komplex, VM-Datei" im Ordner "Beispiel\Objekte\Text". Dabei wird der Text nicht mehr direkt als Mapblock gesetzt.

VMFileTextSize

VMFileTextSize ermittelt die Anzahl der Zeichen eines in einer VM-Datei gespeicherten Textes. Die Ende-Null wird nicht mitgezählt.
Syntax: <numVar> = <obj>.VMFileTextSize ( fh, block )
    fh: Variable oder Ausdruck vom Typ FILE.
        Die Datei muss offen und eine VM-Datei sein.
 block: Handle auf ein von WriteToVMFile geschriebenes VMArray.

 
Anmerkungen:

  • VMFileTextSize ist zwar eine Textobjekt-Methode, verwendet aber die Eigenschaften des Textobjekts selbst nicht.

  • VMFileTextSize macht im Kern nichts anderes, als die Routine VMArrayGetCount() aus der "VMFiles" Library. Sie könnten also auch "VMArrayGetCount(fh, block) - 1" verwenden.

Beispiel

DIM size
DIM fh as FILE
DIM block as HANDLE

  < fh und block belegen >

  size = DemoMemo.VMFileTextSize(fh, block)
  MsgBox "Die Datei enthält " + Str$(size) + " Zeichen."

Tipps und Tricks: Wie kann man ...

... Text anhängen?
Man muss den Cursor ans Ende setzen (obj.cursorPos = obj.textLen) und dann InsertFromFile bzw. InsertFromVMFile rufen.

... den selektierten Text ersetzen?
Man muss den selektierten Text löschen (obj.DeleteSelection) und dann InsertFromFile bzw. InsertFromVMFile rufen.

... Teile eines Textes aus einer DOS-Datei lesen?
Man positioniert den Dateizeiger am Anfang des zu lesenden Bereichs und übergibt InsertFromFile bzw. ReplaceFromFile als dritten Parameter die Anzahl der zu lesenden Zeichen. Geben Sie für convertMode Null an, wenn der Zeichensatz nicht konvertiert werden soll.

... Teile eines Textes aus einer VM-Datei lesen?
Man muss den Text aus der VM-Datei vollständig lesen. Mit VMFileTextSize kann man die Anzahl der gelesenen Zeichen ermitteln. Die überflüssigen Teile löscht man anschließend manuell mit obj.DeleteRange. Dabei sollte man hinten anfangen, um sich Berechnungen zu ersparen.

... den selektierten Text in eine Datei schreiben?
Man übergibt WriteToFile bzw. WriteToVMFile den selektierten Bereich als start- bzw. end-Parameter, z.B.
  obj.WriteToVMFile fh , obj.cursorPos , obj.selectionEnd

... Text beim Lesen / Schreiben in eine VM-Datei in einen anderen Zeichensatz konvertieren?
Warum sollte man das tun? Am besten, Sie suchen eine andere Lösung.

Ansonsten: Schreiben Sie den Text konvertiert in eine temporäre DOS-Datei und lesen ihn von dort ohne erneute Konvertierung wieder ein. Dann können Sie ihn in einer VM-Datei speichern. Beim Lesen gehen Sie umgekehrt vor.

Vorsicht! bei der Konvertierung ins UTF8-Format könnten Codes unter 32(dez) entstehen, die beim Einlesen in ein GEOS-Text-Objekt nicht angezeigt werden können und sogar das System crashen könnten.

^

Konvertierfunktionen für macOS & Linux - Neue Funktionen in R-BASIC 1.02

Weiter...