我一直在重构一个旧项目。我发现,当旧的程序员尝试使用SetFocus()TWinControls时,他们用空的catch块将它们包围在try / catches中。因此吞下了异常(exception)。

该程序的默认行为是在启用控件的情况下设置焦点。为此,我创建了一个函数,可以将TWinControl传递给:

void SafeSetFocus(TWinControl *Control)
{
    if(Control->Enabled && Control->Visible)
    {
        Control->SetFocus();
    }
}

这段代码适用于大多数程序,但是我发现在一个区域中仍然收到Cannot focus a disabled or invisible window的调试器异常。

我认为该问题可能与父级有关,因此我尝试了以下调整:
void SafeSetFocus(TWinControl *Control)
{
    if(Control->Enabled && Control->Visible &&
            Control->Parent->Enabled && Control->Parent->Visible)
    {
        Control->SetFocus();
    }
}

此更改没有解决问题。因此,我意识到该窗口不一定是父窗口。所以我的问题可以归结为:

有没有一种方法可以确定TWinControl的窗口是什么,并检查它是否可见?这假设异常是正确的...否则,如果您知道问题所在,请分享您的知识:)

其他疑难解答说明,第1部分:

我试图通过以下代码确定ParentWindow的类名称:
String parentWindowClassName = ((TObject *)(Control->ParentWindow))->ClassName();
MessageDlg("parentWindowClassName: " + parentWindowClassName, mtInformation, TMsgDlgButtons() << mbOK, 0);

我运行代码的第一行给出了访问冲突...对尝试确定信息的其他方式有何想法?

其他疑难解答说明,第2部分:

仅带有控件的CanFocus()不起作用。控件和父项的CanFocus()无法正常工作,请参见屏幕截图。

最佳答案

有一个更简单的解决方案-在调用TWinControl::CanFocus()之前先调用TWinControl::SetFocus()方法:

void SafeSetFocus(TWinControl *Control)
{
    if (Control->CanFocus())
        Control->SetFocus();
}

10-08 09:47