大佬教程收集整理的这篇文章主要介绍了如何在Delphi中模拟TFrame上的OnDestroy事件?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我简单地在我的框架中添加了一个构造函数和析构函数,认为这就是TForm的作用:
TframeEditCustomer = class(TFramE) ... public constructor Create(Aowner: TComponent); override; destructor Destroy; override; ... end; constructor TframeEditCustomer.Create(Aowner: TComponent) begin inherited Create(Aowner); //allocate stuff end; destructor TframeEditCustomer.Destroy; begin //cleanup stuff inherited Destroy; end;
这个问题是,当我的析构函数运行时,框架上的控件已经被破坏并且不再有效.
原因在于包含表单的析构函数,它用于触发OnDestroy事件:
destructor TCustomForm.Destroy; begin ... if OldCreateOrder then DoDestroy; //-->fires Form's OnDestroy event; while controls are still valid ... if HandleAllocated then DestroyWindowHandle; //-->destroys all controls on the form,and child frames ... inherited Destroy; //--> calls destructor of my frame ... end;
当表单的析构函数运行时,我的框架对象的析构函数被调用.问题是,为时已晚.该表单调用DestroyWindowHandle,它要求Windows销毁表单的窗口句柄.这会递归地破坏所有子窗口 – 包括我框架上的窗口.
因此,当我的框架的析构函数运行时,我尝试访问不再处于有效状态的控件.
如何在Delphi中为TFrame模拟OnDestroy事件?
也可以看看
> Simulating OnCreate and OnDestroy for a Frame?
> How to Implement the OnCreate event for a Delphi TFrame object
> Embargadero QC#1767: TFrame misses OnCreate,OnDestroy,OnShow
type TCpFrame = class(TFramE) private FOnDestroy: TNotifyEvent; procedure WMDestroy(var Msg: TWMDestroy); message WM_DESTROY; published property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy; end; procedure TCpFrame.WMDestroy(var Msg: TWMDestroy); begin if (csDestroying in ComponentStatE) and Assigned(FOnDestroy) then FOnDestroy(Self); inherited; end;
这只有在实际创建了框架的窗口句柄时才有效.没有其他好的挂钩点,所以如果你想确保它总是被调用,你需要在WMDestroy中设置一个标志,如果没有被击中则回退到在析构函数中调用它.
窗口句柄本身都在WM_NCDESTROY中被清除,WM_NCDESTROY在所有后代WM_DESTROY消息返回后被调用,因此表单及其所有childens的句柄在此时仍然有效(忽略在表单的OnDestroy中释放的任何内容) .
以上是大佬教程为你收集整理的如何在Delphi中模拟TFrame上的OnDestroy事件?全部内容,希望文章能够帮你解决如何在Delphi中模拟TFrame上的OnDestroy事件?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。