Используйте DefineProperties для замены свойств TPersistent, например. TFont

Я обновляю некоторые свойства в компоненте. Чтобы избежать ошибок отсутствия свойств, я использую DefineProperties для чтения старых свойств из потока. Большинство свойств работают нормально, например. Integer , но я не могу заставить работать свойства, основанные на TPersistent . ReadProperty (TPersistent)Процедура в TReader защищена, не является общедоступной и требует взлома для доступа к ней. Даже в этом случае процедура 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

Попробовал предложение Дэвида, используя следующий код:

Filer.DefineProperty('Font.CharSet', ReadFontCharSet, nil, False);

...

procedure TMyComponent.ReadFontCharSet(Reader: TReader);
begin
  Reader.ReadInteger;
end;

Я получаю сообщение об ошибке Invalid Property Value . Я предполагаю, что это как-то связано с тем, что Charset имеет тип TFontCharset(= System.UITypes.TFontCharset = 0..255 ). Как я могу прочитать этот тип свойства?

5
задан norgepaul 3 July 2012 в 09:25
поделиться