Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2011, 01:48   #1
TreadProblem
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 12
По умолчанию Динамическое создание объектов и задание событий

Задача:Создание динамической формы и всех объектов на ней, по заранее заданным критериям, которые берутся к примеру из файла.

т.е. в файле задаем все объекты и их свойства, загружаем в прогу, она создает форму и объекты. с этим особых напрягов нет, в инете полно статей и мануалов.

Проблема вот в чем. как динамически создавать события для динамически созданных объектов?

В инете нашел только, как прикрутить уже заранее созданное событие к динамически созданному объекту, а если мне нужно что бы код в событии был всегда разным? довольно странно создавать 100 кнопок и использовать для него 1 заранее созданное событие. все 100 кнопок будут делать 1 и ту же функцию(( а если заранее для всех 100 кнопок прописывать событие, то и динамическое создание просто не к чему, потому что придется руками прописать все 100 событий для каждой кнопки(

пример того что нашел в инете:
Код:
public
Buttons: Array[1..5] of TButton;
procedure ButtonsDown(Sender: TObject);
end;

.................................................. ...............

with Buttons[i] do begin
.................................................. ............
onClick:=ButtonsDown;
.................................................. ............
ведь как я понял все 5 кнопок на событие onClick будут реагировать одинаково 0о

т.е. если я в процедуру ButtonsDown засуну что то типа ShowMessage('ОЛОЛО'); по нажатию на любую из 5и динамически созданных кнопок будет появлятся мессага "ОЛОЛО" . это как то странно 0о либо я чего то не догнал 0о


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 15.03.2011 в 02:01.
TreadProblem вне форума Ответить с цитированием
Старый 15.03.2011, 02:08   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Да. Это так.

Но, если Вы внимательно посмотрите на процедуру обработки нажатия ButtonsDown, то увидите, что в неё передаётся параметер: Sender: TObject
Этот Sender - это и есть так кнопка, на которую произведено нажатие.
Ну а дальше - Вам решать, что с этим делать.
Можно отобразить имя кнопки.
Код:
ShowMessage('Имя кнопки: '+ TButton(Sender).Name);
А можно, в зависимости от имени - производить ветление (т.е. при нажатии на разные кнопки будут разные действия) - всё в Ваших руках, как программиста!

И ещё один маленький хинт...
У кнопки есть такое свойство, как Tag. По сути это просто Integer. Можно при создании кнопки туда что-то записывать (например, тот же счётчик I) - просто числовое поле удобнее анализировать в коде процедуры обработки, чем строковое имя кнопки..

Надеюсь, сумел объяснить...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.03.2011, 02:13   #3
TreadProblem
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Да. Это так.

Но, если Вы внимательно посмотрите на процедуру обработки нажатия ButtonsDown, то увидите, что в неё передаётся параметер: Sender: TObject
Этот Sender - это и есть так кнопка, на которую произведено нажатие.
Ну а дальше - Вам решать, что с этим делать.
Можно отобразить имя кнопки.
Код:
ShowMessage('Имя кнопки: '+ TButton(Sender).Name);
А можно, в зависимости от имени - производить ветление (т.е. при нажатии на разные кнопки будут разные действия) - всё в Ваших руках, как программиста!

И ещё один маленький хинт...
У кнопки есть такое свойство, как Tag. По сути это просто Integer. Можно при создании кнопки туда что-то записывать (например, тот же счётчик I) - просто числовое поле удобнее анализировать в коде процедуры обработки, чем строковое имя кнопки..

Надеюсь, сумел объяснить...
да, спасибо за ответ) но нового ничего не увидел к сожалению( о свойстве tag прочитал сегодня в нескольких статьях.

единственное решение которое идет в голову довольно топорно.
Сделать 1 событие и в него загнать условную структуру типа:

Код:
if id=1 then begin
  showmessage('ololo');
end else id=2 then begin
  edit1.text='olololo';
end else и т.д.

к примеру если баттон1 то id=1 и будет выполнятся шоумессадж, если баттон2 то в едит запишется "ололо", это по сути тоже самое что задать все события заранее, но запехнув их так сказать в одно место.

вообще задача стоит в том, что бы событие так же создавалось динамически.

Последний раз редактировалось TreadProblem; 15.03.2011 в 02:16.
TreadProblem вне форума Ответить с цитированием
Старый 15.03.2011, 03:03   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Так вам и много обработчиков плохо, и один обработчик тоже плохо.
Есть ещё такой оператор case, чтобы не плодить условия:

PHP код:
case (Sender as TComponent).Tag of
  1
: ;
  
2: ;
  
3: ;
end
Тоже не устроит? Тогда вы хотите чего-то странного.

Цитата:
Проблема вот в чем. как динамически создавать события для динамически созданных объектов?
Давайте определимся, либо код обработчика есть в момент компиляции программы, либо его нет.

Если код есть, ваша задача просто связать его с нужными событиями у нужных контролов. Можно даже динамически указывать имена методов в вашем файле (как это делается в .dfm) и через RTTI находить их адреса:

PHP код:
    class function MethodAddress(const NameShortString): Pointer
Если же кода обработчика нет в момент компиляции, то вам нужен скриптовый движок, типа RemObjects.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 15.03.2011, 08:26   #5
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

ХЗ кто как, а я обработчики событий решал всегда через тэги контролов...

Код:
with Buttn[I] do begin
....
tag:=I;
OnClick:=Btn_Click;
...
end;


procedure btn_click(Sender:TObject);
begin
case (sender as TButton).tag of
0:begin
//действия по кнопке с тэгом 0
end;
end;
end;
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 15.03.2011, 11:26   #6
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Вы абсолютно правы, но ТС "заказал" нечто с искусственным разумом:
Цитата:
задача стоит в том, что бы событие так же создавалось динамически
То есть он не хочет описывать обработчик в дизайн-тайме...
Ну что ж - флаг ему в руки.

З.Ы. Немножко дополню. Если временно нужно вообще отменить обработчик, то делаем так:
Код:
OnClick:=nil;

Последний раз редактировалось asmodey1; 15.03.2011 в 13:39.
asmodey1 вне форума Ответить с цитированием
Старый 15.03.2011, 11:50   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
что бы событие так же создавалось динамически
Ну VBScript еще не отменили... Вполне программа может генерировать нужный скрипт и выполнять его.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.03.2011, 16:42   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

хотел пройти мимо "молча", но не смог...

Цитата:
Сообщение от TreadProblem
вообще задача стоит в том, что бы событие так же создавалось динамически.
TreadProblem, а расскажите поподробнее, о чём это Вы?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.03.2011, 16:55   #9
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Хе-хе, ТС не знает как событие к кнопке прикрутить, а вы ему предлагаете VBScript, RemObjects. PaxCompiler в самый раз будет.
_SERGEYX_ вне форума Ответить с цитированием
Старый 15.03.2011, 17:57   #10
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

В самый раз будет толкнуть ТС на осознание событий (что они из себя представляют), а не на ПаксКомпайлер Ну и совместно с этим пинком показать примеры...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое создание объектов Костян Пират Общие вопросы Delphi 12 24.05.2011 18:39
Динамическое создание объектов panda88 Общие вопросы Delphi 4 24.01.2010 18:16
Динамическое задание событий Mutagena Помощь студентам 6 08.01.2010 23:22
Динамическое создание событий Fandaret Общие вопросы Delphi 4 14.05.2009 04:20
Динамическое создание объектов LepihinMS Общие вопросы Delphi 18 05.07.2007 23:31