在delphi中隐藏MDI子窗口有两种方法:
1)发消息及调用ShowWindow函数:
showwindow(childform.handle, sw_hide); // 隐藏子窗口
showwindow(childform.handle, sw_restore); // 显示子窗口
缺点:使用windows api直接隐藏子窗口,其子窗口的visible属性和其显示状态是不一至的。当子窗口不可见时,其visible属性可能仍然是true。
2)重载子窗口的visiblechanging方法:
private
procedure visiblechanging; override;//重载
procedure tchildform.visiblechanging;
begin
<使用组件属性隐藏子窗口时,需要重载此过程,并且不执行任何继承代码,否则将报错>
//inherited; 不能执行此语句!
end;
此后就可以直接设置visible属性了:
childform.visible:=false;//隐藏子窗口
childform.visible:=true; //显示子窗口
缺点:当子窗口隐藏了后,有些控件的数据没有办法取到,如 TListView, 为这个问题曾经郁闷了很久,不知道是什么原因。例如:子窗口上listview已经有了10行数据,当利用方法2)把使得子窗口不可见了后,调用childform.listview.items.count结果总是0,但是显示此子窗口后10行数据还是在此listview中。
所以使用1),在程序中不要调用visible属性。
使用2),在子窗口隐藏了后不要去取该子窗口的数据。