Перейти к содержанию
    

Обработчик для множества компонентов CheckBox

Пишу 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;
    }

и т.д. .......

Изменено пользователем Buratino

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как-то так (пишу без проверки, на память )

    
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;
    }
}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а я вообще поступаю иначе - все компоненты формы ведь лежат в массиве Components, так что остается лишь перебрать все компоненты в цикле с проверкой их типа и для нужных изменить свойство. как-то так вот:

with Form1 do 
   for i:=0 to ComponentCount-1 do
      if Components[i] is TCheckBox 
         then TCheckBox(Componens[i]).Checked := true;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

дополняю: скорее надо использовать массив Controls, а не Components при соответствующих корректировках количества элементов (контролов). если контролы эти находятся в контейнере (например, TPanel или TGroup), то надо соответственно перебирать массив Controls этих контейнеров, а не формы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а я вообще поступаю иначе - все компоненты формы ведь лежат в массиве Components, так что остается лишь перебрать все компоненты в цикле с проверкой их типа и для нужных изменить свойство. как-то так вот:

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

__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;

};

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

И ещё возник вопрос касательно свойства 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;

почему такое происходит?

Изменено пользователем Buratino

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...