Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi File of record speichern (https://www.delphipraxis.net/79559-file-record-speichern.html)

TH3LL 24. Okt 2006 19:29


File of record speichern
 
Hi ;)

Ich erstelle in Delphi eine file of record, um Messdaten zu speichern. Die datei soll während des Programms erstellt werden.
Sieht wiefolgt aus:
Delphi-Quellcode:
  type TMesswert=record
    Amp1,Amp2:real;
    Vol1,Vol2:real;
  end;

var AlleMesswerte:array of TMesswert;
//....

procedure TForm1.Button4Click(Sender: TObject);
var f:file of TMesswert;
    x:integer;
begin
   If savedialog1.Execute then
        Begin
           For x:= 0 to High(AlleMesswerte) do Write(f,AlleMesswerte[x]);
           //Hier soll f nun in Savedialog1.Filename gespeichert werden
        end;

end;
Nun.. Ich habe lange gesucht, aber keine möglichkeit gefunden meine "File of TMesswert" zu speichern^^ Ist in der Delphi-Hilfe zu den Standard I/O-Befehlen von files nicht vorhanden.
Muss ich die Datei vielleicht vorher erstellen? Wenn es den Befehl tatsächlich nicht gibt, schätze ich mal ich muss der file f einen bestimmten Pfad oder eine datei zuweisen, aber wie tue ich dies?

mkinzler 24. Okt 2006 19:36

Re: File of record speichern
 
AssignFile, Reset, Write

HalloDu 24. Okt 2006 19:41

Re: File of record speichern
 
Es müsste eigentlcih wie mit einem ganz normalen Textfile gehen also erst
Delphi-Quellcode:
AssignFile(F, SaveDialog1.FileName)
um der Dateivariable einen Pfad zu geben, dann
Delphi-Quellcode:
Rewrite(F, SaveDialog1.FileName)
um eine neue Datei zu erstellen oder eine bestehende zu leeren, dann
Delphi-Quellcode:
Write(F, AlleMesswerte[x]) // In der For-Schleife
um die einzellnen Records in die Datei zu schreiben, und am Ende nicht das
Delphi-Quellcode:
CloseFile(F)
vergessen um die Datei abzuschließen.

Hab mal gelesen, dass das so funktioniert. Und hoffe das es richtig ist, hoffe es hilft ihr :mrgreen:

Edit: Ich glaube man braucht nur Write *g*

TH3LL 24. Okt 2006 21:32

Re: File of record speichern
 
Autsch .. natürlich...

Rewrite muss es heissen, nicht Reset^^

Hatte zuerst reset da stehn und mich gewundert warums abbricht, aber die Datei ist ja noch nicht erstellt :D
Lange her dass ich Pascal geschrieben hab ;)

Ok danke ^^ Es geht :zwinker:

Hobby-Programmierer 24. Okt 2006 22:21

Re: File of record speichern
 
Nabend ...,
gutes Tutorial über typisierte Dateien.

Sunlight7 24. Okt 2006 23:27

Re: File of record speichern
 
Abgesehen davon, das der Typ Real Out ist, wäre es zu empfehlen, ein Packed Record zu verwenden.
Sonst kann's mal mit dem Compilerschalter {$A+} etwas weh tun. :zwinker:

Delphi-Quellcode:
type TMesswert=PACKED record
    Amp1,Amp2:real;
    Vol1,Vol2:real;
  end;

3_of_8 24. Okt 2006 23:32

Re: File of record speichern
 
Wenn du vor hast, mehrere verschiedene Arten von records in eine Datei zu speichern (kommt vor), dann empfehle ich einen Delphi-Referenz durchsuchenTFileStream.

turboPASCAL 25. Okt 2006 07:42

Re: File of record speichern
 
Ergänzend: Fehlerabfragen nicht Vergessen.

Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var
  f: file of TMesswert;
  x, IOErr: integer;
begin
   If SaveDialog1.Execute then
   begin
     AssignFile(F, SaveDialog1.FileName);
     {$I-}
     Rewrite(F); // Datei neu Erstellen

     IOErr := IOResult;

     if IOErr = 0 then
     begin
       For x:= 0 to High(AlleMesswerte) do
         Write(f, AlleMesswerte[x]);

       CloseFile(F);
     end else
       Showmessage('Fehler bei Dateizugriff. #' + IntToStr(IOErr) );
     {$I+}
   end;

end;
... und ich würde mich mit der VCL auch für FileStreams entscheiden, ist irgendwie einfacher. ;)

Delphi-Quellcode:
procedure TForm1.Button4aClick(Sender: TObject);
var
  fs: TFileStream;
  x: integer;
begin
   If SaveDialog1.Execute then
   begin
     fs := TFileStream.Create(SaveDialog1.FileName, fmCreate or fmOpenWrite);
     try
       fs.Seek(soFromBeginning, 0);

       For x:= 0 to High(AlleMesswerte) do
         fs.Write(AlleMesswerte[x], sizeof(TMesswert));
     finally
       fs.Free;
     end;
   end;
end;

KeMa 27. Okt 2006 12:08

Re: File of record speichern
 
Hallo zusammen,

kann mir auch jemand sagen wie ich dieses Format speichern und öffnen kann?

Delphi-Quellcode:
Type TField = record
     Field : array of String [50]
end;

Type TDatSet = record
     DatSet : array of TField;
     DatExt : array of TField;
     DSFLength : Longword;
     DEFLength : Longword;
     DSLength : Longword;
     Name : String [20];
     Date : String [10];
end;

Type TDBFrame = record
     Data : array of TDatSet;
     System : array of TDatSet;
     DatLength : Longword;
     SysLength : Longword;
     Name : String[20];
end;

Var

DBFrame : TDBFrame;
:gruebel: Isch werd noch amol blöd mit Ding hier...

[edit=alcaeus]Delphi-Tags eingefuegt. Mfg, alcaeus[/edit]

Mavarik 27. Okt 2006 12:46

Re: File of record speichern
 
Naja Hierbei handelt es sich nicht um klassisches Record speichern...

Jeder Record, der eine dynimische Variable hat, muss natürlich einzeln behandelt werden.

Frank :coder:

TH3LL 27. Okt 2006 15:36

Re: File of record speichern
 
Hmm.. ich speichere auch einen Record der ein dynamisches array eines weiteren records beinhaltet...
Wenn ich versuche das herkömmlich zu speichern sind in der datei nur 2 bytes.. Muss ich das alles einzeln abspeichern?

Hansa 27. Okt 2006 16:18

Re: File of record speichern
 
Zitat:

Zitat von Sunlight7
Abgesehen davon, das der Typ Real Out ist, wäre es zu empfehlen, ein Packed Record zu verwenden.
Sonst kann's mal mit dem Compilerschalter {$A+} etwas weh tun. :zwinker:

Genau. Deshalb verwendet man aber auch kein "packed" record, denn dann braucht man kein $A. Die Diskettenzeiten sind rum. Aber eine Frage noch : wieso ist der Typ "real" out ? :shock: Die Zahlentypen wurden oft genug angepasst.

Klaus01 27. Okt 2006 17:47

Re: File of record speichern
 
Ein record, hat feste Datensätze und Datenlängen.
Von einem dynamischen Array werden wohl nur die Adressen gespeichert.
Und die sind wenn Du sie wieder einließt recht wenig wert.

Auf eine feste Datensatzstruktur, magst DU dich nicht festlegen?

Grüße
Klaus

Jens Schumann 27. Okt 2006 19:41

Re: File of record speichern
 
Zitat:

Zitat von KeMa
Hallo zusammen,

kann mir auch jemand sagen wie ich dieses Format speichern und öffnen kann?

Delphi-Quellcode:
Type TField = record
     Field : array of String [50]
end;

Type TDatSet = record
     DatSet : array of TField;
     DatExt : array of TField;
     DSFLength : Longword;
     DEFLength : Longword;
     DSLength : Longword;
     Name : String [20];
     Date : String [10];
end;

Type TDBFrame = record
     Data : array of TDatSet;
     System : array of TDatSet;
     DatLength : Longword;
     SysLength : Longword;
     Name : String[20];
end;

Var

DBFrame : TDBFrame;
:gruebel: Isch werd noch amol blöd mit Ding hier...

Beim Speichern wird der Autor sicherlich mit der Anzahl der TField über das Array iterieren und die Records einzeln abspeichern.
Beim Auslesen musst Du genau das gleiche machen. Nur musst Du wissen wieviel Records von TField kommen. Dir Information ist bestimmt irgendwo gespeichert. Deshalb musst Du mit den Felder experimentieren, die Length enthalten. Darin ist bestimmt die Anzahl der Records in DatSet und so gespeichert.

[edit=alcaeus]Delphi-Tags im zitierten Beitrag eingefuegt. Mfg, alcaeus[/edit]

TH3LL 28. Okt 2006 08:56

Re: File of record speichern
 
Ich habs so gelöst, dass ich Die Datei in der gespeichert werden soll manuell zusammenstelle. Also zuerst die Fixen datenwerte nach der Reihe, und am Ende eine beliebig Lange Liste eines Arrays an Datensätzen. Vor jedem dieser Arrays dann natürlich eine Angabe, wieviele Werte ausgelesen werden sollen.

Aber mir ist aufgefallen, das funktioniert nur mit einer file of "Recordtyp", wenn du nur Daten des Typs "Recordtyp" hast. Denn eine datei die ich als File of Real beschreibe, und dann um einen String hinzuzufügen als file of string öffne enthält nurnoch kauderwelsch.
Gibt es vielleicht eine praktischere Lösung verschiedene Datentypen in einer Datei abzuspeichern, als alles durch den gleichen Typ (in dem Falle string) auszudrücken?

Jens Schumann 28. Okt 2006 09:47

Re: File of record speichern
 
Zitat:

Zitat von TH3LL
Gibt es vielleicht eine praktischere Lösung verschiedene Datentypen in einer Datei abzuspeichern, als alles durch den gleichen Typ (in dem Falle string) auszudrücken?

Ja die gibt es. Das Stichwort heißt: Streams


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 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