次のように定義された別の TComponent の子孫を使用して、TComponent 内にカプセル化されていない TCollection をシリアル化できます。
type
TCollectionSerializer = class(TComponent)
protected
FCollectionData: string;
procedure DefineProperties(Filer: TFiler); override;
public
procedure WriteData(Stream: TStream);
procedure ReadData(Stream: TStream);
//
procedure LoadFromCollection(ACollection: TCollection);
procedure SaveToCollection(ACollection: TCollection);
end;
DefineProperties、WriteData、およびReadDataの実装の詳細:
procedure TCollectionSerializer.WriteData(Stream: TStream);
var
StrStream: TStringStream;
begin
StrStream:=TStringStream.Create;
try
StrStream.WriteString(FCollectionData);
Stream.CopyFrom(StrStream,0);
finally
StrStream.Free;
end;
end;
procedure TCollectionSerializer.ReadData(Stream: TStream);
var
StrStream: TStringStream;
begin
StrStream:=TStringStream.Create;
try
StrStream.CopyFrom(Stream,0);
FCollectionData:=StrStream.DataString;
finally
StrStream.Free;
end;
end;
procedure TCollectionSerializer.DefineProperties(Filer: TFiler);
begin
inherited;
//
Filer.DefineBinaryProperty('CollectionData', ReadData, WriteData,True);
end;
LoadFromCollectionおよびSaveToCollectionのテンプレート:
procedure TCollectionSerializer.LoadFromCollection(ACollection: TCollection);
var
CollectionStream: TStream;
begin
CollectionStream:= TCollectionStream.Create(ACollection);
try
ReadData(CollectionStream)
finally
CollectionStream.Free;
end;
end;
procedure TCollectionSerializer.SaveToCollection(ACollection: TCollection);
var
CollectionStream: TStream;
begin
CollectionStream:= TCollectionStream.Create(ACollection);
try
WriteData(CollectionStream);
finally
CollectionStream.Free;
end;
end;
TCollectionStreamについて:
パラメータとしてTCollectionを持つリッチ クリエータを持ち、 TFileStreamのように動作するように設計された TStream の子孫である必要があります。実装する必要があります。免責事項:私はそれをテストしたことはありませんが、TFileStream が機能することはわかります (外部ファイルのストリーミング用)。
結論:
このコンポーネントは、Delphi XE (RCData) で外部ファイルを DFM 内でシリアル化する VCL の方法に着想を得ています。設計時にシリアル化を行うコンポーネント エディタ(TComponentEditor に基づいて実装する必要もあります)とともに登録する必要があります。