1

C++ Builder XE を使用していますが、TCheckBox の「Showing」プロパティに問題があります。

TForm(A4_en_Xbox) がある( TGroupBoxAlarmsGroupBox) がある(ChannelConfigForm) がありTCheckBoxます。

フォーム上の一部のコントロールが表示されないことがあります。

ヘルプ ドキュメントによると、「コンポーネントの Visible プロパティとその親階層内のすべての親が true の場合、表示は true であることが保証されます。コントロールを含む親の 1 つに false の Visible プロパティ値がある場合、表示中の可能性があります。 true または false のいずれかです。表示は読み取り専用プロパティです。"

何が起こっているのかを調べるために、プログラムをデバッグする次の関数を書きました: (注: この関数の debugf は、デバッグ用のものをフォームに書き込む printf と同様に機能する、単に私が書いたデバッグ ステートメントです)

void ShowParentTree(TControl *Control)
{
  wchar_t Name[32];
  static int level=0;
  TWinControl *wc;

  level++;
  if (level==1)
    debugf(L"Parents of control \"%s\" (%s) :",
                       Control->Name.c_str(),
                       Control->ClassName().c_str());

  // Display what Control has as parents and if they're visible and showing
  debugf(L"level %d : %s->Visible  = %s",level,
                       Control->Name.c_str(),
                       Control->Visible?L"true":L"false");
  wc=(TWinControl *)Control;
  debugf(L"level %d : %s->Showing  = %s",level,
                       wc->Name.c_str(),
                       wc->Showing?L"true":L"false");

  if (Control->Parent)
    ShowParentTree((TControl *)Control->Parent);

  level--;
}

ChannelConfigForm を表示すると、次のようになることがあります。

Parents of control "A4_en_Xbox" (TCheckBox) :
level 1 : A4_en_Xbox->Visible  = true
level 1 : A4_en_Xbox->Showing  = false
level 2 : AlarmsGroupBox->Visible  = true
level 2 : AlarmsGroupBox->Showing  = true
level 3 : ChannelConfigForm->Visible  = true
level 3 : ChannelConfigForm->Showing  = true

これは、A4_en_Xbox->Showing プロパティが true である必要があるときに false であることを意味すると理解しています。

4

1 に答える 1

0

返されるものを確認しA4_en_Xbox->HandleAllocated()ます。 Showingfalse を返す場合HandleAllocated()は false になります。HWNDVCL は、TWinControl から派生したコンポーネントが常に常に割り当てられていることを保証しません。HWND内部で s を解放し、必要に応じて再作成することもあります。

また、コードに小さなロジック バグがあります。すべてのTControl子孫が から派生しているわけではありませんが、コードは入力が常に子孫であるTWinControlと想定しています。非コントロールのプロパティへのアクセスを回避できるように、それを確認する必要があります。再帰を完全になくすこともできます。代わりに単純なループを使用してください。TControlTWinControlShowingTWinControl

void ShowParentTree(TControl *Control)
{
    if (!Control)
        return;

    int level = 0;
    TWinControl *wc = dynamic_cast<TWinControl*>(Control);

    debugf(L"Parents of control \"%s\" (%s) :",
                         Control->Name.c_str(),
                         Control->ClassName().c_str());

    // Display what Control has as parents and if they're visible and showing
    do
    {
        level++;

        if (wc)
        {
            debugf(L"level %d : %s Visible = %s, Showing = %s, HandleAllocated = %s",
                level,
                Control->Name.c_str(),
                Control->Visible ? L"true" : L"false",
                wc->Showing ? L"true" : L"false",
                wc->HandleAllocated() ? L"true" : L"false");

        }
        else
        {
            debugf(L"level %d : %s Visible = %s",
                level,
                Control->Name.c_str(),
                Control->Visible ? L"true" : L"false");
        }

        wc = Control->Parent;
        Control = wc;
    }
    while (Control);
}
于 2012-10-31T18:10:47.217 に答える