我创建了自己的组件,其中包含一个 TFont 以及 适当的属性。
该组件在公共(public)声明中具有以下属性
property CaptionFont: TFont read fCaptionFont write SetCaptionFont;
SetCaptionFont 过程如下所示
procedure TMyComponent.SetCaptionFont(value: TFont);
begin
fCaptionFont := value;
end;
我正在尝试使用以下代码将字体名称和字体大小分配给我的组件:
MyComponent.CaptionFont.Name := fGlobalStandardFontName;
MyComponent.CaptionFont.Size := fGlobalStandardFontSize;
但是,当在该行放置断点时
MyComponent.CaptionFont.Name := fGlobalStandardFontName;
然后点击“Trace Into (F7)”调试按钮,代码跳转到TFont代码并 完全忽略 SetCaptionFont 过程。
我期待调用 SetCaptionFont 过程。
这是怎么回事?
最佳答案
SetCaptionFont()
在为子属性赋值时不会被调用,因为您没有为 CaptionFont
属性本身赋值。
即使调用了它,您的 SetCaptionFont()
也没有正确实现。您正在获取源 TFont
的所有权并泄漏您的原始 TFont
。您需要使用 Assign()
来将源 TFont
值复制到您现有的 TFont
中。
要检测子属性值更改(包括来自 Assign()
),您需要将 OnChange
事件处理程序分配给您的 fCaptionFont
对象,例如:
constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited;
fCaptionFont := TFont.Create;
fCaptionFont.OnChange := CaptionFontChanged;
end;
procedure TMyComponent.SetCaptionFont(value: TFont);
begin
fCaptionFont.Assign(value);
end;
procedure TMyComponent.CaptionFontChanged(Sender: TObject);
begin
Invalidate;
end;
procedure TMyComponent.Paint;
begin
// use fCaptionFont as needed...
end;
关于delphi - 属性未写入,仅在 Delphi XE2 中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26328415/