古いプロジェクトをリファクタリングしています。古いプログラマーが 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()
コントロールと親が機能しない場合は、スクリーン ショットを参照してください。