Delphi MDI应用程序高级技巧三则(一)

http://www.netgocn.com 原创 转载请注明出处

本文介绍几个Delphi MDI应用程序的编程技巧,虽然纯属技巧,但是本文的方法在正常编程时,通常会被编译器认为是错误的或是违背编程环境缺省许可值的。不过有时为了一些特殊的用途或特殊的视觉效果,按下述的方法一试,可以在明知不可违而违之的情况下,得到很好的结果。

下述各示例均在Delphi6Windows2000下完成,对涉及的控件命名是任意的,仅为方便说明问题。

一、子窗口的隐藏

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属性

此时,首先要在需要隐藏的子窗口中重载TCustomFormVisibleChanging方法,并在其实现过程中屏蔽掉继承代码,否则编译器将在隐藏子窗口时报错。

然后就可以直接设置这个子窗口的Visible属性为FalseTrue来隐藏或显示它了。示例如下:

a) 子窗口部分

type

  TChildForm = class(TForm)

  private

    procedure VisibleChanging; override;//重载

   

  end;

procedure TChildForm.VisibleChanging;

begin

{使用组件属性隐藏子窗口时,需要重载此过程,并且不执行任何继承代码,否则将报错}

  //inherited; 不能执行此语句!

end;

b) 隐藏或显示子窗口

ChildForm.Visible:=false;//隐藏子窗口

  ChildForm.Visible:=true; //显示子窗口

说明:直接使用组件属性隐藏或显示子窗口,子窗口的Visible属性和其显示状态是一至的。笔者认为这样做要安全一些。

下载示例代码