为什么 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
属性的使用更加方便。
最近在调试一个复杂的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
属性的使用更加方便。