我正在开发一个MDI风格的软件,其中有一部分MDI子窗口(由于程序的需要,只能做成MDI子窗口)需要隐藏起来执行任务,在需要的时候才显示出来。为了达到此目的,我覆盖了Create构造函数。如下
TMdiChildForm.Create(AOwner:TComponent);
begin
  Inherited;
  ShowWindow(Handle, SW_Hide);
end;当时出现了一个问题,当我同时打开十多个MDI子窗口时,这些窗口全部会在界面上一闪而过,造成界面很难看。如何解决这个问题?

解决方案 »

  1.   

    可以使用Frame控件避免这个问题,我以前也遇见到
    先创建后隐藏再显示是可以提高显示的速度但效果并无使用Frame控件替代MDI窗体效果好,可以试验一下
    我的Email:[email protected]可以探讨探讨
      

  2.   


    LockWindowUpdate(主窗体.Handle);
    //显示子窗体
    LockWindowUpdate(0);—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  3.   

    如上解决也可以,,
    不过在窗体元素多的话也不太理想,这本身是delphi Mdi的问题。
      

  4.   

    to  lxpbuaa(桂枝香在故国晚秋) :
    怎么还是一样的?
      

  5.   

    LockWindowUpdate(Handle);
      if Form1 =nil then
      Form1 :=TForm1.Create(self);
      Form1.show;
      LockWindowUpdate(0);
      

  6.   

    procedure TMainForm.newBtnClick(Sender: TObject);
    var
      ChildFrm: TChildFrm;
    begin
      LockWindowUpdate(Handle);
      try
        ChildFrm := TChildFrm.Create(Self);
        //做你的事情。如执行函数,显示向导等...
      finally
        LockWindowUpdate(0);
      end;
    end;
      

  7.   

    yjs_lh(长风浪子) :我真是这样做的,procedure TMainForm.newBtnClick(Sender: TObject);
    var
      ChildFrm: TChildFrm;
    begin
      LockWindowUpdate(Handle);
      try
        ChildFrm := TChildFrm.Create(Self);
        //可能使这里要执行的内容太多了,并且每个ChildForm要初始化的内容也多
        //总之,还是闪烁,我想这不是根本的解决方法,
      finally
        LockWindowUpdate(0);
      end;
    end;
      

  8.   

    我的语句如下,不相关的语句是其他用途,大家不必理会:LockWindowUpdate(Handle);
      try
        CloseLayout;    cdsTemp:=TClientDataset.Create(nil);
        try
          cdsTemp.SetProvider(dmDatabase.dspWorkSpace);      //打开窗口
          sSql:='select layoutdetail.moduleid as moduleid,modulelist.formclass as formclass,'+
                'layoutdetail.modulename as modulename from layoutdetail,modulelist where '+
                'layoutdetail.modulename=modulelist.modulename';
          cdsTemp.CommandText:=sSql;
          cdsTemp.Open;
          for iCount:=1 to cdsTemp.RecordCount do
          begin
            cdsTemp.RecNo:=iCount;        sModuleID:=cdsTemp.FieldByName('moduleid').AsString;
            sModuleName:=cdsTemp.FieldByName('modulename').AsString;
            sFormClass:=cdsTemp.FieldByName('formclass').AsString;        pClass:=TMDIChildClass(GetClass(sFormClass));
            if pClass=nil then Continue;
            pClass.Create(Self,sModuleName+'/'+sModuleID);//这里创建MDIChild窗口
          end;      //建立页面
          cdsTemp.Close;
          cdsTemp.SetProvider(dmDatabase.dspWorkSpace);
          sSql:='select * from layoutpage';
          cdsTemp.CommandText:=sSql;
          cdsTemp.Open;
          for iCount:=1 to cdsTemp.RecordCount do
          begin
            cdsTemp.RecNo:=iCount;        TabSheet:=TTabSheet.Create(pgcPage);
            TabSheet.Caption:=cdsTemp.FieldByName('pagename').AsString;
            TabSheet.Hint:=cdsTemp.FieldByName('pageid').AsString;
            TabSheet.PageControl:=pgcPage;
          end;
        finally
          cdsTemp.Free;
        end;    sCurrentPage:=ReadWorkSpaceParameter('CurrentPage');
        if sCurrentPage='' then exit;
        TabSheet:=nil;
        for iCount:=0 to pgcPage.PageCount-1 do
        begin
          if pgcPage.Pages[iCount].Hint=sCurrentPage then
          begin
            TabSheet:=pgcPage.Pages[iCount];
            Break;
          end;
        end;
        if Assigned(TabSheet) then pgcPage.ActivePage:=TabSheet;
      finally
        LockWindowUpdate(0);
        FIgnoreChildChange:=bOldFlag;
      end;
      

  9.   

    关键语句:
    pClass:=TMDIChildClass(GetClass(sFormClass));
    if pClass=nil then Continue;
    pClass.Create(Self,sModuleName+'/'+sModuleID);//这里创建MDIChild窗口其中
    TMDIChildType = Class(TForm);//定义了一个所有MDIChild的祖先窗口,我要打开的窗口皆是他的子孙类,我重新定义了他的构造函数,如下:
    Constructor Create(AOwner:TComponent;sParam:string='');reintroduce;virtual;TMDIChildClass = Class of TMDIChildType
      

  10.   

    在MDIChild的构造函数中进行处理:
    Constructor Create(AOnwer:TComponent);
    begin
      Inherited;
      Perform(WM_SETREDRAW, 0, 0);//
      ......
    end;那么,在需要显示的时候用如下方法:
    ShowWindow(Child.Handle, SW_Show);