我一直在重构一个旧项目。我发现,当旧的程序员尝试使用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();
}