Delphi-PRAXiS

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:

sirius 17. Dez 2008 18:38

Re: FileStream: Record speichern
 
Zitat:

Zitat von DeddyH
Hatte ich das nicht erwähnt? :gruebel:

Ja, darauf hat sich ja auch mein Kommentar bezogen: "nach wie vor"
bzw: Es hat sich bei typisierten Dateien bezüglich deines Statements nichts verändert ;)

DeddyH 17. Dez 2008 18:39

Re: FileStream: Record speichern
 
Achso, sry, "I understood you wrong" :lol:

Nils_13 17. Dez 2008 21:01

Re: FileStream: Record speichern
 
Vielen Dank für die vielen Antworten. Ich habe mit der Erinnerung von Neutral General über ICQ daran, einen packed record mit einem Name : String[20] zu nehmen, das Problem gelöst. :)

Chemiker 18. Dez 2008 06:46

Re: FileStream: Record speichern
 
Hallo Nils_13,

es gibt allerdings auch die Möglichkeit einen Langen-String in einem Stream zu speichern, indem man vorher die Länge des Strings ermittelt und diese mit abspeichert. Der große Nachteil dabei ist, dass die Record-Länge natürlich unterschiedlich groß ist.

Bis bald Chemiker

Nils_13 18. Dez 2008 21:29

Re: FileStream: Record speichern
 
Ich weiß, das habe ich bei Playlisten so gemacht. Es ist halt unnötig in dem Fall, von daher geht es auch mit einem 20er String.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:33 Uhr.

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