Delphi : 隐藏MDI子窗口带来的问题

Delphi : 隐藏MDI子窗口带来的问题

在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),在子窗口隐藏了后不要去取该子窗口的数据。
       
      

你可能感兴趣的:(Delphi : 隐藏MDI子窗口带来的问题)