我有一些TLabels,我希望具有与网格相同的字体,这种字体总是可见的。
有些TLabels是在运行时动态创建的:
Label1 := TLabel.Create(Self);
Label1.Name := 'MyLabel';
Label1.Parent := SomeOtherPersisentLabelOnForm.Parent;
Label1.Left, Width, Height, Top := etc.
Label1.Font := dbGrid.Font; 如果以后我这样做,上面的字体分配是否安全:
Label1.Free;或者Label1.Free会以这样的方式处理其拥有的Font对象,即网格的Font属性没有指向任何东西?
如果它不安全,是
Label1.Font.Assign(SomeOtherPersisentLabelOnForm.Font);怎么做?
发布于 2014-09-17 19:03:17
TLabel从TControl获得它的Font属性,而TControl.SetFont()不是虚拟的,因此对于每个VCL控件都应该是这样。
procedure TControl.SetFont(Value: TFont);
begin
FFont.Assign(Value);
end;所以是的,很安全。
发布于 2014-09-17 19:02:54
Label1.Font := dbGrid.Font; 用于Font属性TLabel的setter的实现采用另一种字体的副本,而不是引用。因此,您可以将其视为具有值赋值的语义。
属性设置程序实际上是在TControl中声明的,如下所示:
procedure TControl.SetFont(Value: TFont);
begin
FFont.Assign(Value);
end;因此,销毁这两种字体中的任何一种都是完美的保存,因为确实有两个不相关的实例,每个控件中都有一个。
您将在整个VCL中找到这种模式,用于字体、笔、笔刷等属性。
https://stackoverflow.com/questions/25898169
复制相似问题