无法在模态对话框打开时关注Firemonkey应用程序,除非单击模态对话框本身

时间:2015-10-07 18:18:30

标签: c++ delphi modal-dialog firemonkey c++builder-xe8

我有一个应用程序,用户在登录时会通过模态对话框提示他们必须选择他们希望使用的工具。在此阶段,应用程序如下所示:

enter image description here

通过调用此方法显示模态对话框:

bool __fastcall ShowFacChoiceForm()
{
    TFacChoiceForm *Form = new TFacChoiceForm( Application );

    bool Result = ( Form->ShowModal() == mrOk );

    delete Form;

    return Result;
}

在这种情况下,TFacChoiceForm继承自TForm,因此ShowFacChoiceForm()函数正在调用标准TForm.ShowModal方法documented here.

我遇到的问题是,如果我的应用程序失去焦点,除非单击模式对话框本身,否则它不能再次成为活动窗口。为了更好地说明这一点,我将介绍以下场景:

让我们说它周五下午,我决定稍稍阅读并阅读一些网络漫画。打开我的应用程序后,我打开另一个窗口,就像这样:

enter image description here

然后,我的老板不知从哪里进行性能评估,我试图通过点击主表单上的某个位置重新调整我的应用程序。例如,在下一张图像中此红色X的位置。

enter image description here

在上图中,我点击了红色X的位置。现在,包含网络漫画的表单和我的应用程序都处于非活动状态。因此,我的应用程序不会出现在屏幕的前面。

但是,如果我能够点击模态对话框上的某个位置,就像下图中的红色X ...

enter image description here

...然后我的应用程序就像人们期望的那样来到前面。

enter image description here

要解决这个问题,我已经考虑过使用Windows API中的SetForegroundWindow之类的内容,但是我找不到触发事件的方法,因为我的主窗体不会触发事件打开模态对话框。

我的问题是,如果用户点击我的应用程序的任何位置,它是如何被带到前面的?我可以在表单中编辑一个属性来执行此操作吗?

1 个答案:

答案 0 :(得分:0)

如果在模态对话框的ondeactivate中将modalresult设置为mrcancel,则主窗体在单击时将获得焦点。然后,您可以检查用户是否登录了主窗体的mousedown事件,如果没有,则再次显示模式对话框。

相关问题