Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обработчик для множества компонентов CheckBox
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Buratino
Пишу VCL Forms Application на С++ Builder XE4. На форме имеется большое количество CheckBox'ов. Есть ли способы их опроса , позволяющих избежать обращение к каждому из них по отдельности (как в примере)?

Код
    
if (CheckBox1->Checked == true)
    {
    signal1 = 1;
    Label1->Font->Color = clLime;
    }
    else
    {
    signal1 = 0;
    Label1->Font->Color = clBtnFace;
    }

    if (CheckBox2->Checked == true)
    {
    signal2 = 2;
    Label2->Font->Color = clLime;
    }
    else
    {
    signal2 = 0;
    Label2->Font->Color = clBtnFace;
    }

и т.д. .......
AHTOXA
Ну например так:

Код
procedure TMainForm.Test();
var
  CheckBox : TCheckBox;
  Label : TLabel;
begin
  for i := 1 to 10 do
  begin
    CheckBox := TCheckBox(FindComponent('CheckBox' + IntToStr(i));
    Label := TLabel(FindComponent('Label' + IntToStr(i));
    if CheckBox.Checked then
    begin
      signal1 = i;
      Label.Font.Color := clLime;
    end
    else
    begin
      signal1 = 0;
      Label.Font.Color := clBtnFace
    end;
  end;
end;
megajohn
как-то так (пишу без проверки, на память )
Код
    
typedef struct{
    TCheckBox* cb;
    TLabel* lbl;
    int* sig;
}Sarr;

Sarr arr[] = {
{ &CheckBox1, &Label1, &signal1 },
{ &CheckBox2, &Label2, &signal2 },
{ &CheckBox3, &Label3, &signal3 },
{ &CheckBox4, &Label4, &signal4 },
};

for( int i = 0; i < 4; i++ )
{
    if( arr[ i ].cb->Checked )
    {
        arr[ i ].sig = 1 + i;
        arr[ i ].lbl->Font->Color = clLime;
    }
    else
    {
        arr[ i ].sig = 0;
        arr[ i ].lbl->Font->Color = clBtnFace;
    }
}


ARV
а я вообще поступаю иначе - все компоненты формы ведь лежат в массиве Components, так что остается лишь перебрать все компоненты в цикле с проверкой их типа и для нужных изменить свойство. как-то так вот:
Код
with Form1 do
   for i:=0 to ComponentCount-1 do
      if Components[i] is TCheckBox
         then TCheckBox(Componens[i]).Checked := true;
Buratino
Спасибо всем за помощь! Буду пробовать sm.gif
ARV
дополняю: скорее надо использовать массив Controls, а не Components при соответствующих корректировках количества элементов (контролов). если контролы эти находятся в контейнере (например, TPanel или TGroup), то надо соответственно перебирать массив Controls этих контейнеров, а не формы.
ar__systems
Цитата(ARV @ Sep 26 2013, 23:33) *
а я вообще поступаю иначе - все компоненты формы ведь лежат в массиве Components, так что остается лишь перебрать все компоненты в цикле с проверкой их типа и для нужных изменить свойство. как-то так вот:


Если есть разные по функции чекбоксы, можно им еще таги приписывать.
Ramil
Я создавал такие вещи динамически, при этом удобно становится обрабатывать контролы какие бы они не были, одним обработчиком. Что кнопки что чекбоксы, что пункты меню .


Код
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    checking = new TCheckBox*[10];

   for(int i = 0; i<10; i++)
    {
      checking[i] = new TCheckBox(this);
      checking[i]->Parent = Form1;
      checking[i]->Height = 25;
      checking[i]->Left = 50;
      checking[i]->Top = i*checking[i]->Height;
      checking[i]->Caption = "CheckBox  " + IntToStr(i+1);
      checking[i]->Visible = true;
      checking[i]->OnClick = CheckBoxClick;
    }

}
//---------------------------------------------------------------------------

void __fastcall TForm1::CheckBoxClick(TObject *Sender)
{
  
  for (int i=0; i<10; i++)
    {
      if (Sender == checking[i] )
       {
         ShowMessage(IntToStr(i+1));
       }
    }
}
//--------


checking и обработчик клика CheckBoxClick(TObject *Sender) объявлены в классе формы


Код
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        void __fastcall CheckBoxClick(TObject *Sender);
private:    // User declarations
public:        // User declarations
        __fastcall TForm1(TComponent* Owner);

        TCheckBox **checking;

};
Buratino
Цитата
Если есть разные по функции чекбоксы, можно им еще таги приписывать.

Спасибо, с этим стоит разобраться, просто я не учёл того, что на перспективу чекбоксы будут выполнять различные функции и таких будет большинство, (пример кода ,что я скинул сверху упрощённый), так что простым перебором тут ,я думаю, не обойдусь.
И ещё возник вопрос касательно свойства CheckBox:)
Хочу изменить цвет бэкграунда (свойство Color), в хэлпе оно описывается и показывается, что его можно изменить, но у меня что-то не получается, пробовал отключать и включать свойство ParentColor, но тоже безрезультатно.

----
и ещё, попробовал инициализировать массив указателей на чекбоксы, выдало ошибку:

Код
TCheckBox* box[4];
.....
box [4] = {CheckBox1, CheckBox2, CheckBox3, CheckBox4};

[bcc32 Error] Unit1.cpp(25): E2188 Expression syntax


а при инициализации поэлементно всё компилируется и работает как надо
Код
...
box[0] = CheckBox1;
box[1] = CheckBox2;
box[2] = CheckBox3;
box[3] = CheckBox4;

почему такое происходит?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.