帮助文件说“在组件创建或流式传输期间不要引用Handle属性”.但它并没有说明原因.它说,当您第一次尝试访问Handle属性时,它将调用HandleNeeded以确保存在有效句柄.
所以我有两个问题. 1:在组件创建期间不应引用Handle属性的原因是什么? 2.如果控件的整个点是要包装需要初始化HWND的渲染表面,那么何时可以安全地执行(理想情况下)应该在创建/流式传输期间进行的初始化?
解决方法 在它的核心,它是一个表现的东西.由于在流式传输过程中可能会发生其他可能发生的“坏”副作用.事情处于“中期建设”状态,通常预计会出现这种情况.当您引用“Handle”属性时,这将启动句柄创建过程.这是因为读取Handle实际上调用了GetHandle.在流式传输过程中这么做太快,你可能最终会得到更慢的流媒体性能,更糟糕的是,部分配置的“句柄”.
如果需要在属性设置器中正确引用句柄,则应通过检查HandleAllocated来检查是否已创建句柄,然后才引用它.如果你需要对句柄进行一些标志更改,比如调用SetwindowLong()或其他东西,那么你应该在组件实例中“缓存”该状态,然后覆盖CreateWnd并在那时应用这些设置.另一种选择是在流式传输时推迟所有句柄访问(如果在ComponentState中为csloading),直到调用Loaded虚方法.
最后,您需要了解可能需要重新创建句柄的情况.如果周围的表单或父组件的句柄经过重新创建过程,则会发生这种情况.直到更新的Windows版本,更改某些窗口标志的唯一方法是销毁句柄并在CreateWindowEx()调用中使用新标志重新创建.有许多组件仍然可以做到这一点.通过检查(控制状态中的csRecreating),您知道是否处于重新创建状态.
因此,要直接回答您的问题,最好的地方是覆盖CreateWnd并在那里完成您的工作.只有在创建句柄时才会调用CreateWnd.正确设计的组件在显示之前应该只对CreateWnd进行一次调用.
总结以上是内存溢出为你收集整理的delphi – 为什么不在组件创建或流式传输期间使用句柄?全部内容,希望文章能够帮你解决delphi – 为什么不在组件创建或流式传输期间使用句柄?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)