如何像 Office 一样在 Delphi 中编写 "child" 应用程序?

How to write a "child" application in Delphi like Office does?

Office 2016 的行为类似于 MDI 应用程序,尽管它不是:如果您在 Taskmgr.exe 中打开许多文件,则有一个 EXCEL.EXE 进程 运行(选项卡“详细信息”) :

但是“进程”选项卡中有多个条目(实际上列出 windows):

当我打开第一个文件时 Excel 开始很慢。但是当我打开第二个和第三个文件时 Excel 比第一个快。

如何在 Delphi 程序中执行此操作?

在 Delphi 中,您编写一个应用程序。它将有几个辅助windows。主要 window 和次要 windows 应具有 MDI 样式。

当应用程序启动时,它首先查看自己的副本是否已经 运行。如果没有,它就继续;如果以前的副本是 运行,它会向它发送应该打开的文档(文件名),然后退出。之前的 运行 应用程序将在新的辅助 window.

中打开传递的文档

这是整体的做法。如果有什么你不知道该怎么做,请为每个主题打开单独的问题。

请阅读help pages, take the SO tour, read How to Ask, as well as this question checklist

Windows' 任务管理器 对实际发生的事情使用了不必要的误导性术语:

  • 选项卡“进程”实际上列出了 windows 类别“应用程序”,并且成功列出多个 windows一个过程或没有。在旧版本的 Windows 中,任务管理器 以这种方式列出了 windows,已经有了可疑的选项卡标题“应用程序",但没有将多个 windows 分组和关联到一个进程:

  • “详细信息”选项卡列出了 运行 的实际 进程 ,不受它们拥有或显示的 windows 数量的限制。在以前的版本中,此选项卡的标题为“进程”:

我们有什么情况? 一个进程显示多个windows。这可以像很久以前一样轻松完成:您只需确保只有 运行ning 一个处理多个文档的实例。甚至不需要成为真正的 MDI。

最重要的是,任务管理器 还可以对多个 windows 进行分组。 Excel 是如何做到这一点的?查看您的任务栏:每个文档都有一个单独的按钮,而不仅仅是Excel本身。在您的 Delphi 程序中,您必须确保 each window 也必须出现在 taskbarHow to correctly have modeless form appear in taskbar 连同它的答案已经评估了许多这样做的方法。