Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   TRecordFile - Records per "Bauplan" in Dateien speichern (https://www.delphipraxis.net/84590-trecordfile-records-per-bauplan-dateien-speichern.html)

3_of_8 18. Jan 2007 23:40


TRecordFile - Records per "Bauplan" in Dateien spe
 
Liste der Anhänge anzeigen (Anzahl: 1)
Morgen.

Ich hab mir schon lange mal sowas gewünscht wie "Objektpersistenz" (<-Anführungszeichen) bei Records. Das heißt, ich habe eine Klasse mit Methoden, die ich Aufrufe, dabei meinen Record übergebe, und der kann das in eine Datei speichern und auch daraus wieder laden.

Kann sein, dass ich mit diesem Wunsch ziemlich alleine dastehe, aber ich hab das trotzdem mal programmiert.

Es funktioniert im Prinzip so:
Man "registriert" eine Art Bauplan für jeden Record-Typen, den man speichern will. Dieser besteht aus dem Namen des Recordtyps und aus "Feldern", die jeweils auch einen Namen haben sowie einen Typen.

Dieser Record:

Delphi-Quellcode:
  TTestRec=record
    a, b, c, d: Integer;
    e: String[6];
    f: Single;
  end;
...lässt sich dem TRecordFile so "beibringen":

Delphi-Quellcode:
type
  TTestRecStructure=class(TRecordStructure)
  protected
    procedure CreateStructureFields; override;
  public
    class function GetRecordTypeName: String; override;
  end;

implementation

class function TTestRecStructure.GetRecordTypeName: String;
begin
  Result:='TTestRec';
end;

procedure TTestRecStructure.CreateStructureFields;
begin
  Add(TRecordStaticField.Create('a', 0, ftInteger));
  Add(TRecordStaticField.Create('b', 4, ftInteger));
  Add(TRecordStaticField.Create('c', 8, ftInteger));
  Add(TRecordStaticField.Create('d', 12, ftInteger));
  Add(TRecordStaticField.Create('e', 17, ftString, 6));
  Add(TRecordStaticField.Create('f', 24, ftSingle));
end;

initialization
begin
  RegisterStructureClass(TTestRecStructure);
end;

end.
Das ganze funktioniert momentan nur mit statischen Records (d.h. keine Strings oder Arrays mit Finalisation) und auch nur speichern, nicht laden (das kommt morgen... äh, heute) und außerdem nur mit recht ungeeigneten INI-Files.

Wird noch verbessert.

Folgende Typen sind eingebaut:
ftShortint, ftSmallint, ftLongint, ftInt64, ftByte, ftWord, ftLongWord, ftSingle, ftDouble, tExtended, ftReal48, ftComp, ftCurrency, ftString, ftBinary

ftBinary ist für statische Arrays oder sowas gedacht, würde ich aber momentan noch nicht empfehlen, da INI-Files sehr empfindlich bei Steuerzeichen, wie sie in Binärdaten gerne vorkommen, sind.

Project1.dpr und Unit1.pas sind das Testprogramm, Test.pas ist die Unit, die das TTestRec deklariert und die TTestRecStructure bereitstellt, also den "Bauplan" von TTestRec und RecordFile.pas ist der Quellcode der verwendeten Klasse.

inherited 19. Jan 2007 10:05

Re: TRecordFile - Records per "Bauplan" in Dateien
 
Das speichern zumindest klappt wunderbar. Nur ein bisschen zu kompliziert ist mir das noch^^


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