首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果我以后做TLabel.Font := TDbGrid.Font,TLabel.Free安全吗?

如果我以后做TLabel.Font := TDbGrid.Font,TLabel.Free安全吗?
EN

Stack Overflow用户
提问于 2014-09-17 18:49:41
回答 2查看 76关注 0票数 0

我有一些TLabels,我希望具有与网格相同的字体,这种字体总是可见的。

有些TLabels是在运行时动态创建的:

代码语言:javascript
复制
 Label1 := TLabel.Create(Self);
 Label1.Name := 'MyLabel';
 Label1.Parent := SomeOtherPersisentLabelOnForm.Parent;
 Label1.Left, Width, Height, Top := etc.
 Label1.Font := dbGrid.Font; 

如果以后我这样做,上面的字体分配是否安全:

代码语言:javascript
复制
 Label1.Free;

或者Label1.Free会以这样的方式处理其拥有的Font对象,即网格的Font属性没有指向任何东西?

如果它不安全,是

代码语言:javascript
复制
Label1.Font.Assign(SomeOtherPersisentLabelOnForm.Font);

怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-17 19:03:17

TLabelTControl获得它的Font属性,而TControl.SetFont()不是虚拟的,因此对于每个VCL控件都应该是这样。

代码语言:javascript
复制
procedure TControl.SetFont(Value: TFont);
begin
  FFont.Assign(Value);
end;

所以是的,很安全。

票数 4
EN

Stack Overflow用户

发布于 2014-09-17 19:02:54

代码语言:javascript
复制
Label1.Font := dbGrid.Font; 

用于Font属性TLabel的setter的实现采用另一种字体的副本,而不是引用。因此,您可以将其视为具有值赋值的语义。

属性设置程序实际上是在TControl中声明的,如下所示:

代码语言:javascript
复制
procedure TControl.SetFont(Value: TFont);
begin
  FFont.Assign(Value);
end;

因此,销毁这两种字体中的任何一种都是完美的保存,因为确实有两个不相关的实例,每个控件中都有一个。

您将在整个VCL中找到这种模式,用于字体、笔、笔刷等属性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25898169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档