Delphi - 隐藏的MDI子表单创建

时间:2010-04-21 12:33:47

标签: delphi forms mdi

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

到目前为止,我已经使用了LockWindowUpdate,它并没有隐藏所有内容,但我想使用启动画面来显示创建进度,但我不能使用LockWindowUpdate。

最诚挚的问候   的Janne

3 个答案:

答案 0 :(得分:8)

要创建不可见的MDI子窗体,请将其Visible属性设置为False,此外,您必须禁用VCL在创建过程中强制显示它们的行为。 FormStyle TCustomForm的{​​{1}}属性设置工具会将此问题发生,它会为MDI子表单设置VisibleTrue

如果在对象检查器中设置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子节点。使用重写方法,它将在繁忙的5秒后显示所有内容,这将使您有机会显示启动画面。

重要:

使用LockWindowUpdate()减少闪烁或抑制任何屏幕输出是错误的,错误的,错误的。 Don't do it,阅读有关该主题的Raymond Chen articles系列,了解其原因。

答案 1 :(得分:0)

我有一个与闪烁的MDI孩子类似的问题。我使用了来自此提示的重写 AfterConstruction WM_SETREDRAW 消息的组合: 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;

一切正常。

答案 2 :(得分:0)

试试这段代码,这对我有用

 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;