コンポーネントのいくつかのプロパティを更新しています。プロパティの不足を避けるために、私はDefinePropertiesを使ってストリームから古いプロパティを読み込みます。ほとんどのプロパティは正常に動作します。 整数、私はプロパティが動作するようにTPersistentはに基づいて取得することはできません。 踏むでReadProperty(TPersistentは)手順は、保護された公共ないし、それをアクセスするためのハックを必要としています。それでも、ReadFontPropertyプロシージャは呼び出されず、不足しているプロパティの例外が発生します。DefinePropertiesを使用してTP固有のプロパティを置き換えます。 TFont
にはどうすればのTFontプロパティを読みますか。
ここに私がそれをやろうとしている方法のサンプルコードがあります。 1
...
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;
...
アップデートは、次のコードを使用して、Davidの提案をしようとしました:
Filer.DefineProperty('Font.CharSet', ReadFontCharSet, nil, False);
...
procedure TMyComponent.ReadFontCharSet(Reader: TReader);
begin
Reader.ReadInteger;
end;
は私がプロパティの値が不正ですエラーが発生します。私はそれがTFontCharset(= System.UITypes.TFontCharset = 0 255)タイプの文字セットビーイングとは何かだと思います。このタイプの物件を読むにはどうすればいいですか?あなたがTFont
の個々の公表プロパティで作業する必要があり、完全修飾名を使用する必要がありますこれを行うために
@norgepaulどのようにこれで乗り越えましたか?私はそれがあなたの質問に対する答えだと確信しています。 –
こんにちはDavid。答えをありがとう。私はそれが正しいと確信していますが、私はまだそれをテストする機会がありませんでした。私はすぐにそれに着手しようとします。 – norgepaul
ええ、私はちょうどあなたが問題に遭遇し、好奇心が強いかどうか疑問に思った。 –