Die Methode DefineProperties überschreiben

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Nicht als "published" deklarierte Eigenschaften speichern und laden


Nachdem Sie die Methoden zum Speichern und Laden des Eigenschaftswerts erstellt haben, können Sie die Methode DefineProperties der Komponente überschreiben. Diese Methode wird von Delphi zum Laden und Speichern der Komponente aufgerufen. In der Methode DefineProperties müssen Sie die DefineProperty - bzw. die DefineBinaryProperty-Methode des aktuellen Filer-Objekts aufrufen und ihr die Methode übergeben, die zum Laden bzw. Speichern des Eigenschaftswerts verwendet werden soll. Wenn Sie zu diesem Zweck Methoden des Typs TWriterProc und TReaderProc definiert haben, rufen Sie die Methode DefineProperty des Filer-Objekts auf. Wenn Sie Methoden des Typs TStreamProc erstellt haben, rufen Sie DefineBinaryProperty auf.

An die Methode zur Definition der Eigenschaft übergeben Sie neben den Methoden zum Laden und Speichern des Eigenschaftswerts auch einen Booleschen Wert, der angibt, ob der Eigenschaftswert gespeichert werden muss. Das Speichern des Werts ist nicht erforderlich, wenn er abgeleitet wird oder wenn es sich um einen Standardwert handelt.

Bei Verwendung der LoadCompProperty-Methode des Typs TReaderProc und der StoreCompProperty-Methode des Typs TWriterProc kann DefineProperties folgendermaßen überschrieben werden:

procedure TSampleComponent.DefineProperties(Filer: TFiler);
  function DoWrite: Boolean;
  begin
    if Filer.Ancestor <> nil then { Vorfahr auf zu erbenden Wert prüfen }
    begin
      if TSampleComponent(Filer.Ancestor).MyCompProperty = nil then
        Result := MyCompProperty <> nil
      else   if (MyCompProperty = nil) or
         (TMy5Comp(Filer.Ancestor).MyCompProperty.Name <> MyCompProperty.Name) then
        Result := True
      else Result := False;
    end
    else { Kein geerbter Wert -- auf Standardwert (nil) prüfen }
      Result := MyCompProperty <> nil;
  end;
begin
  inherited; { Basisklassen können die Eigenschaften definieren }
  Filer.DefineProperty('MyCompProperty', LoadCompProperty, StoreCompProperty, DoWrite);
end;
void __fastcall TSampleComponent::DefineProperties(TFiler *Filer)
{
  // Basisklassen das Definieren ihrer Eigenschaften ermöglichen.
  // TSampleComponent muss direkt von TComponent abgeleitet werden.
  TComponent::DefineProperties(Filer);
  bool WriteValue;
  if (Filer->Ancestor) // Auf geerbten Wert prüfen
  {
    if ((TSampleComponent *)Filer->Ancestor)->MyCompProperty == NULL)
      WriteValue = (MyCompProperty != NULL);
    else if ((MyCompProperty == NULL) ||
             (((TSampleComponent *)Filer->Ancestor)->MyCompProperty->Name !=
                                                     MyCompProperty->Name))
      WriteValue = true;
    else WriteValue = false;
  }
  else // Kein geerbter Wert - Eigenschaft schreiben, wenn nicht Null
    WriteValue = (MyCompProperty != NULL);
  Filer->DefineProperty("MyCompProperty ",LoadCompProperty,StoreCompProperty, WriteValue);
}