我一直在重构一个旧项目。我发现当旧程序员试图使用SetFocus()
TWinControls
时,他们在try / catches中用空catch块包围它们。因此吞下了例外。
如果启用了控件,程序的默认行为是设置焦点。为了做到这一点,我创建了一个函数,我可以将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()
和父级不起作用,请参见屏幕截图。
答案 0 :(得分:3)
有一个更简单的解决方案 - 在调用TWinControl::CanFocus()
之前调用TWinControl::SetFocus()
方法:
void SafeSetFocus(TWinControl *Control)
{
if (Control->CanFocus())
Control->SetFocus();
}
答案 1 :(得分:0)
感谢@KenWhite提出的问题建议(C++ Builder 2009 - How to Determine if Control's Window is Visible)
他在这个问题上的建议引出了我的答案。以下是其他人可能感兴趣的代码:
#include "winuser.h"
...
void SafeSetFocus(TWinControl *Control)
{
THandle* hWnd = (THandle *)(Control->ParentWindow);
bool parentIsVisible = IsWindowVisible(hWnd);
if(Control->Enabled && Control->Visible && parentIsVisible)
{
Control->SetFocus();
}
}
答案 2 :(得分:0)
改进James Oravec的answer。我刚刚改变了:
bool parentIsVisible = IsWindowVisible(hWnd);
为:
bool parentIsVisible = IsWindowVisible((HWND__*)hWnd);