Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Record als Datei speichern (https://www.delphipraxis.net/204397-record-als-datei-speichern.html)

Willie1 26. Mai 2020 18:10

Delphi-Version: 10.1 Berlin

Record als Datei speichern
 
https://www.delphipraxis.net/62012-r...und-laden.html

Hallo Leute,
ich habe bisher immer nur Records mit fester Länge für Strings benutzt. Also string[50]. Wenn ich jetzt string ohne Länge benutze, muss ich zum Speichern/Laden den oben beschrieben Weg gehen? Viel Aufwand.

Delphi-Quellcode:
type
   TTel = record
     Name: string;
     VName: string;
     Nr: string;
     Mobil: string;
     G: Integer;
   end;
Ist das richtig? Willie.

hoika 26. Mai 2020 18:20

AW: Record als Datei speichern
 
Hallo,
ja, weil String ist nur ein Pointer.

Alallart 26. Mai 2020 18:26

AW: Record als Datei speichern
 
Warum benutzt du dazu nicht eine INI-Datei? Ist dafür wie geschaffen und kommt mit verschiedenen String-Längen klar.

mytbo 26. Mai 2020 19:24

AW: Record als Datei speichern
 
In der mORMot Library Unit SynCommons.pas gibt es viele nützliche Funktionen.
Delphi-Quellcode:
type
  TTelArray = array of TTel;
 
var
  list: TDynArray;
  arrTels: TTelArray;
begin
  SetLength(arrTels, 1);
  arrTels[0].Name := 'Mustermann';
  arrTels[0].VName := 'Willie';
 
  // Speichern
  list.Init(TypeInfo(TTelArray), arrTels);
  FileFromString(list.SaveTo, 'C:\myTels.dat');
 
  // Laden
  // list.LoadFromBinary(StringFromFile('C:\myTels.dat'));
Es gibt auch noch die Möglichkeiten zum Speichern als JSON-Datei -> list.SaveToJSON(). Die ausführliche Hilfe findest du hier:
https://synopse.info/files/html/Syno...8.html#TITL_48

Bis bald...
Thomas

Willie1 27. Mai 2020 16:47

AW: Record als Datei speichern
 
Delphi-Quellcode:
var
  atxt,
  pw, Rardatei,
  rpf: string;
  aLen, pwl: Integer;
  FS: TFileStream;
begin
  aLen:=Length(aTxt);
  FS:=TFilestream.Create(Dateiname,fmCreate);
  FS.Write(aLen, SizeOf(Integer));
  FS.Write(Pointer(aTxt)^,aLen*SizeOf(Char));
  FS.Free;
Ich habe meine eigenen Beiträge und eure Antworten hier durchsucht, eil ich mich erinnerte, das schonmal gefragt zu haben. Könnte es so gehen. Ich verstehe es nicht aber in einem Programm von mir funktioniert es.
Willie.

Keldorn 27. Mai 2020 20:53

AW: Record als Datei speichern
 
Hallo

persönlich wäre ich immer dafür, die Daten einzeln zu schreiben. Mit Filestream und TReader und Writer geht das ganz gut und einfach. Da hast du für jeden Datentypen schon ne Methode und brauchst dich um viele Dinge nicht zu kümmern. Ich finde das auch sehr verständlich und einfach lesbar.

Delphi-Quellcode:
var FS:TFileStream;
    Writer:TWriter;
begin
  fs:=TFileStream.Create(PfadDateiName,fmCreate);
  try
    Writer:=TWriter.Create(fs,const_BufferGroesse);
    try
      //Version schreiben
      Writer.WriteInteger(const_Version_aktuell);

      //Datenschreiben
      Writer.WriteString(s);
      Writer.WriteInteger(i);
      Writer.WriteDate(Datum);

    finally
      writer.Free;
    end;
  finally
    fs.free;
  end;
end;
laden:
Delphi-Quellcode:
var FS:TFileStream;
    Reader:TReader;
    Version:integer;
begin
  if FileExists(PfadDateiName) then
    begin
      fs:=TFileStream.Create(PfadDateiName,fmOpenRead);
      try
        Reader:=TReader.Create(fs,const_BufferGroesse);
        try        
          Version:=Reader.ReadInteger;

          if Version=... then
            ...

        finally
          Reader.Free;
        end;
      finally
        fs.free;
      end;
    end;
end;
Wenn du eine Liste speicherst, dann halt zuerst die Anzahl und dann per Schleife die Daten.

Ich schreib als erstes immer eine Version mit rein. Beim auslesen kannst du die dann auswerten und so auch das laden "älterer DateiVersionen" unterstützen oder laden "neuerer Versionen" blocken. Wenn du mal doch dein record änderst haste auch weniger Probleme.

und ich würde es nicht als record machen, gleich als Klasse mit Savetostream oder savetofilemethoden.

Gruß Frank

Willie1 28. Mai 2020 16:35

AW: Record als Datei speichern
 
Hallo Frank,
Reader und Writer kenne ich, Versionsnummer guter Tipp. Für das Ablegen der Einträge benutze ich TObjectList, sehr flexibel und es gibt eine Sortierroutine. Aber das Speichern und Laden muss ich selbst organisieren, aber das bekomme ich jetzt hin.
Gruß Willie.

Dennis07 30. Mai 2020 13:50

AW: Record als Datei speichern
 
Alternativ kann man hier auch Statt String ein PChar benutzen. Praktischerweise sind die mit Strings Kompatibel und funktioniert mit Read/Write und Filetypen. Sollte man es? Nicht unbedingt, da sind FileStreams schon besser.


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