Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi FileStream: Record speichern (https://www.delphipraxis.net/126081-filestream-record-speichern.html)

Nils_13 17. Dez 2008 16:48


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:
type
  TElementStyle = (esRechteck, esDach, esFenster, esTuer);
  TElement = record
    Name          : String;
    Data          : TRect;
    cFill, cBorder : TColor;
    Style         : TElementStyle;
  end;

var Elements : Array of TElement;
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 ?

DeddyH 17. Dez 2008 16:57

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.

Nils_13 17. Dez 2008 16:58

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 ?

DeddyH 17. Dez 2008 17:01

Re: FileStream: Record speichern
 
Wenn ich gerade keinen Knick im Hirn habe, müsste das doch einfach so gehen:
Delphi-Quellcode:
for i := Low(Elements) to High(Elements) do
  FS.Write(Elements[i],SizeOf(TElement));
Die Records sind ja alle gleich groß, wenn Du Shortstring verwendest.

Apollonius 17. Dez 2008 17:08

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.

Michael Habbe 17. Dez 2008 17:15

Re: FileStream: Record speichern
 
Hi,

mit Filestreams habe ich bisher nicht viel gemacht.
Aber mit den File of ... Deklarationen:

Delphi-Quellcode:
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;
Mit den Strings wurde ja schon angesprochen.
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

DeddyH 17. Dez 2008 17:19

Re: FileStream: Record speichern
 
Jepp, wenn ich nicht irre, ist das dasselbe Prinzip. Allerdings vermisse ich die {$I-Direktriven bzw. einen try-except-Block ;)

Michael Habbe 17. Dez 2008 17:21

Re: FileStream: Record speichern
 
Auch jepp, habe meinen Beitrag wiedergefunden: http://www.delphipraxis.net/internal...=570728#570728

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 :(

sirius 17. Dez 2008 17:22

Re: FileStream: Record speichern
 
Nach wie vor geht das aber nicht für einen dynamischen String.

DeddyH 17. Dez 2008 17:27

Re: FileStream: Record speichern
 
Hatte ich das nicht erwähnt? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz