Ich aktualisiere einige Eigenschaften in einer Komponente. Um Fehler bei der Eigenschaft zu vermeiden, verwende ich DefineProperties, um die alten Eigenschaften aus dem Stream zu lesen. Die meisten Eigenschaften funktionieren gut, z.B. Integer, aber ich kann keine Eigenschaften basierend auf TPersistent zu arbeiten. Die ReadProperty (TPersistent) Prozedur in TReader ist geschützt, nicht öffentlich und erfordert einen Hack, um darauf zuzugreifen. Selbst dann wird die ReadFontProperty-Prozedur nie aufgerufen und die Ausnahme der fehlenden Eigenschaft tritt auf.Verwenden Sie DefineProperties, um TPersistent-Eigenschaften zu ersetzen, z. TFont
Wie lese ich die TFont Eigenschaft?
Hier ist ein Beispielcode, wie ich es versuche.
...
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;
...
Update 1
David Vorschlag mit dem folgenden Code versucht:
Filer.DefineProperty('Font.CharSet', ReadFontCharSet, nil, False);
...
procedure TMyComponent.ReadFontCharSet(Reader: TReader);
begin
Reader.ReadInteger;
end;
Ich erhalte einen Ungültiger Eigenschaftswert Fehler. Ich nehme an, es ist etwas mit Charset vom Typ TFontCharset (= System.UITypes.TFontCharset = 0..255) zu tun. Wie lese ich diese Art von Eigentum?
@norgepaul Wie bist du damit klargekommen? Ich bin mir ziemlich sicher, dass es die Antwort auf deine Frage ist. –
Hallo David. Danke für die Antwort. Ich bin mir sicher, dass es korrekt ist, aber ich hatte noch keine Gelegenheit es zu testen. Ich werde versuchen, bald darauf zu kommen. – norgepaul
OK gut, ich habe mich nur gefragt, ob du auf ein Problem gestoßen bist und neugierig warst. –