![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Как то давно я плотно сидел на дельфях, и помню что такую штуку делал как то очень просто, а ныне вернувшись к тому же не могу припомнить даже с чего начать. Помогите вспомнить.
Задача Есть три (десять, двадцать, триста пятьдесят - не важно) чекбокса и массив из трех (10,20,350 соответственно) строковых переменных. Как считать данные о свойствах чекбокса, не прибегая к использованию имен компонентов и зная что в форме все чекбоксы необходимо обработать? Например мне надо переписать имена (Name - не Caption) всех чекбоксов в соответствующие позиции массива (CheckBox1 -> St[1] и т д). И, допустим, все нечетные чекбоксы (1й и 3й) отметить флажком (Checked). Если бы чекбоксов было 3 - я б не спрашивал - у меня родственных компонентов целая рота, и по каждому из них писать события было бы напряжно, тем более что рядом форма с не меньшей их толпой. Проще было бы работать с целым классом - то бишь проверить все потомки чеков в форме и их обработать одной функцией. |
#2
|
||||
|
||||
![]() У формы есть такое свойство
ControlCount это количество всех контроллов на форме Еще есть Controls[i] это номер контролла Обращатся так Controls[i] as TComboBox Поехали по циклу Код:
with form1 do begin for i := 0 to ControlCount-1 do with Controls[i] as TComboBox do ...//Твой код end; Еще рекоммендую каждому твоему ComboBox-у установить свойство Tag и работать с ним Например Код:
case Controls[i].Tag of 1: ... 2: ... end; В начале был Бит, потом Байт и только потом появилось Слово... Последний раз редактировалось NIch, 18.04.2010 в 14:09. |
#3
|
|||
|
|||
![]() Ага. Спасибо. Что то вспоминается, но пока плохо применяется. "Invalid class typecast" ругается.
|
#4
|
|||
|
|||
![]() С тагами и правда проблема решается. Вот кусок тестового кода - в целом можно без обращения к имени работать. Спасибо!
Код:
for i := 0 to ComponentCount - 1 do if(Components[i].Tag = 1) then (Components[i] as TCheckbox).checked :=True; Но все же хотелось узнать побольше про классовые заморочки. Возможно ли как то работать с целым классом? И если возможно - расскажите как можно использовать в данной ситуации идентификаторы Sender. То бишь если дополнить каким то образом обработчик события OnClick для класса TCheckBox и по клику вызывать некую процедуру, которая производит дальнейшие изменения работая с вызвавшим компонентом в зависимости от того, какой ЧекБокс вызвал это событие. |
#5
|
||||
|
||||
![]() Да точно так же...
Код:
procedure TForm1.Button1Click(Sender: TObject); begin with Sender as TComboBox do begin ... end; end; Цитата:
В начале был Бит, потом Байт и только потом появилось Слово... Последний раз редактировалось NIch, 18.04.2010 в 15:47. |
#6
|
|||
|
|||
![]() Все гениально просто.
![]() |