Buratino 0 26 сентября, 2013 Опубликовано 26 сентября, 2013 (изменено) · Жалоба Пишу 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; } и т.д. ....... Изменено 26 сентября, 2013 пользователем Buratino Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 26 сентября, 2013 Опубликовано 26 сентября, 2013 · Жалоба Ну например так: 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 3 26 сентября, 2013 Опубликовано 26 сентября, 2013 · Жалоба как-то так (пишу без проверки, на память ) 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 0 27 сентября, 2013 Опубликовано 27 сентября, 2013 · Жалоба а я вообще поступаю иначе - все компоненты формы ведь лежат в массиве Components, так что остается лишь перебрать все компоненты в цикле с проверкой их типа и для нужных изменить свойство. как-то так вот: with Form1 do for i:=0 to ComponentCount-1 do if Components[i] is TCheckBox then TCheckBox(Componens[i]).Checked := true; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Buratino 0 27 сентября, 2013 Опубликовано 27 сентября, 2013 · Жалоба Спасибо всем за помощь! Буду пробовать :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 0 27 сентября, 2013 Опубликовано 27 сентября, 2013 · Жалоба дополняю: скорее надо использовать массив Controls, а не Components при соответствующих корректировках количества элементов (контролов). если контролы эти находятся в контейнере (например, TPanel или TGroup), то надо соответственно перебирать массив Controls этих контейнеров, а не формы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavka012 0 29 сентября, 2013 Опубликовано 29 сентября, 2013 · Жалоба а я вообще поступаю иначе - все компоненты формы ведь лежат в массиве Components, так что остается лишь перебрать все компоненты в цикле с проверкой их типа и для нужных изменить свойство. как-то так вот: Если есть разные по функции чекбоксы, можно им еще таги приписывать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ramil 0 29 сентября, 2013 Опубликовано 29 сентября, 2013 · Жалоба Я создавал такие вещи динамически, при этом удобно становится обрабатывать контролы какие бы они не были, одним обработчиком. Что кнопки что чекбоксы, что пункты меню . __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 0 1 октября, 2013 Опубликовано 1 октября, 2013 (изменено) · Жалоба Если есть разные по функции чекбоксы, можно им еще таги приписывать. Спасибо, с этим стоит разобраться, просто я не учёл того, что на перспективу чекбоксы будут выполнять различные функции и таких будет большинство, (пример кода ,что я скинул сверху упрощённый), так что простым перебором тут ,я думаю, не обойдусь. И ещё возник вопрос касательно свойства 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; почему такое происходит? Изменено 1 октября, 2013 пользователем Buratino Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться