4

タブシートの特定のタブですべてのコンポーネントをループする次のコードがあります。ネットで見つけた同じコードの多くのバリエーションを試しましたが、うまく動作しません。最初に、それが正しいタブであるかどうかを確認します-それは機能します。次に、コンポーネントの数を確認しますが、うまくいきません。合計 9 個のチェックボックスを持つ 2 つのパネルがあるにもかかわらず、0 コンポーネントと表示されます。

procedure TfrmHsUsers.pagUsersClick(Sender: TObject);
var
  i: integer;
  Fieldname: string;
begin
  if pagUsers.Properties.ActivePage.Name = 'tabProgram' then
    begin
ShowMessage(IntToStr(pagUsers.Properties.ActivePage.ComponentCount));
      for i := 0 to pagUsers.Properties.ActivePage.ComponentCount - 1 do
        if (pagUsers.Properties.ActivePage.Components[i]) is TcxDbCheckBox then
          begin
            Fieldname := TcxDbCheckBox(pagUsers.Properties.ActivePage.Components[i]).DataBinding.DataField;
            TcxDbCheckBox(pagUsers.Properties.ActivePage.Components[i]).Enabled := Settings.License.IsEnabled(Fieldname);
          end;
    end;
end;

私のコードで何が間違っている可能性があるかについてのヒントはありますか?

4

1 に答える 1

11

間違っているのは、Componentsプロパティをループしていることです。これは、タブ シートが所有するコンポーネントを一覧表示します。フォーム デザイナーで作成されたコンポーネントの場合、フォームが所有者です。したがってpagUsers.Properties.ActivePage.ComponentCount、フォーム上で何かを所有しているのはフォーム自体だけであるため、 はゼロであると予想されます。

あなたがする必要があるのは、タブシートの子を使用ControlCountして反復することです。Controls[]のすべての使用を にComponentCount置き換え、ControlCount同様に に置き換えます。Components[]Controls[]

ControlCountおよびControls[]プロパティは直接の子のみを与えることに注意してください。パネルがあるので、タブ シートの子としてパネルを持ち、パネルの子としてチェック ボックスを持っている可能性があります。したがって、パネルの子を反復処理する必要があります。

ここでの私の答えは、それを行う1つの方法を示しています。私がそこに示したコードを使用すると、チェックボックスの繰り返しは非常に簡単に記述できます。

TabSheet := pagUsers.Properties.ActivePage;
for CheckBox in TControls.Enumerator<TcxDbCheckBox>(TabSheet) do
  ....
于 2013-03-17T17:25:55.273 に答える