任务栏上显示多个实例的 SDI 应用程序

SDI application with multiple instances shown on taskbar

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

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

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

关闭指定为 Application.MainFormTForm 会退出应用程序,这是设计使然。

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

要给每个 TSDIAppForm 自己的任务栏按钮,您需要覆盖虚拟 CreateParams() 方法:

How can I get taskbar buttons for forms that aren't the main form?

试试这个:

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;