我最近正在调试一个复杂的错误。这是由于访问不存在的 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/