Delphi-隐藏的MDI子窗体创建

vngu2lb8  于 2022-10-16  发布在  其他
关注(0)|答案(3)|浏览(235)

我的应用程序有许多许多MDI表单,它们是在用户成功登录后创建的。我怎样才能最好地隐藏这个创建过程?它看起来很愚蠢,而且在创建新表单后绘制MDI表单需要更长的时间,等等。
到目前为止,我已经使用了LockWindowUpdate,它不会隐藏所有的东西,但我想使用一个闪屏来显示创建进度,但LockWindowUpdate不能。
向珍妮致以最良好的问候

w7t8yxp5

w7t8yxp51#

要创建不可见的MDI子窗体,您可以将它们的Visible属性设置为False,此外,您还必须禁用强制显示它们的VCL行为。这由TCustomFormFormStyle属性设置程序执行,该属性设置程序将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子级。使用被覆盖的方法,它将在忙碌的5秒后显示它们,这将使您有机会显示您的闪屏。

重要信息:

使用LockWindowUpdate()减少闪烁或抑制任何屏幕输出都是错误的、错误的、错误的。Don't do it,阅读关于该主题的Raymond Chen articles系列以了解为什么会这样。

vdzxcuhz

vdzxcuhz2#

我也遇到过类似的问题:摇摇欲坠的MDI Childs。我使用了来自本技巧的覆盖AfterConstructionWM_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;

一切都运转得很好。

ghg1uchk

ghg1uchk3#

试试这个代码,它对我很管用

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;

相关问题