Delphi SDI应用程序 - 不处理级联/平铺水平&垂直拼贴?

时间:2009-12-08 16:14:11

标签: windows delphi delphi-2009 windows-messages

我的应用程序似乎没有在特定的Windows版本上接收或处理Cascade,Tile Horizo​​ntal / Tile Vertical的相同Windows消息。

Windows XP x32 - 不工作
Windows XP x64 - 未经测试
Windows Vista x32 - 不工作
Windows Vista x64 - 工作正常??
Windows 7 x32 - 未经测试
Windows 7 x64 - 无法正常工作

任何人都知道为什么会出现这种情况?是否有任何特定于Vista x64的内容与其他内容不同,我自己也不会这么想!

更新

更具体地说,我指的是当我打开一个或多个应用程序实例时,我按住Ctrl并从任务栏中选择这些,然后尝试Cascade / Tile。

升级到Delphi 2009之前我们的应用程序的旧版本似乎按预期工作。与此不同的是,我们现在正在使用DevExpress功能区组件。更令人沮丧的是,我们在Delphi 2009中使用了另一个版本的应用程序并使用了色带并且工作正常!

2 个答案:

答案 0 :(得分:1)

如果您正在谈论Delphi的TForm.Cascade和TForm.Tile方法,请从文档(Delphi 7,因为它很方便):

Use Cascade to arrange MDI child forms so they overlap.

Cascade works only if the form is an MDI parent form (that is, if the form’s 
FormStyle property is fsMDIForm).

如您所见,它们仅适用于MDI儿童表格;它们对非MDI子表单没有影响。这也许可以解释为什么他们没有在你测试的四个操作系统中的三个上工作。 (我怀疑Vista x64工作是某种侥幸。)

编辑:根据评论,问题与TForm.Cascade / Tile无关。

我认为Craig Young走在正确的轨道上。你有没有尝试添加

Application.ShowMainFormOnTaskbar := True;

到.DPR文件?我认为问题可能是,在早期版本的Delphi中启动的项目,然后更新到更新的版本,标志没有设置,应用程序的窗口是放在任务栏上的窗口。将其更改为主表单可能会解决问题。

答案 1 :(得分:0)

一个简单的Delphi应用程序有两个“主要”句柄。一个用于主表单,另一个用于TApplication实例。

我个人不会使用这些功能在桌面上平铺或级联应用程序(我更喜欢运行最大化的东西)。因此,我从来没有费心去挖掘这种行为。但我可以提出一些建议:

  • TApplication.WndProc方法很可能正在接收消息,但它无助于尝试调整消息。
  • 我建议您截取相关消息,然后将它们传递给主窗体的句柄。
    • TApplication.OnMessage事件是最简单的,应该足够了。
    • 如果没有,您可以尝试使用TApplication.HookMainWindow();