TFrame是一个代码和UI复用、模块划分的好东西。尤其在编写Matreo风格应用的时候,更是离不开它。但TFrame也有不尽如人意的地方。比如:它在软件运行时即加载,所以无法像Form的Create和Destroy那样在UI创建的时候才动态创建和销毁自定义对象;默认情况下也不存在OnShow和OnHide函数,这样带来诸多不便。
笔者以前都是通过继承一个TFrame类,在自定义类中定义两个虚函数的方式来实现这个功能,但缺点是必须在调用Tframe和隐藏它的时候手工触发,有些麻烦。下面的方法使用了消息机制来实现OnShow和OnHide功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
uses Forms, Dialogs, Classes, Controls, StdCtrls, Windows, Messages; type MaFrame = class(TFrame) private _OnShow : TNotifyEvent; _OnHide : TNotifyEvent; procedure _SetOnShow(ponshow: TNotifyEvent); procedure _SetOnHide(ponhide: TNotifyEvent); procedure FrameOnShowHide(var M: TMessage); message CM_SHOWINGCHANGED; published property OnShow : TNotifyEvent write _SetOnShow; property OnHide : TNotifyEvent write _SetOnHide; end; implementation procedure MaFrame._SetOnShow(ponshow: TNotifyEvent); begin _OnShow := ponshow; end; procedure MaFrame._SetOnHide(ponhide: TNotifyEvent); begin _OnHide := ponhide; end; procedure MaFrame.FrameOnShowHide(var M: TMessage); begin inherited; if Showing then // onShow if Assigned( _OnShow ) then _OnShow( Self ) else // onHide if Assigned( _OnHide ) then _OnHide( Self ); end; |