Delphi-隐藏MDI子窗体创建

Delphi-隐藏MDI子窗体创建,delphi,forms,mdi,Delphi,Forms,Mdi,我的应用程序有许多mdi表单,它们是在用户成功登录后创建的。如何才能最好地隐藏此创建过程?它看起来很愚蠢,而且在创建新表单后绘制mdi表单时需要更长的时间,等等 到目前为止,我使用了LockWindowUpdate,它并没有隐藏所有内容,但我想使用一个启动屏幕来显示创建进度,但我不能使用LockWindowUpdate 致意 Janne要创建不可见的MDI子窗体,请将其Visible属性设置为False,此外,还必须在创建过程中禁用强制显示它们的VCL行为。这是通过TCustomForm的For

我的应用程序有许多mdi表单,它们是在用户成功登录后创建的。如何才能最好地隐藏此创建过程?它看起来很愚蠢,而且在创建新表单后绘制mdi表单时需要更长的时间,等等

到目前为止,我使用了LockWindowUpdate,它并没有隐藏所有内容,但我想使用一个启动屏幕来显示创建进度,但我不能使用LockWindowUpdate

致意
Janne

要创建不可见的MDI子窗体,请将其
Visible
属性设置为
False
,此外,还必须在创建过程中禁用强制显示它们的VCL行为。这是通过
TCustomForm
FormStyle
属性设置程序实现的,该设置程序将MDI子表单的
Visible
设置为
True

如果在对象检查器中设置了
FormStyle
,则在表单创建过程中将调用属性设置器,并且表单不会立即显示,而仅在构建完成后显示。这允许您通过覆盖
AfterConstruction()
方法重置显示表单的请求,如下所示:

procedure TMDIChild.AfterConstruction;
begin
  Exclude(FFormState, fsVisible);
  inherited;
end;
这将创建一个不可见的MDI子窗体

要测试这一点,您可以在IDE中创建一个新的MDI应用程序,覆盖子窗体类中的方法,如上图所示,并模拟长时间初始化:

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;
如果没有重写的
AfterConstruction()
方法,它将每半秒创建并显示一个MDI子级。使用Overrided方法,它将在5秒钟的繁忙时间后显示所有这些内容,这将使您有机会显示初始屏幕

重要提示:


用于减少闪烁或抑制任何屏幕输出错误、错误、错误,阅读有关该主题的系列文章,了解原因。

我对闪烁的MDI儿童也有类似的问题。我结合使用了过卷后构建WM_SETREDRAW这篇技巧中的信息:


一切都很好。

试试这段代码,它适合我

 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;

+这是一种非常整洁的、德尔福独有的方法。我通常不得不求助于WinAPI(ShowWindow)来实现这一点。太棒了!这正是我想要的,通过Raymond Chen的提示,我可以禁用visible:=true循环的重画。非常感谢:)不要在启动时创建它们。在需要时创建它们。
 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;