![]() |
|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
![]() Все гениально просто.
![]() |
#7
|
|||
|
|||
![]() Поработал с Sender'ом. Возникла новая проблема. Даже не проблема - просто вопрос за удобство использования. По клику на чекбокс вызывается процедурка strshow таким вот незатейливым образом
Код:
procedure TForm4.CheckBox4Click(Sender: TObject); begin strshow(CheckBox4); end; А сама процедурка вот такая вот: Код:
procedure strshow(Sender:TObject); begin with Sender as TCheckbox do begin if (Sender as TCheckbox).Checked then form4.StringGrid1.ColWidths[17]:=64 else form4.StringGrid1.ColWidths[17]:=-1; end; end; Ну не суть - главное вот что - вызывая процедурку надо вписывать в тело события как параметр сам чекбокс. Можно ли как нибудь избежать этого? Или придется например из чекбокса номер семь вызывать событие и специально указывать что это именно чекбокс номер семь? |
#8
|
|||
|
|||
![]() Код:
procedure TForm4.CheckBox4Click(Sender: TObject); begin If Sender Is TCheckBox Do begin if (Sender as TCheckbox).Checked then form4.StringGrid1.ColWidths[17]:=64 else form4.StringGrid1.ColWidths[17]:=-1; end; end; Этот обработчик надо назначить разным чекбоксам. Если хочется разной логики по разным чекбоксам, так у любого компонента есть свойство Tag. |