2

我一直在重构一个旧项目。我发现当老程序员尝试使用时 SetFocus()TWinControls他们用空的 catch 块将它们包围在 try/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()对于控件和父级不起作用,请参见屏幕截图。

在此处输入图像描述

4

3 回答 3

3

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

void SafeSetFocus(TWinControl *Control)
{
    if (Control->CanFocus())
        Control->SetFocus();
}
于 2013-03-16T04:33:21.590 回答
0

感谢@KenWhite 提出有问题的建议(C++ Builder 2009 - 如何确定控件的窗口是否可见

他在那个问题上的建议让我找到了答案。以下是其他人可能感兴趣的代码:

#include "winuser.h"

...

void SafeSetFocus(TWinControl *Control)
{
    THandle* hWnd = (THandle *)(Control->ParentWindow);
    bool parentIsVisible = IsWindowVisible(hWnd);

    if(Control->Enabled && Control->Visible && parentIsVisible)
    {
        Control->SetFocus();
    }
}
于 2013-03-16T02:43:08.957 回答
0

改进James Oravec回答。我只是改变了:

bool parentIsVisible = IsWindowVisible(hWnd);

到:

bool parentIsVisible = IsWindowVisible((HWND__*)hWnd);
于 2018-03-22T21:49:07.393 回答