Delphi-PRAXiS
Seite 1 von 2  1 2      

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

Nalincah 2. Aug 2004 13:03


Packed Record schnell in Datei speichern
 
Ich hab z.B. folgenden Record:

Delphi-Quellcode:
  Verwaltungsdatei_Header = packed record
    aDatentraeger_Nummer: string[3];        // 1
    xFuellzeichen1: string[3];          // 4
    aBeraternummer: string[7];          // 7
    aBeratername: string[9];          // 14
    xRestart_Kennzeichen: Char;          // 23
    nAnzahl_Datendateien: string[5];       // 24
    nLetzte_Datendateinummer: string[5];    // 29
    xFuellzeichen2: string[95];             // 34
  end;
Nachdem ich ihn gefüllt habe speicher ich ihn so ab:

Delphi-Quellcode:
procedure TFrmMain.Button1Click(Sender: TObject);
var
  ft : TFileStream;
  TF : TextFile;
  FileName:string;
begin
  // Record mit daten füllen
  Fill_Verwaltungsdatei_Header;
  // Datei erstellen und öffnen
  FileName := Edit1.Text + '\EV01';
  AssignFile(TF,FileName);
  Rewrite(TF);
  CloseFile(TF);
  // Daten aus dem Record in die Datei schreiben
  ft := TFileStream.Create(FileName,fmOpenWrite);
  try
    with Verwaltungsdatei_Header do
    begin
      ft.Write(aDatentraeger_Nummer[1],SizeOf(aDatentraeger_Nummer)-1);
      ft.Write(xFuellzeichen1[1],SizeOf(xFuellzeichen1)-1);
      ft.Write(aBeraternummer[1],SizeOf(aBeraternummer)-1);
      ft.Write(aBeratername[1],SizeOf(aBeratername)-1);
      ft.Write(xRestart_Kennzeichen,SizeOf(xRestart_Kennzeichen));
      ft.Write(nAnzahl_Datendateien[1],SizeOf(nAnzahl_Datendateien)-1);
      ft.Write(nLetzte_Datendateinummer[1],SizeOf(nLetzte_Datendateinummer)-1);
      ft.Write(xFuellzeichen2[1],SizeOf(xFuellzeichen2)-1);
    end;
  finally
    ft.free;
  end;
end;
Das ist jedoch sehr umständlich, da ich bei jedem record jedes einzelne Feld einzeln speichern muss. Wie kann ich das automatisieren???

nailor 2. Aug 2004 13:08

Re: Packed Record schnell in Datei speichern
 
gib mal in der ide "file" an und drück dann F1 und geh zur "Dateitypen Object Pascal Reference". Schau dir das an und vor allem das Konstrukt "file of ***"

Luckie 2. Aug 2004 13:11

Re: Packed Record schnell in Datei speichern
 
Warum schreibst du auch alles einzeln rein?
Delphi-Quellcode:
type
  TFoo = record
    Name: String[25];
    ID: Integer;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  fs: TFileStream;
  Foo: TFoo;
begin
  fs := TFileStream.Create('d:\test.dat', fmCreate);
  try
    Foo.Name := 'Müller';
    Foo.ID := 666;
    fs.WriteBuffer(Foo, sizeof(TFoo));
  finally
    FreeAndNil(fs);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  fs: TFileStream;
  Foo: TFoo;
begin
  fs := TFileStream.Create('d:\test.dat', fmOpenRead);
  try
    fs.ReadBuffer(Foo, sizeof(TFoo));
    ShowMessage(Foo.Name+', '+IntToStr(Foo.ID));
  finally
    FreeAndNil(fs);
  end;
end;

Nalincah 2. Aug 2004 13:19

Re: Packed Record schnell in Datei speichern
 
Wenn ich das richtig verstehe:

Als TextFile abspeichern?

nailor 2. Aug 2004 13:20

Re: Packed Record schnell in Datei speichern
 
näää. entweder als stream (luckies idee) oder als "file of Verwaltungsdatei_Header" (meine idee)

Luckie 2. Aug 2004 13:21

Re: Packed Record schnell in Datei speichern
 
Wie "als TextFile" speichern? Ich schreibe genauso eine typisierte Datei wie du. Meine Datei sollte am Ende genauso aussehen, wie mit deiner Methode geschrieben.

Nalincah 2. Aug 2004 13:33

Re: Packed Record schnell in Datei speichern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habs mal mit Luckies methode ausprobiert
Leider speichert der mir auch die Anzahl der Zeichen in der Stringkette. Das soll er aber nicht. Guckt euch mal die dateien mit nem hex-editor an. Da wird das verdeutlicht

Luckie 2. Aug 2004 13:47

Re: Packed Record schnell in Datei speichern
 
Also, wenn du es als reine Textdatei haben willst, dann musst du es auch so schreiben oder deinen umständlichen Weg in Kauf nehmen. Ist es denn wichtig, dass man die datei auch mit einem Texteditor lesen und bearbeiten kann?

Nalincah 2. Aug 2004 13:59

Re: Packed Record schnell in Datei speichern
 
nein, es sind keine textdateien, da auch steuerzeichen vorhanden sind
das mit dem record mach ich so. will halt den record komplett speichern (geht an sich auch ganz gut mit deiner methode) aber ich will die Position 0 (In dem die Länge steht) des Strings nicht mitspeichern. Wie mach ich das?

Giantics 2. Aug 2004 14:48

Re: Packed Record schnell in Datei speichern
 
Zitat:

Zitat von General2004
...will halt den record komplett speichern (geht an sich auch ganz gut mit deiner methode) aber ich will die Position 0 (In dem die Länge steht) des Strings nicht mitspeichern. Wie mach ich das?

Darf man fragen, warum die Läng nicht gespeichert werden darf?

Diese Steuerzeichen stören doch überhaupt nicht. :gruebel:

Jedenfalls ist diese Methode ein gesamtes Record zu speichern relativ einfach und sicher.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr.
Seite 1 von 2  1 2      

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