delphi - 为什么 TForm.Handle 是 getter 而不是字段?

标签 delphi handle vcl tform

我最近正在调试一个复杂的错误。这是由于访问不存在的 Form.Handle (垃圾指针)引起的。该错误以一种令我意想不到的方式暴露出来 - 访问 Forms Handle 导致调整大小和重新绘制。

我希望通过垃圾指针访问Form.Handle只会返回一些垃圾THandle。期望 Handle 在表单创建时创建一次,并保持不变,直到表单被销毁。

问题

为什么会这样,TForm.Handle 不是在表单创建时初始化并通过访问的字段

property Handle: Integer read FHandle;

,但是是一个 setter/getter

property Handle: Integer read GetHandle;

在第一次访问时创建句柄甚至窗口 (CreateWnd)?

最佳答案

即使底层操作系统窗口不存在,表单对象也可以存在。在此期间,Handle 字段将为 0,这对于需要有效窗口句柄的代码没有帮助。为了确保每次需要时都能获得有效的句柄,您需要在引用 Handle 字段之前调用 HandleNeeded。作为带有 getter 的属性,该属性可以自动为您调用 HandleNeeded,从而更轻松地使用 Handle 属性。

关于delphi - 为什么 TForm.Handle 是 getter 而不是字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37614161/

相关文章:

delphi - TVirtualStringTree 的 Ctrl+End 行为

java - 我如何从 Java 中的 Delphi 读取我的 Json 字符串

delphi - 如何通过 TIdIMAP4 接收 UTF-8 编码的消息?

c++ - 仅使用句柄读取/写入文件

Delphi 7 - 如何使用输入框

delphi - 创建数据库感知组件 - TFieldDataLink.Edit 导致字段重新加载

delphi - 获取文件大小 > 然后获取总大小?

c# - PictureBox.Handle Intptr 到图像或位图

vcl - C++ 生成器 XE2,TXMLDocument 'DTD is prohibited'

sockets - Haskell句柄的非阻塞关闭