Delphi - Hidden MDI child form creation

后端 未结 3 1256
无人及你
无人及你 2021-01-05 22:42

My application has many many mdi forms and they are created after successfull user login. How can I best hide this creation process? It looks stupid and it takes longer time

相关标签:
3条回答
  • 2021-01-05 23:14

    To create MDI child forms invisible you set their Visible property to False, and in addition you have to disable the VCL behaviour of force-showing them during creation. This happens by the FormStyle property setter of TCustomForm, which sets Visible to True for MDI child forms.

    If you set the FormStyle in the object inspector, then the property setter will be called during form creation already, and the form will not be shown immediately, but only after the construction is complete. This allows you to reset the request to show the form, by overriding the AfterConstruction() method like so:

    procedure TMDIChild.AfterConstruction;
    begin
      Exclude(FFormState, fsVisible);
      inherited;
    end;
    

    This will create an invisible MDI child form.

    To test this you can create a new MDI application in the IDE, override the method in the child form class like shown above, and simulate a long initialization:

    procedure TMainForm.FileNew1Execute(Sender: TObject);
    var
      i: integer;
    begin
      for i := 1 to 10 do begin
        CreateMDIChild('NONAME' + IntToStr(MDIChildCount + 1));
        Update;
        Sleep(500);
      end;
      for i := 0 to MDIChildCount - 1 do
        MDIChildren[i].Visible := True;
    end;
    

    Without the overridden AfterConstruction() method it will create and show a MDI child every half second. With the overridden method it will show them all after a busy period of 5 seconds, which will give you the chance to show your splash screen instead.

    Important:

    Using LockWindowUpdate() to reduce flicker or suppress any screen output is wrong, wrong, wrong. Don't do it, read the series of Raymond Chen articles on the topic to understand why that is so.

    0 讨论(0)
  • 2021-01-05 23:21

    I had a similar problem with flickering MDI childs. I used combination of overrinding AfterConstruction and WM_SETREDRAW message from this tip: Controlling the placement of fsMDIChild windows in Delphi

    SendMessage(Application.MainForm.ClientHandle, WM_SETREDRAW, False, 0);
    try
      Child := TChildForm.Create(Self);
      Child.Left := ...;
      Child.Top := ...;
      Child.Show;
    finally
      SendMessage(Application.MainForm.ClientHandle, WM_SETREDRAW, True, 0);
      InvalidateRect(Application.MainForm.ClientHandle, nil, True);
    end;
    

    And everything works fine.

    0 讨论(0)
  • 2021-01-05 23:27

    try this code, it's work for me

     try
      SendMessage(Application.MainForm.ClientHandle,WM_SETREDRAW,0,0);
      FormChild:=TBaseChildForm.Create(application);
      FormChild.Caption:='Form '+IntToStr(n);
      FormChild.Show;
     finally
      SendMessage(Application.MainForm.ClientHandle,WM_SETREDRAW,1,0);
      RedrawWindow(Application.MainForm.ClientHandle, nil, 0, RDW_FRAME or RDW_INVALIDATE or   RDW_ALLCHILDREN or RDW_NOINTERNALPAINT);
     end;
    
    0 讨论(0)
提交回复
热议问题