6

在有关TCustomForm.FormStyle的 Delphi 文档中添加了一条注释,指出:“不建议在运行时更改 FormStyle。”

我想知道为什么不建议在运行时更改表单样式。从用户界面的角度来看,这是不可取的,还是可能会出现一些技术问题?在运行时更改表单样式后可能会出现什么样的问题?

用例

我们想改进我们的 MDI 应用程序的多显示器支持。目前所有子窗口都在主窗口(MDI 父窗口)中打开。用户想要的是能够在主窗口之外打开/移动子窗口,以便子窗口将作为单独的浮动窗口打开,可以位于 Windows 桌面的任何位置。

我在 Adob​​e Photoshop、Google chrome 和 Microsoft Internet Explorer 中看到了此功能的示例。(选项卡可以从选项卡栏移动,将在单独的浮动窗口中打开)

4

2 回答 2

9

FormStyle将运行时从更改fsNormalfsMDIformfsMDIChild需要重新创建窗口句柄,而这反过来又需要为表单上的所有控件重新创建所有窗口句柄。发生这种情况时,有很多事情超出了 Delphi 的控制范围:也许您正在使用一些依赖于某些 Windows 控件的第 3 方控件,但第 3 方控件不知道如何保存它的状态。重新创建窗口句柄时,用户将失去所有工作。

幸运的是,您可以解决这个问题:

  • 停止使用 MDI,让所有窗口“浮动”并以其他方式处理它们。MDI 已经过时了一段时间。
  • 就这样做吧,这取决于您拥有的控件类型,它可能会正常工作。如果没有,看看哪里出了问题并解决它(例如:您可能需要自己保存一些控件的状态并在交换后恢复它)
  • 试着把所有东西都放在一个框架上;当用户想要移动时,创建一个新的空非 MDI/MDI 窗体,重新父框架,销毁旧窗体。
于 2013-02-14T10:08:07.967 回答
7

很可能是因为表单样式更改会导致重新创建窗口句柄。这也将强制重新创建所有子窗口的句柄。

窗口重新创建总的来说是在你没有注意到的情况下发生的事情。但是有些控件在重新创建方面存在问题。例如,我过去曾在工具栏控件上遇到过这种情况。最新版本的 Delphi 对重新创建更具弹性。

于 2013-02-14T10:03:30.303 回答