コンポーネントのいくつかのプロパティを更新しています。プロパティの欠落エラーを回避するために、DefinePropertiesを使用してストリームから古いプロパティを読み取ります。Integerなど、ほとんどのプロパティは正常に機能しますが、 TPersistentに基づくプロパティを機能させることができません。TReaderのReadProperty( TPersistent )プロシージャは保護されており、パブリックではなく、アクセスするにはハックが必要です。それでも、ReadFontPropertyプロシージャが呼び出されることはなく、プロパティの欠落の例外が発生します。
TFontプロパティを読み取るにはどうすればよいですか?
これが私がそれをやろうとしている方法のいくつかのサンプルコードです。
...
type
TMyComponent = class(TComponent)
strict private
// Removed
//FIntegerProperty: Integer;
//FFontProperty: TFont;
// New
FNewIntegerProperty: Integer;
FNewFontProperty: TFont;
procedure ReadIntegerProperty(Reader: TReader);
procedure ReadFontProperty(Reader: TReader);
protected
procedure DefineProperties(Filer: TFiler); override;
published
// Removed properties
//property IntegerProperty: Integer read FIntegerProperty write FIntegerProperty;
//property FontProperty: TFont read FFontProperty write SetFontProperty;
// New properties
property NewIntegerProperty: Integer read FNewIntegerProperty write FNewIntegerProperty;
property NewFontProperty: TFont read FNewFontProperty write SetNewFontProperty;
end;
implementation
procedure TMyComponent.DefineProperties(Filer: TFiler);
begin
inherited;
// This works
Filer.DefineProperty('IntegerProperty', ReadIntegerProperty, nil, FALSE);
// This doesn't
Filer.DefineProperty('FontProperty', ReadFontProperty, nil, FALSE);
end;
procedure TMyComponent.ReadIntegerProperty(Reader: TReader);
begin
FNewIntegerProperty:= Reader.ReadInteger;
end;
type
THackReader = class(TReader);
procedure TMyComponent.ReadFontProperty(Reader: TReader);
begin
{ TODO : This doesn't work. How do we read fonts? }
THackReader(Reader).ReadProperty(FNewFontProperty);
end;
...
アップデート1
次のコードを使用して、Davidの提案を試しました。
Filer.DefineProperty('Font.CharSet', ReadFontCharSet, nil, False);
..。
procedure TMyComponent.ReadFontCharSet(Reader: TReader);
begin
Reader.ReadInteger;
end;
無効なプロパティ値エラーが発生します。これは、 CharsetのタイプがTFontCharset(= System.UITypes.TFontCharset = 0..255)であることに関係していると思います。このタイプのプロパティを読み取るにはどうすればよいですか?