Estoy actualizando algunas propiedades en un componente. Para evitar errores de propiedad faltantes, estoy usando DefineProperties para leer las propiedades antiguas de la transmisión. La mayoría de las propiedades funcionan bien, p. Entero, pero no puedo obtener propiedades basadas en TPersistent para trabajar. El procedimiento ReadProperty (TPersistent) en TReader está protegido, no es público y requiere un hack para acceder a él. Incluso entonces, nunca se llama al procedimiento ReadFontProperty y se produce la excepción de propiedad faltante.Utilice DefineProperties para reemplazar las propiedades de TPersistent, p. TFont
¿Cómo leo la propiedad TFont?
Aquí hay un código de muestra de cómo estoy tratando de hacerlo.
...
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;
...
Actualización 1
Probamos la sugerencia de David usando el siguiente código:
Filer.DefineProperty('Font.CharSet', ReadFontCharSet, nil, False);
...
procedure TMyComponent.ReadFontCharSet(Reader: TReader);
begin
Reader.ReadInteger;
end;
Me aparece un error no válida Propiedad Valor. Supongo que tiene algo que ver con Charset del tipo TFontCharset (= System.UITypes.TFontCharset = 0..255). ¿Cómo leo este tipo de propiedad?
@norgepaul ¿Cómo te hiciste con esto? Estoy bastante seguro de que es la respuesta a tu pregunta. –
Hola David. Gracias por la respuesta. Estoy seguro de que es correcto, pero aún no he tenido la oportunidad de probarlo. Trataré de llegar pronto. – norgepaul
Muy bien, solo me preguntaba si te encuentras con un problema y tienes curiosidad. –