[英]Delphi - Hidden MDI child form creation
我的应用程序有许多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子AfterConstruction()
。 使用重写方法,它将在繁忙的5秒后显示所有内容,这将使您有机会显示启动画面。
重要:
使用LockWindowUpdate()
来减少闪烁或抑制任何屏幕输出是错误的,错误的,错误的。 不要这样做 ,阅读关于这个主题的Raymond Chen系列文章 ,了解为什么会如此。
尝试这个代码,它对我有用
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;
我有一个与闪烁的MDI孩子类似的问题。 我用overrinding AfterConstruction和WM_SETREDRAW消息的组合从该尖端: 控制fsMDIChild窗口在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;
一切正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.