![]() |
Delphi-Version: 10.1 Berlin
Record als Datei speichern
![]() 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:
Ist das richtig? Willie.
type
TTel = record Name: string; VName: string; Nr: string; Mobil: string; G: Integer; end; |
AW: Record als Datei speichern
Hallo,
ja, weil String ist nur ein Pointer. |
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.
|
AW: Record als Datei speichern
In der mORMot Library Unit SynCommons.pas gibt es viele nützliche Funktionen.
Delphi-Quellcode:
Es gibt auch noch die Möglichkeiten zum Speichern als JSON-Datei -> list.SaveToJSON(). Die ausführliche Hilfe findest du hier:
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')); ![]() Bis bald... Thomas |
AW: Record als Datei speichern
Delphi-Quellcode:
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.
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; Willie. |
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:
laden:
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;
Delphi-Quellcode:
Wenn du eine Liste speicherst, dann halt zuerst die Anzahl und dann per Schleife die Daten.
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; 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 |
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. |
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 14:44 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