当前位置:龙泉人才网 - 人才百科 -

delphi程序员(Delphi自定义图形控件的自定义字体属性在设计期报错的解决办法)

  • 人才百科
  • 2023-11-06 10:00
  • 龙泉小编

背景

自定义一个图形控件(继承自TGraphicControl类),需要在不同区域显示不同字体的内容,此时会需要在设计器中加入多个字体,方法是在控件的published区增加对应的字体属性即可(使用Ctrl+Shift+C可快速生成),如:

TMyGraphicControl = class(GraphicControl) private FText1Font: TFont; FText2Font: TFont; procedure SetText1Font(const Value: TFont); procedure SetText2Font(const Value: TFont); protected procedure Paint; override; public { public declarations } published property Text1Font:TFont read FText1Font write SetText1Font; property Text2Font:TFont read FText2Font write SetText2Font; end;

这样就可以在设计器里像使用原生控件一样使用自己的控件了。

问题

但是,如果在设计期选择了弹出字体对话框进行设置字体,IDE就会报错(大意是读或写某个地址异常),而在运行期则正常!

原因

对比查看Delphi自带的控件源码,终于找到了原因。

//Delphi TControl类设置字体属性的方法 procedure TControl.SetFont(Value: TFont); begin FFont.Assign(Value); end; //自己设置字体属性的方法 procedure TMyGraphicControl.SetText1Font(const Value: TFont); begin FText1Font := Value; end;

由此,真相大白!

TFont是类,其实例使用:=赋值时,实例上是把实例的指针指向了值的来源;而使用Assign方法,则是把各字段值复制了一份存放在实例的字段中。在运行期,对字体赋值,值的来源在上下文环境中是确定且存在的;在设计期通过设计器直接对字体各子项赋值,实际上是在逐一对其字段赋值;而在设计期通过字体对话框进行赋值,实际是产生了一条Windows消息,消息传递完成之后内容就会销毁,所以使用:=赋值就会产生地址读写的异常。

总结

对类的实例进行赋值时,一定要想清楚最终想要的效果是什么,由此来确定是使用:=还是Assign方法。

免责声明:本文内容来源于网络或用户投稿,龙泉人才网仅提供信息存储空间服务,不承担相关法律责任。若收录文章侵犯到您的权益/违法违规的内容,可请联系我们删除。
https://www.lqrc.cn/a/rencai/75083.html

  • 关注微信
下一篇:暂无

猜你喜欢

微信公众号