Delphi MDI应用程序高级技巧三则(一)http://www.netgocn.com
本文介绍几个Delphi MDI应用程序的编程技巧,虽然纯属技巧,但是本文的方法在正常编程时,通常会被编译器认为是错误的或是违背编程环境缺省许可值的。不过有时为了一些特殊的用途或特殊的视觉效果,按下述的方法一试,可以在明知不可违而违之的情况下,得到很好的结果。
下述各示例均在Delphi6、Windows2000下完成,对涉及的控件命名是任意的,仅为方便说明问题。
一、子窗口的隐藏
在Delphi编程环境下,MDI子窗口在运行期间可以动态地被创建和销毁,但是不能够被隐藏,如果试图通过Visible属性或Hide方法隐藏子窗口,编译器将报出“Cannot hide an MDI Child Form.”的错误提示!
如果某个子窗口中承载了很多要保留的数据而不能销毁,但又暂时不想要它出现在屏幕上时,最好的方法就是将其隐藏,待需要时再将其显示出来则可。下面两种方法可以隐藏和显示子窗口,并避开了编译器的报错提示。
1) 使用Windows API函数ShowWindow(),示例代码如下:
ShowWindow(ChildForm.Handle, SW_HIDE); // 隐藏子窗口
ShowWindow(ChildForm.Handle, SW_RESTORE); // 显示子窗口
说明:使用Windows API直接隐藏子窗口,其子窗口的Visible属性和其显示状态是不一至的。当子窗口不可见时,其Visible属性可能仍然是True。
2) 直接设置子窗口的Visible属性
此时,首先要在需要隐藏的子窗口中重载TCustomForm的VisibleChanging方法,并在其实现过程中屏蔽掉继承代码,否则编译器将在隐藏子窗口时报错。
然后就可以直接设置这个子窗口的Visible属性为False或True来隐藏或显示它了。示例如下:
a) 子窗口部分
…
type
TChildForm = class(TForm)
private
procedure VisibleChanging; override;//重载
…
end;
…
procedure TChildForm.VisibleChanging;
begin
{使用组件属性隐藏子窗口时,需要重载此过程,并且不执行任何继承代码,否则将报错}
//inherited; 不能执行此语句!
end;
b) 隐藏或显示子窗口
ChildForm.Visible:=false;//隐藏子窗口
ChildForm.Visible:=true; //显示子窗口
说明:直接使用组件属性隐藏或显示子窗口,子窗口的Visible属性和其显示状态是一至的。笔者认为这样做要安全一些。