在project里面用下面这句话隐藏窗体
Application.ShowMainForm:=False;但是show的时候不能正常我用的是
ShowWindow(WinHandle, SW_RESTORE);
    SetForeGroundWindow(WinHandle);可以显示窗体,但是窗体上的什么也没有,Label控件可以正常显示,但是botton,edit,panel等都显示不出来不知道是什么原因,请大虾指教,有用分大派送!其实我用hide还是可以正常工作的,这里我主要想清楚Application.ShowMainForm:=False;不能正常地原因!

解决方案 »

  1.   

    >>ShowWindow(WinHandle, SW_RESTORE);
    >>SetForeGroundWindow(WinHandle);不知道你这两句代码是写在哪里,下面是我写的测试
    program Project1;uses
      Forms,
      Windows,
      Unit1 in 'Unit1.pas' {Form1};{$R *.res}var
      bo:Boolean;
    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);  bo :=  application.MainForm.Visible;
      if (bo) then
        Application.MessageBox('visible is true','test');  application.ShowMainForm := false;  bo :=  application.MainForm.Visible;
      if (bo) then
        Application.MessageBox('visible is true','test') ;  //加上下面这两句,确实情况如LZ所讲,Label控件可以正常显示,
      //但是botton,edit,panel等都显示不出来
      ShowWindow(Application.MainForm.Handle, SW_RESTORE);
      SetForeGroundWindow(Application.MainForm.Handle);  //加上下面这一句,即可正常显示
      //Form1.Show;  bo :=  application.MainForm.Visible;
      if (bo) then
         Application.MessageBox('visible is true','test') ;  Application.Run;end.
      

  2.   


    翻翻VCL: $(DELPHI)\source\vcl\Forms.pas,即可看出大概原因
    1.创建一个TForm时,在TForm的构造函数,设置Visible := false
    参见:constructor TCustomForm.CreateNew(AOwner: TComponent; Dummy: Integer);
    2.这句代码Application.ShowMainForm := false;//
    影响到TApplication.Run函数Forms.pas的 TApplication.Run函数中有...
      if FShowMainForm then //因ShowMainForm := false;
         if FMainForm.FWindowState = wsMinimized then
              Minimize 
          else
              FMainForm.Visible := True;//所以,FMainForm.Visible 不能设置为true
    ...3.到了这里,原因就很明显,就是当主窗口Form的visible为false的原因,当其为false时,会影响就其函数函数的消息处理,及窗口状态更新等,如$(DELPHI)\souce\vcl\controls.pas中的
    procedure TWinControl.UpdateShowing;这个函数var
      ShowControl: Boolean;
      I: Integer;
    begin
      ShowControl := (FVisible or (csDesigning in ComponentState) and
        not (csNoDesignVisible in ControlStyle)) and
        not (csReadingState in ControlState);
        
      if ShowControl then// 不再更新Form上的那些子控件,如Btn,edit
      begin
        if FHandle = 0 then CreateHandle;
        if FWinControls <> nil then
          for I := 0 to FWinControls.Count - 1 do
            TWinControl(FWinControls[I]).UpdateShowing;
      end;因TButton,TEdit都是从TWinControl这个VCL类继承的,所以有影响,
    而TLabel是从TGraphicControl这个VCL类继承的,因而没有影响
      

  3.   

    看来是要改这个函数了
    procedure TWinControl.UpdateShowing;这个函数