Hallo,
ich habe hier noch eine Möglichkeit anzubieten.
TFont ist ein Nachfahre von TPersistent. Also muss man irgendwie das
Delphi-Streamingsystem benutzen können. Angeregt durch einen anderen
Thread (wie nicht mehr wo) habe ich jetzt folgenden Vorschlag.
Für die Lösung werden wir ObjectTextToBinary und ObjectBinaryToText verwenden.
Hier die Funktion, die das Objekt in einen String konvertiert
Delphi-Quellcode:
Type
TPersistentDummyComponent = class(TComponent)
private
FPersistent: TPersistent;
published
property Persistent : TPersistent read FPersistent write FPersistent;
end;
...
function PersitentToString(Persistent : TPersistent): string;
var
BinStream : TMemoryStream;
StrStream : TStringStream;
s : string;
FPersitentDummy : TPersistentDummyComponent;
begin
FPersitentDummy:=TPersistentDummyComponent.Create(Nil);
BinStream := TMemoryStream.Create;
try
FPersitentDummy.Persistent:=Persistent;
StrStream := TStringStream.Create(s);
try
BinStream.WriteComponent(FPersitentDummy);
BinStream.Seek(0, soFromBeginning);
ObjectBinaryToText(BinStream, StrStream);
StrStream.Seek(0, soFromBeginning);
Result:= StrStream.DataString;
finally
StrStream.Free;
end;
finally
FPersitentDummy.Free;
BinStream.Free
end;
end;
Die Funktion erwartet einen Parameter der Klasse TPersistent. Da TFont ein Nachfahre von
TPersistent ist, ist das auch kein Problem.
Da die Methode WriteComponent eine Komponente als Parameter erwartet, können wir den
Parameter Persistent nicht direkt verwenden. Dafür habe ich mir eine Dummyklasse (TPersistentDummyComponent) gebastelt. Diese Klasse hat die published (nur published properties werden automatisch gestreamt) property Persistent. Nach
FPersitentDummy.Persistent:=Persistent;
hängt unser Paramter (also das Objekt, das wir in einen String verwandel wollen) an TPersistentDummyComponent. Dann wird ein bisschen getreamt und anschließend mit ObjectBinaryToText ein String daraus gemacht.
Die Funktion StringToPersitent geht jetzt den umgekehrten Weg. Value ist das Objekt als String
und der Parameter Persistent eine Referenz auf ein gültiges Objekt. Mit dieser Funktion kan das Objekt aus dem String wieder hergestellt werden.
Delphi-Quellcode:
function StringToPersitent(Value: string; Persistent : TPersistent): TPersistent;
var
StrStream : TStringStream;
BinStream : TMemoryStream;
FPersitentDummy : TPersistentDummyComponent;
begin
FPersitentDummy:=TPersistentDummyComponent.Create(Nil);
FPersitentDummy.Persistent:=Persistent;
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result:=(BinStream.ReadComponent(FPersitentDummy) as TPersistentDummyComponent).Persistent;
finally
BinStream.Free;
end;
finally
FPersitentDummy.Free;
StrStream.Free;
end;
end;
Die Funktionen finden sich in der
unit PersistentStr.pas.
Beispiel -> siehe Anlage
Ach ja - man natürlich nicht nur TFont in einen String konvertieren, sondern auch jeden Nachfahren von TPersistent.