delphi - 如何创建只读属性?

标签 delphi

我在运行时使用 TMS 对象检查器,但假设我的问题在设计时对于 Delphi 同样有效。

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

我试过了

published property FileName : String read FFileName;

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

最佳答案

这看起来是一个完全有效且正确的只读属性

published property FileName : String read FFileName;

如果您添加一个额外的公共(public)属性,因此只能在运行时设置,您就可以进行业务:

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 ... 部分。

但这不会影响设计时代码,因为您需要重新安装该组件。
如果您更改已注册组件的源代码,并将更改保留在组件的 privateprotected 和/或 public 部分中,则通常都可以。

但是,如果您更改组件的 published 部分并且不重新安装该组件,您将在启动时出现异常行为。

这是因为在设计时,您仍在使用组件的旧的/未更改的二进制版本。此版本未删除write部分,并允许您更改底层字符串FFilename

运行时,初始化代码将读取表单资源 1) 并发现要写入 FFilename 的值。但是,过程 SetFilename 不再可用,因此在程序启动期间会发生访问冲突。

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

关于delphi - 如何创建只读属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5738936/

相关文章:

oracle - 从数据库读取整数返回 float

delphi - 如何将 BLOB 流中的任意图像加载到 TImage 中?

delphi - 使用 TEmbeddedWB 或 TWebBrowser 检测外部内容

delphi - GUI组件能否获得GUI编辑器的网格对齐值?

mysql - 循环遍历 Delphi 记录集中的参数

delphi - 符号 'Resume' 已弃用/线程错误 : The handle is invalid (6)

string - Delphi:调用名称存储在字符串中的函数

arrays - 如何在没有 ShareMem 单元的情况下将动态字符串数组传递给 dll 库(dll 和用 d7 编写的客户端)?

delphi - TEdit onclick 全选?

delphi - Delphi 中 WideString 的 WrapText