2

古いプロジェクトをリファクタリングしています。古いプログラマーが of を使用しようとしたときに、 SetFocus()TWinControlsの catch ブロックでそれらを try/catch で囲んでいることがわかりました。したがって、例外を飲み込みます。

プログラムのデフォルトの動作は、コントロールが有効な場合にフォーカスを設定することです。そのために、次の関数に渡すことができる関数を作成しましたTWinControl

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

このコードはほとんどのプログラムで機能しますが、1 つの領域でまだ Debugger Exception が発生することがわかりました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 に答える