为什么TForm.Handle是一个吸气剂而不是一个领域?

时间:2016-06-03 12:15:07

标签: delphi handle vcl tform

我最近正在调试一个复杂的bug。这是由访问不存在的Form.Handle(带状指针)引起的。该错误以相当意外的方式向我揭示 - 访问表单Handle导致调整大小和重新绘制。

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

问题

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

访问
property Handle: Integer read FHandle;

,但是是一个吸气剂

property Handle: Integer read GetHandle;

在首次访问时创建Handle甚至是Window(CreateWnd)?

1 个答案:

答案 0 :(得分:9)

即使底层操作系统窗口不存在,表单对象也可以存在。在这些时间内,HandleNeeded字段将为0,这对需要有效窗口句柄的代码没有帮助。为确保您每次需要时都能获得有效的处理,您需要在引用Handle字段之前致电HandleNeeded。作为拥有吸气剂的酒店,酒店可以自动为您致电Handle,方便您使用{{1}}酒店。