【发布时间】:2016-10-03 12:10:29
【问题描述】:
我最近在调试一个复杂的错误。这是由访问不存在的Form.Handle(垃圾指针)引起的。这个错误以一种让我意想不到的方式暴露出来——访问表单Handle 导致调整大小和重绘。
我希望通过垃圾指针访问Form.Handle 只会返回一些垃圾THandle。期望 Handle 在表单创建时创建一次,并且在表单被销毁之前保持不变。
问题
为什么会这样,TForm.Handle 不是在创建表单时被初始化并通过以下方式访问的字段
property Handle: Integer read FHandle;
,但是是一个吸气剂
property Handle: Integer read GetHandle;
在首次访问时创建句柄甚至窗口 (CreateWnd)?
【问题讨论】:
-
见Delphi XE2, vcl styles recreating window handle 和PostMessage returns “invalid window handle” in thread。简而言之,windows在某些情况下需要重新创建句柄。
-
了解 VCL 窗口娱乐
-
因为更改窗口的某些属性需要销毁并重新创建它(请参阅
RecreateWnd并计算在表单单元中调用它的次数)。 complicated bug 是由于您没有正确理解 Form.Handle 引起的,而不是 TForm 如何使用它的句柄的问题。 :-) -
这个问题似乎将属性的结构与窗口 [re]creation 关联/混合。这就是为什么您会在其中一个主题上获得 cmet,而在另一个主题上获得答案。
-
不是错误,而是严重的误解。你的假设是完全无效的。见stackoverflow.com/questions/21011780和stackoverflow.com/questions/582903