加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何创建只读属性?

发布时间:2020-12-15 04:25:47 所属栏目:大数据 来源:网络整理
导读:我在运行时使用TMS对象检查器,但假设我的问题在设计时对Delphi同样有效. 我希望有一个可以通过编程(运行时)或硬编码(在设计时)设置的属性.它应该对用户可见,因为信息对他有用,并且应该在程序运行时更改,而不是由用户通过对象检查器更改. 我试过了 published
我在运行时使用TMS对象检查器,但假设我的问题在设计时对Delphi同样有效.

我希望有一个可以通过编程(运行时)或硬编码(在设计时)设置的属性.它应该对用户可见,因为信息对他有用,并且应该在程序运行时更改,而不是由用户通过对象检查器更改.

我试过了

published property FileName : String read FFileName;

并且该属性是可见的,但它也可以在对象检查器中更改(并在更改时抛出读取地址zer0异常):-(

解决方法

这看起来像一个完全有效和正确的只读属性
published property FileName : String read FFileName;

如果你添加一个公共的额外属性,因此只能在运行时设置你的业务:

public property RuntimeFilename: string read FFileName write FFilename;
//note that two properties,one published and one public point to the same field.

但是,如果你想破解它并在设计时摆脱异常
将其更改为:

//Only writable during runtime.
private
  procedure SetFileName(Value: string);
published
  property FileName: string read FFileName write SetFileName;

....
procedure TMyClass.SetFileName(Value: string);
begin
  if csDesigning in Componentstate then {do nothing}
  else FFileName:= Value;
end;

我认为也可能会发生什么……

断开设计时和运行时代码之间的连接
为了更改代码的运行时行为,您只需要更改源代码并删除属性的write …部分.

这不会影响设计时代码,因为您需要重新安装组件.
如果更改已注册组件的源代码并将更改保留在组件的私有,受保护和/或公共部分中,则通常可以.

但是,如果更改组件的已发布部分并且未重新安装该组件,则启动时将出现异常行为.

这是因为在设计时您仍在使用组件的旧/未更改的二进制版本.此版本尚未删除写入部分,并允许您更改基础字符串FFilename.

在运行时,init-code将读取表单资源1)并找到要写入FFilename的值.但是,过程SetFilename不再可用,因此在程序启动期间会发生访问冲突.

1)(.dfm文件中的数据,现在存储在.exe中的dfm资源中)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读