为什么不建议在运行时更改formstyle?

时间:2013-02-14 09:56:05

标签: forms delphi runtime

在关于TCustomForm.FormStyle的Delphi文档中添加了一条说明:“不建议在运行时更改FormStyle。”

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

用例

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

我在Adobe Photoshop,Google Chrome和Microsoft Internet Explorer中看到了此功能的示例。 (标签可以从标签栏移动,并在单独的浮动窗口中打开)

2 个答案:

答案 0 :(得分:9)

在运行时将FormStylefsNormal更改为fsMDIformfsMDIChild需要重新创建窗口句柄,而这又需要重新创建所有窗口处理表单上的所有控件。当发生这种情况时,德尔福控制之外还有很多东西:也许你正在使用一些依赖于某些Windows控件的第三方控件但是第三方控件并不知道如何保存它的状态。重新创建Window句柄时,用户将失去所有工作。

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

  • 停止使用MDI,制作所有窗户"漂浮"并以其他方式处理它们。 MDI已经过时了一段时间。
  • 只要这样做,取决于您拥有的控件类型,它可能会正常工作。如果它没有,看看出了什么问题并解决了它(例如:您可能需要自己保存一些控件并在交换后恢复它)
  • 尝试将所有东西放在框架上;当用户想要移动时,创建一个新的空非MDI / MDI表单,重新父框架,销毁旧表单。

答案 1 :(得分:7)

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

窗口重新创建基本上是可以在没有您注意的情况下发生的事情。但是有些控件在重新创建方面存在问题。例如,我过去曾使用工具栏控件来解决这个问题。更新版本的Delphi对重新创建更具弹性。