Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.04.2010, 13:55
Melletzar Melletzar вне форума
Прохожий
 
Регистрация: 18.04.2010
Сообщения: 11
Репутация: 10
По умолчанию Вопроссец по классам

Как то давно я плотно сидел на дельфях, и помню что такую штуку делал как то очень просто, а ныне вернувшись к тому же не могу припомнить даже с чего начать. Помогите вспомнить.

Задача

Есть три (десять, двадцать, триста пятьдесят - не важно) чекбокса и массив из трех (10,20,350 соответственно) строковых переменных.

Как считать данные о свойствах чекбокса, не прибегая к использованию имен компонентов и зная что в форме все чекбоксы необходимо обработать?

Например мне надо переписать имена (Name - не Caption) всех чекбоксов в соответствующие позиции массива (CheckBox1 -> St[1] и т д). И, допустим, все нечетные чекбоксы (1й и 3й) отметить флажком (Checked).

Если бы чекбоксов было 3 - я б не спрашивал - у меня родственных компонентов целая рота, и по каждому из них писать события было бы напряжно, тем более что рядом форма с не меньшей их толпой. Проще было бы работать с целым классом - то бишь проверить все потомки чеков в форме и их обработать одной функцией.
Ответить с цитированием
  #2  
Старый 18.04.2010, 14:05
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

У формы есть такое свойство
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;
Имя переписать сложно, т.к. в компьютерной памяти нет имен, только ссылки (Handle) на конкретный контролл.
Еще рекоммендую каждому твоему ComboBox-у установить свойство Tag и работать с ним
Например
Код:
 case Controls[i].Tag of
  1: ...
  2: ...
 end;
__________________
В начале был Бит, потом Байт и только потом появилось Слово...

Последний раз редактировалось NIch, 18.04.2010 в 14:09.
Ответить с цитированием
  #3  
Старый 18.04.2010, 14:54
Melletzar Melletzar вне форума
Прохожий
 
Регистрация: 18.04.2010
Сообщения: 11
Репутация: 10
По умолчанию

Ага. Спасибо. Что то вспоминается, но пока плохо применяется. "Invalid class typecast" ругается.
Ответить с цитированием
  #4  
Старый 18.04.2010, 15:11
Melletzar Melletzar вне форума
Прохожий
 
Регистрация: 18.04.2010
Сообщения: 11
Репутация: 10
По умолчанию

С тагами и правда проблема решается. Вот кусок тестового кода - в целом можно без обращения к имени работать. Спасибо!

Код:
for i := 0 to ComponentCount - 1 do
  if(Components[i].Tag = 1) then
    (Components[i] as TCheckbox).checked :=True;

Но все же хотелось узнать побольше про классовые заморочки. Возможно ли как то работать с целым классом?

И если возможно - расскажите как можно использовать в данной ситуации идентификаторы Sender. То бишь если дополнить каким то образом обработчик события OnClick для класса TCheckBox и по клику вызывать некую процедуру, которая производит дальнейшие изменения работая с вызвавшим компонентом в зависимости от того, какой ЧекБокс вызвал это событие.
Ответить с цитированием
  #5  
Старый 18.04.2010, 15:44
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Да точно так же...
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
 with Sender as TComboBox do
 begin
 ...
 end;
end;
А эта ошибка
Цитата:
"Invalid class typecast"
возникает потому что к примеру Edit не может быть as TComboBox, т.е. нужно еще вставлять проверку...для этого и рекоммендую испольовать Tag...
__________________
В начале был Бит, потом Байт и только потом появилось Слово...

Последний раз редактировалось NIch, 18.04.2010 в 15:47.
Ответить с цитированием
  #6  
Старый 18.04.2010, 15:47
Melletzar Melletzar вне форума
Прохожий
 
Регистрация: 18.04.2010
Сообщения: 11
Репутация: 10
По умолчанию

Все гениально просто. Спасибо!
Ответить с цитированием
  #7  
Старый 19.04.2010, 00:50
Melletzar Melletzar вне форума
Прохожий
 
Регистрация: 18.04.2010
Сообщения: 11
Репутация: 10
По умолчанию

Поработал с 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  
Старый 19.04.2010, 07:14
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,084
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Код:
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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:46.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025