如何在Borland C++ Builder中创建模态和非模态窗体

3
我有一个任务是增强一个已经存在的Borland C++编写的工具,我对编程和C++ Builder都很陌生。任务是将弹出消息框集成到主窗体中,我成功地通过向项目添加新窗体并在消息框位置调用它来完成了这个任务。我将我的新窗体设为模态,以便控制被阻止,直到用户选择选项。
现在,我已经向项目添加了另一个名为“图形”的窗体来显示一个图表,并且我希望当用户在新窗体中单击按钮时,控制权转移到该图形窗体。
有没有办法使两个子窗体非模态,并仅阻止父窗体(模态)?简而言之,我想访问我添加到项目中的两个新窗体,并且在这两个窗体中进行所有选择之前,我不想访问我的主窗体。请帮忙!

有没有办法在Borland C++ Builder中将子窗体设置为非模态,并仅阻止主窗体(模态)? - Dolly
2个回答

4

不要使用ShowModal(),你可以将父窗体的Enabled属性设置为false,使用Show()同时展示两个窗体,当两个窗体都关闭后,再将父窗体的Enabled属性设置回true。


但这不会阻止父窗体运行,对吧?我们如何使父窗体等待而不显示对话框? - Gurucharan Balakuntla Maheshku
1
父窗体仍将处理消息(定时器、绘图等),但用户在其被禁用时将无法与之交互。此外,如果您使用的是较旧版本的C++Builder,则可能需要覆盖次要窗体的CreateParams()方法,以将父窗体指定为父HWND(从Win32 API的角度而言,而不是VCL的角度),以便这些窗口不能消失在父窗体的窗口后面(默认情况下,使用TApplication窗口作为父HWND,这允许TForm窗口相对于彼此更改z顺序)... - Remy Lebeau
1
在更新的版本中,TFormTApplication 现在有新的 PopupModePopupParent 属性可用于更好地控制这个问题。也就是说,您可以将第二个窗体的 PopupParent 属性设置为父窗体,然后它们将永远无法到达其后面。 - Remy Lebeau
谢谢关于PopupParent的信息,我一直在处理窗口显示在它们本应该在前面的其他窗口后面的问题上(特别是当后面的窗口是模态的时候,而前面的窗口因为被后面的窗口锁住而无法移动时,情况变得更糟!) - M.M

0
你可以将不想在create期间自动运行的函数从OnCreate()方法中移出。你可以将它们移动到例如OnClick()中。我曾经遇到过类似的情况,其中一个Show()方法在程序create期间运行。我实现了OnActivate()方法,并从那里调用了Show()方法,而不是从OnCreate()中调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接