DefineProperties メソッドのオーバーライド
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);
}