我最近正在调试一个复杂的bug。这是由访问不存在的Form.Handle
(带状指针)引起的。该错误以相当意外的方式向我揭示 - 访问表单Handle
导致调整大小和重新绘制。
我希望通过垃圾指针访问Form.Handle
只会返回一些垃圾THandle。期望Handle
在表单创建时创建一次并保持不变直到表单被销毁。
为什么会这样,TForm.Handle
不是在表单创建时初始化的字段,可以通过
property Handle: Integer read FHandle;
,但是是一个吸气剂
property Handle: Integer read GetHandle;
在首次访问时创建Handle甚至是Window(CreateWnd
)?
答案 0 :(得分:9)
即使底层操作系统窗口不存在,表单对象也可以存在。在这些时间内,HandleNeeded
字段将为0,这对需要有效窗口句柄的代码没有帮助。为确保您每次需要时都能获得有效的处理,您需要在引用Handle
字段之前致电HandleNeeded
。作为拥有吸气剂的酒店,酒店可以自动为您致电Handle
,方便您使用{{1}}酒店。