【发布时间】:2012-07-02 16:11:54
【问题描述】:
我正在更新组件中的一些属性。为了避免丢失属性错误,我使用 DefineProperties 从流中读取旧属性。大多数属性都可以正常工作,例如整数,但我无法让基于 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)有关。如何读取此类属性?
【问题讨论】:
标签: delphi properties delphi-xe2