【发布时间】:2011-01-10 21:01:10
【问题描述】:
我目前有一个使用 Delphi 7 构建的 SDI 应用程序,我希望最终用户在运行时选择 SDI 和 MDI 之间的接口类型。我的问题是如何在运行时更改 SDI 和 MDI 之间的应用程序行为?
目前我知道有几个使用 delphi 构建的应用程序允许这样做:EMS SQL Manager 和 TOAD。
提前致谢。
【问题讨论】:
我目前有一个使用 Delphi 7 构建的 SDI 应用程序,我希望最终用户在运行时选择 SDI 和 MDI 之间的接口类型。我的问题是如何在运行时更改 SDI 和 MDI 之间的应用程序行为?
目前我知道有几个使用 delphi 构建的应用程序允许这样做:EMS SQL Manager 和 TOAD。
提前致谢。
【问题讨论】:
我会将我当前的窗口转换为框架,并将这些带有 align=alClient 的框架按照配置放入 mdi 子窗口或普通窗口。
但请注意:我实际上从未这样做过,因此可能存在我不知道的问题。
【讨论】:
在运行时将 TForm.FormStyle 设置为 fsNormal 或 fsMDIChild,具体取决于您想要 SDI 还是 MDI。
【讨论】:
下载 Jedi JVCL 并安装它并查看 JvDocking 的“代码对接”演示。他们正是这样做的。
他们的意思是你实际上并没有使用 FormStyle=fsMDIChild 除非你想要很多问题。 MDI 在您需要时通过停靠在代码中来“模拟”。
不要将窗口转换为框架。这是一个糟糕的解决方案。
对于没有 MDI 问题的类似 MDI 的环境,请使用对接解决方案(支持对接的商业或开源组件)。我使用 JEDI JVCL 中包含的 JvDocking,它是免费和开源的。
您可以在“停靠”和“未停靠”(浮动)模式下使用表单,这为您提供了停靠的 IDE 外观(VIsual Studio 和 RAD Studio)以及未停靠的 IDE 外观(RAD Studio 在未停靠或经典的 delphi 7)。
【讨论】:
与@WarrenP 的解决方案一样,我强烈推荐基于对接的解决方案。应该说不需要使用 Jedi VCL 来实现这一点。例如,here's 是我制作的一个非常简单的(全原生 vcl)组件,它允许您简单地将尽可能多的实例放到表单中并设置它们的对齐方式以启用停靠(和选项卡式停靠)在那些地区。
MDI 本身就是一个等待某个地方发生的意外。有一些解决方案可以在不使用 MDI 本身的情况下实现“MDI 外观”,但我还没有遇到过我认为“整洁”的解决方案(可能是因为缺乏外观)。
最终,您可能应该质疑将 MDI 作为一种选择是否明智。对接(有或没有脱离的能力,特别是当标签对接时是用户确定的选择)感觉更现代,而(正常完成)可能比MDI更灵活,直观。
只值我的 2 便士。
【讨论】: