DefineProperties メソッドのオーバーライド

提供: RAD Studio
移動先: 案内検索

Published でないプロパティの保存と読み込み への移動


プロパティ値の保存および読み込みを行うメソッドをいったん作成したら、コンポーネントの DefineProperties メソッドをオーバーライドできます。Delphi では、コンポーネントの読み込み時や保存時に、このメソッドを呼び出します。DefineProperties メソッドでは、現在のファイラの DefineProperty メソッドまたは DefineBinaryProperty メソッドを呼び出し、そのメソッドに、プロパティ値の読み込みまたは保存に使用するメソッドを渡す必要があります。読み込みメソッドおよび保存メソッドが TWriterProc 型および TReaderProc 型の場合は、ファイラの DefineProperty メソッドを呼び出します。TStreamProc 型のメソッドを作成した場合は、代わりに、DefineBinaryProperty を呼び出します。

どちらのメソッドを使用してプロパティを定義する場合でも、そのメソッドには、プロパティ値の保存および読み込みを行うメソッドと、プロパティ値を書き込む必要があるかどうかを示す論理値を渡します。プロパティ値が継承可能であるかデフォルト値を持っている場合は、それを書き込む必要はありません。

たとえば、TReaderProc 型の LoadCompProperty メソッドと TWriterProc 型の StoreCompProperty メソッドを作成したと仮定すると、DefineProperties は以下のようにオーバーライドすることになるでしょう。

procedure TSampleComponent.DefineProperties(Filer: TFiler);
  function DoWrite: Boolean;
  begin
    if Filer.Ancestor <> nil then { check Ancestor for an inherited value }
    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 { no inherited value -- check for default (nil) value }
      Result := MyCompProperty <> nil;
  end;
begin
  inherited; { allow base classes to define properties }
  Filer.DefineProperty('MyCompProperty', LoadCompProperty, StoreCompProperty, DoWrite);
end;
void __fastcall TSampleComponent::DefineProperties(TFiler *Filer)
{
  // before we do anything, let the base class define its properties.
  // Note that this example assumes that TSampleComponent derives directly from TComponent
  TComponent::DefineProperties(Filer);
  bool WriteValue;
  if (Filer->Ancestor) // check for inherited value
  {
    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 // no inherited value, write property if not null
    WriteValue = (MyCompProperty != NULL);
  Filer->DefineProperty("MyCompProperty ",LoadCompProperty,StoreCompProperty, WriteValue);
}