博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Delphi自定义图形控件的自定义字体属性在设计期报错的解决办法
阅读量:5777 次
发布时间:2019-06-18

本文共 1172 字,大约阅读时间需要 3 分钟。

hot3.png

背景

自定义一个图形控件(继承自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://my.oschina.net/u/209067/blog/2222336

你可能感兴趣的文章
虚拟机类加载机制
查看>>
android代码生成jar包并混淆
查看>>
Java基础2-基本语法
查看>>
一个不错的vue项目
查看>>
屏蔽指定IP访问网站
查看>>
python学习 第一天
查看>>
根据毫秒数计算出当前的“年/月/日/时/分/秒/星期”并不是件容易的事
查看>>
python的图形模块PIL小记
查看>>
shell变量子串
查看>>
iOS的主要框架介绍 (转载)
查看>>
react报错this.setState is not a function
查看>>
poj 1183
查看>>
从根本解决跨域(nginx部署解决方案)
查看>>
javascript实现的一个信息提示的小功能/
查看>>
Centos7.x:开机启动服务的配置和管理
查看>>
HTML5 浏览器返回按钮/手机返回按钮事件监听
查看>>
xss
查看>>
iOS:百度长语音识别具体的封装:识别、播放、进度刷新
查看>>
JS获取服务器时间并且计算距离当前指定时间差的函数
查看>>
java中关于重载与重写的区别
查看>>