Einzelnen Beitrag anzeigen

Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#1

TRecordFile - Records per "Bauplan" in Dateien spe

  Alt 18. Jan 2007, 23:40
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.
Angehängte Dateien
Dateityp: zip stundenplan_759.zip (210,9 KB, 27x aufgerufen)
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat