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.
„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