Methoden zum Speichern und Laden von Eigenschaftswerten erstellen
Nach oben zu Nicht als "published" deklarierte Eigenschaften speichern und laden
Damit Sie Eigenschaften, die nicht als published deklariert sind, speichern und laden können, benötigen Sie eine Methode zum Speichern und eine Methode zum Laden des Eigenschaftswerts. Sie haben zwei Möglichkeiten, um diese Methoden bereitzustellen:
- Erstellen Sie eine Methode des Typs TWriterProc (zum Speichern des Eigenschaftswerts) und eine Methode des Typs TReaderProc (zum Laden des Eigenschaftswerts). Wenn Sie auf diese Weise vorgehen, können Sie die integrierten Merkmale von Delphi zum Speichern und Laden einfacher Typen nutzen. Verwenden Sie diesen Ansatz, wenn der Eigenschaftswert aus Typen besteht, die Delphi speichern und laden kann.
- Erstellen Sie zwei Methoden des Typs TStreamProc: eine Methode zum Speichern, und eine zum Laden des Eigenschaftswerts. TStreamProc nimmt einen Stream als Argument. Über die Methoden dieses Streams sind dann Lese- und Schreibzugriffe auf die Eigenschaftswerte möglich.
Ein Beispiel: Eine Eigenschaft repräsentiert eine Komponente, die zur Laufzeit erzeugt wird. Delphi ist zwar in der Lage, diesen Wert zu speichern, tut dies aber nicht automatisch, da die Komponente nicht im Formular-Designer erstellt wurde. Da das Streaming-System Komponenten laden und speichern kann, können Sie den ersten Ansatz verwenden. Die folgenden Methoden laden und speichern die dynamisch erzeugte Komponente, die den Wert einer Eigenschaft namens MyCompProperty darstellt:
procedure TSampleComponent.LoadCompProperty(Reader: TReader);
begin
if Reader.ReadBoolean then
MyCompProperty := Reader.ReadComponent(nil);
end;
procedure TSampleComponent.StoreCompProperty(Writer: TWriter);
begin
Writer.WriteBoolean(MyCompProperty <> nil);
if MyCompProperty <> nil then
Writer.WriteComponent(MyCompProperty);
end;
void __fastcall TSampleComponent::LoadCompProperty(TReader *Reader)
{
if (Reader->ReadBoolean())
MyCompProperty = Reader->ReadComponent(NULL);
}
void __fastcall TSampleComponent::StoreCompProperty(TWriter *Writer)
{
if (MyCompProperty)
{
Writer->WriteBoolean(true);
Writer->WriteComponent(MyCompProperty);
}
else
Writer->WriteBoolean(false);
}