![]() |
FileStream: Record speichern
Hi,
ich habe bisher sehr gute Erfahrungen mit FileStreams gemacht. Wenn ich ein Array mit einem Record aus Strings speichern will, weiß ich, wie das geht. Aber wie könnte man folgendes Array speichern ?
Delphi-Quellcode:
Wie immer muss man natürlich Schritt für Schritt den Record jeden Array-Eintrags speichern. Aber wie speichert man zum Beispiel cFill, Style oder Data ?
type
TElementStyle = (esRechteck, esDach, esFenster, esTuer); TElement = record Name : String; Data : TRect; cFill, cBorder : TColor; Style : TElementStyle; end; var Elements : Array of TElement; |
Re: FileStream: Record speichern
Die stehen doch im Record und müssen nicht extra gespeichert werden. Probleme sehe ich eigentlich nur bei dem String, da ja vermutlich nur der Pointer darauf gespeichert wird, Du müsstest Dich also auf Shortstring beschränken.
|
Re: FileStream: Record speichern
ShortString ginge. Nur wie müsste man das dann machen ? Etwa quasi die Anfangs- und Endposition des Records übergeben, damit FS.Write das schreibt ?
|
Re: FileStream: Record speichern
Wenn ich gerade keinen Knick im Hirn habe, müsste das doch einfach so gehen:
Delphi-Quellcode:
Die Records sind ja alle gleich groß, wenn Du Shortstring verwendest.
for i := Low(Elements) to High(Elements) do
FS.Write(Elements[i],SizeOf(TElement)); |
Re: FileStream: Record speichern
Das könnte man prinzipiell auch in einem Rutsch machen. Die Records liegen ja sequenziell hintereinander. Aufpassen musst du lediglich, wenn du einen packed record, aber kein packed array verwendest.
|
Re: FileStream: Record speichern
Hi,
mit Filestreams habe ich bisher nicht viel gemacht. Aber mit den File of ... Deklarationen:
Delphi-Quellcode:
Mit den Strings wurde ja schon angesprochen.
type
TElementStyle = (esRechteck, esDach, esFenster, esTuer); TElement = record Name : String; Data : TRect; cFill, cBorder : TColor; Style : TElementStyle; end; var Elements : Array of TElement; f1: File of Elements; // Elements müsste glaube ich auch ein Type sein f2: File of TElement; // also besser so elem: TElement; procedure tuwas; begin AssignFile(f2, Datei); Reset(f2); // Typisierte Datei! zum Schreiben öffnen Write(f2, elem); CloseFile(f2); // später, woanders Read(f2, elem); Seek(f2, 4711); // Datensatznummer anspringen Read(f2, elem); end; Gerade das mit dem Seek eröffnet eine recht flexible rudimentäre Datenbank. Könnte bei Bedarf ein Beispiel rauskramen. (Vielleicht habe ich das sogar schonmal hier irgendwo gepostet :gruebel: ) Gruß Michael |
Re: FileStream: Record speichern
Jepp, wenn ich nicht irre, ist das dasselbe Prinzip. Allerdings vermisse ich die {$I-Direktriven bzw. einen try-except-Block ;)
|
Re: FileStream: Record speichern
Auch jepp, habe meinen Beitrag wiedergefunden:
![]() edit: was mir noch gerade einfällt Wenn man die Datei mit Reset geöffnet hat, muss man mit Seek erst zum Ende gehen, sonst überschreibt man den 1. DS in der Datei :( |
Re: FileStream: Record speichern
Nach wie vor geht das aber nicht für einen dynamischen String.
|
Re: FileStream: Record speichern
Hatte ich das nicht erwähnt? :gruebel:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz