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

Why TForm.Handle is a getter instead of a field?

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

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

问题

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

访问的
property Handle: Integer read FHandle;

,不过是一个getter

property Handle: Integer read GetHandle;

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

即使基础 OS window 不存在,形式 object 也可以存在。在那些时候,Handle 字段将为 0,这对需要有效 window 句柄的代码没有帮助。为确保每次需要时都能获得有效句柄,您需要在引用 Handle 字段之前调用 HandleNeeded。作为属性和getter的组合,属性可以自动为你调用HandleNeeded,让Handle属性的使用更加方便。