Массив из CheckBox - использование разделяемого обработчика события I
Поместите несколько Checkbox в компонент TGroupBox. Во время прогона (или проектирования) назначьте общий обработчик события Click для всех checkbox'в. Чтобы в цикле обойти все "дочерние" TCheckBox'ы, можно воспользоваться свойством-массивом Controls TGroupBox (и заодно привести их к типу TCheckBox). Приблизительно так:
for i := 0 to GroupBox1.ControlCount -1 do if (GroupBox1.Controls[i] as TCheckBox).checked then {что-то там еще}; |
Вы можете получить имя sender следующим образом:
procedure TMain1.CheckBoxClick(Sender: TObject); var whodidit : string[63]; begin whodidit := TComponent(sender).name; end; |
После приведения типа можно добраться и до других свойств. К примеру, очень полезным может оказаться свойство Tag. Во время создания, вы можете присвоить каждому checkbox.tag свой ID номер. А в обработчике события, читая ID, можно идентифицировать sender. [001476]
var CheckArray: array[1..x] of TCheckBox; i:integer; begin for i:=1 to x do begin CheckArray[i]:=TCheckBox.Create(Form1); {Устанавливаем свойства} with CheckBox[i] do begin Left:=i*20; Width:=15; другое... end; end; |
Очевидно, можно сказать:
Check[i].OnClick:=xyz. |
Пока я и сам не знаю как поступить. Динамическое создание компонентов да, но обработчики событий?
Существует способ организации массива checkbox'ов с разделяемым обработчиком события. Расположите их на форме и дайте им "непрерывные" имена (Check1, Check2 и т.д.). Затем установите у них общий обработчик события. Обработчик события может выглядеть так:
procedure TForm.Check1Click(Sender : TObject); var i : Integer; begin for i := 1 to 10 { предположим, что мы имеем 10 checkbox'ов } do With TCheckBox(FindComponent('Check'+IntToStr(i))) do begin { другой какой-то код } end; end; |
[001478]