реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Обработчик для множества компонентов CheckBox
Buratino
сообщение Sep 26 2013, 08:44
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 24-11-11
Из: Город-герой Минск
Пользователь №: 68 491



Пишу 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 - Sep 26 2013, 08:47
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 26 2013, 10:54
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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

Код
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;


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
megajohn
сообщение Sep 26 2013, 12:52
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



как-то так (пишу без проверки, на память )
Код
    
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;
    }
}




--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
ARV
сообщение Sep 27 2013, 04:33
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



а я вообще поступаю иначе - все компоненты формы ведь лежат в массиве Components, так что остается лишь перебрать все компоненты в цикле с проверкой их типа и для нужных изменить свойство. как-то так вот:
Код
with Form1 do
   for i:=0 to ComponentCount-1 do
      if Components[i] is TCheckBox
         then TCheckBox(Componens[i]).Checked := true;


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Buratino
сообщение Sep 27 2013, 07:02
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 24-11-11
Из: Город-герой Минск
Пользователь №: 68 491



Спасибо всем за помощь! Буду пробовать sm.gif
Go to the top of the page
 
+Quote Post
ARV
сообщение Sep 27 2013, 08:08
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Sep 29 2013, 02:28
Сообщение #7


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(ARV @ Sep 26 2013, 23:33) *
а я вообще поступаю иначе - все компоненты формы ведь лежат в массиве Components, так что остается лишь перебрать все компоненты в цикле с проверкой их типа и для нужных изменить свойство. как-то так вот:


Если есть разные по функции чекбоксы, можно им еще таги приписывать.
Go to the top of the page
 
+Quote Post
Ramil
сообщение Sep 29 2013, 04:18
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 5-08-04
Пользователь №: 452



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


Код
__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;

};
Go to the top of the page
 
+Quote Post
Buratino
сообщение Oct 1 2013, 08:06
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 24-11-11
Из: Город-герой Минск
Пользователь №: 68 491



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

Спасибо, с этим стоит разобраться, просто я не учёл того, что на перспективу чекбоксы будут выполнять различные функции и таких будет большинство, (пример кода ,что я скинул сверху упрощённый), так что простым перебором тут ,я думаю, не обойдусь.
И ещё возник вопрос касательно свойства 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 - Oct 1 2013, 13:59
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 16:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.0143 секунд с 7
ELECTRONIX ©2004-2016