AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Record als Datei speichern

Ein Thema von Willie1 · begonnen am 26. Mai 2020 · letzter Beitrag vom 30. Mai 2020
Antwort Antwort
Willie1

Registriert seit: 28. Mai 2008
618 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

Record als Datei speichern

  Alt 26. Mai 2020, 18:10
Delphi-Version: 10.1 Berlin
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.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Record als Datei speichern

  Alt 26. Mai 2020, 18:20
Hallo,
ja, weil String ist nur ein Pointer.
Heiko
  Mit Zitat antworten Zitat
Alallart

Registriert seit: 8. Dez 2015
153 Beiträge
 
#3

AW: Record als Datei speichern

  Alt 26. Mai 2020, 18:26
Warum benutzt du dazu nicht eine INI-Datei? Ist dafür wie geschaffen und kommt mit verschiedenen String-Längen klar.
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
458 Beiträge
 
#4

AW: Record als Datei speichern

  Alt 26. Mai 2020, 19:24
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
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
618 Beiträge
 
Delphi 10.1 Berlin Starter
 
#5

AW: Record als Datei speichern

  Alt 27. Mai 2020, 16:47
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.
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: Record als Datei speichern

  Alt 27. Mai 2020, 20:53
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
618 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

AW: Record als Datei speichern

  Alt 28. Mai 2020, 16:35
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.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
481 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Record als Datei speichern

  Alt 30. Mai 2020, 13:50
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.
Dennis
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 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