我可以从模态形式激活现有的非模态窗口吗?

时间:2010-10-05 08:02:06

标签: delphi forms modal-dialog

我可以从模态形式激活现有的非模态窗口吗?我使用Delphi。

在我们的应用程序中,用户可以在非模态窗口中编辑报告。这通常是通过从主窗口中选择“编辑报告”来完成的。但是也有可能从模态打印对话框打开报告。这导致以下问题:用户从主窗口打开报告以进行编辑。他做了一些改变,但没有保存(他最小化它或什么)。然后,从打印对话框中,他再次打开相同的报告,忘记它已经打开或者认为它是旧窗口,并进行一些更改并保存。现在我们遇到了问题。这些更改将丢失(当他记住并打开旧的编辑窗口并保存他的更改时),或者旧的更改将丢失(当他记住旧窗口并关闭它而不保存时)

我想要的是当用户从打印对话框启动编辑时打开旧的编辑窗口。我已经有找到旧编辑窗口的代码,但是如何激活它呢?

4 个答案:

答案 0 :(得分:1)

假设您的表单变量名为ReportForm:

通常的方法是再次调用ReportForm.Show方法。或者将ReportForm.WindowState设置为wsNormal以用于最小化窗口。或者拨打ShowWindow(ReportForm.Handle, SW_RESTORE);,将最小化的窗口放回原来的形状。

您也可以将ReportForm强制到前面,但由于它是非模态的,因此它不会响应任何内容,使您的应用程序表现得像挂起一样。为此,请使用:

  ReportForm.FormStyle := fsStayOnTop;
  ReportForm.Show;
  ReportForm.FormStyle := fsNormal;

它可以工作,将ReportForm带回前台。但是,您可能希望保留旧的FormStyle值。是的,这有点像黑客。此外,表单不会响应鼠标或键盘只是因为模态形式仍然需要在后台注意! (它迟早会再次回到前台。)
模态表单将要求Windows消息中的所有注意。这个技巧只会暂时隐藏模态形式 顺便说一句,找到该表单的最简单方法是在项目中使用全局变量并将报表形式分配给该变量。然后,当您需要再次显示时,可以致电if Assigned(YourForm) then YourForm.Show;。 (另外两条线,如果需要的话。)所以,最好的解决方案是ShowWindow(ReportForm.Handle, SW_RESTORE);它应该有效,我想......它将会落后模态形式,应该是它。

答案 1 :(得分:1)

如果你正在使用D2005或更新版本,我认为你可以在'ReportForm'上使用RecreateAsPopup传递模态窗体的句柄作为参数。虽然这个documentation有点稀缺,所以请自担风险。 :)

答案 2 :(得分:1)

在研究非模态窗口时,我发现了以下似乎正是您正在寻找的信息。与使用RecreateAsPopup相比,我不知道此方法的相对优缺点。

http://blogs.teamb.com/deepakshenoy/2006/08/21/26864

答案 3 :(得分:0)

以下流程如何:

  • 在以模态模式打开报告进行打印之前,请检查相同的报告是否已打开(您已经知道了)。
  • 如果有一个打开的表单,请捕获其状态(进入字符串,对象或记录,流,等)
  • 关闭非模态表单
  • 创建一个新的模态报表,并使用捕获的状态对其进行初始化。