1

我使用 Delphi Berlin VCL 模板创建了一个 SDI 应用程序。我可以通过编程 File|New 来创建其他实例,如下所示:

procedure TSDIAppForm.FileNew1Execute(Sender: TObject);
var
   LNewDoc: TSDIAppForm;
begin
   LNewDoc := TSDIAppForm.Create(Application);
   LNewDoc.Show;
end;

只有所有者表单显示在任务栏上。此外,关闭所有者表单会关闭所有实例。如何取消链接其他实例,以便它们独立运行并单独显示在任务栏上?

4

1 回答 1

2

关闭TForm分配为Application.MainForm退出应用程序的那个,这是设计使然。

如果您希望它MainForm像任何其他 SDI 窗口一样运行并且在其他 SDI 窗口仍然打开的情况下独立关闭而不退出应用程序,您将必须创建一个单独TForm的作为真实窗口MainForm,然后对用户隐藏它(设置Application.ShowMainForm为 false在启动之前Application.Run()调用),然后您可以TSDIAppForm根据需要创建对象。当最后一个TSDIAppForm对象关闭时,您可以关闭MainForm,或Application.Terminate()直接调用,退出应用程序。

要为每个任务栏按钮提供TSDIAppForm自己的任务栏按钮,您需要重写虚拟CreateParams()方法:

如何获取不是主表单的表单的任务栏按钮?

试试这个:

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TMyRealMainForm, MyRealMainForm);
  Application.CreateForm(TSDIAppForm, SDIAppForm);
  SDIAppForm.Visible := True;
  Application.ShowMainForm := False;
  Application.Run;
end.

procedure TSDIAppForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := 0;
end;

procedure TSDIAppForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TSDIAppForm.FormDestroy(Sender: TObject);
begin
  if Screen.FormCount = 2 then // only this Form and the MainForm
    Application.Terminate;
end;

procedure TSDIAppForm.FileNew1Execute(Sender: TObject);
var
  LNewDoc: TSDIAppForm;
begin
  LNewDoc := TSDIAppForm.Create(Application);
  LNewDoc.Show;
end;
于 2016-06-17T20:48:05.540 回答