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;
3条答案
按热度按时间w7t8yxp51#
要创建不可见的MDI子窗体,您可以将它们的
Visible
属性设置为False
,此外,您还必须禁用强制显示它们的VCL行为。这由TCustomForm
的FormStyle
属性设置程序执行,该属性设置程序将MDI子窗体的Visible
设置为True
。如果在对象检查器中设置了
FormStyle
,则在创建表单时就已经调用了属性设置器,并且表单不会立即显示,而是在构造完成后才会显示。这允许您通过重写AfterConstruction()
方法来重置请求以显示表单,如下所示:这将创建一个不可见的MDI子窗体。
要测试这一点,您可以在IDE中创建一个新的MDI应用程序,覆盖如上所示的子窗体类中的方法,并模拟一个长时间的初始化:
如果没有被重写的
AfterConstruction()
方法,它将每隔半秒创建并显示一个MDI子级。使用被覆盖的方法,它将在忙碌的5秒后显示它们,这将使您有机会显示您的闪屏。重要信息:
使用
LockWindowUpdate()
减少闪烁或抑制任何屏幕输出都是错误的、错误的、错误的。Don't do it,阅读关于该主题的Raymond Chen articles系列以了解为什么会这样。vdzxcuhz2#
我也遇到过类似的问题:摇摇欲坠的MDI Childs。我使用了来自本技巧的覆盖AfterConstruction和WM_SETREDRAW消息的组合:Controlling the placement of fsMDIChild windows in Delphi
一切都运转得很好。
ghg1uchk3#
试试这个代码,它对我很管用