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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.02.2014, 23:35
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию Обработчик на динамически созданный пункт меню

Код:
procedure ReceiveFile (FileName: String);
begin
    ...
//некое действие
    ...
end;
Код:
procedure TForm1.FormCreate(Sender: TObject);  
var mi: TMenuItem;
     LF: TStringList;    i: Byte;
begin
 
                .......................................

  mi:= TMenuItem.Create(Self);
  mi.Caption:= LF[i];
  mi.Hint:= Optns.ReadString(LF[i]);

  mi.OnClick:= //Вот тут и загвоздочка

  PopupMenu2.Items.Insert(1, mi);

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

end;
Есть процедура принимающая параметр, динамически создается MenuItem, задача в том что бы на mi.OnClick выполнялась procedure ReceiveFile (FileName: String)
Ответить с цитированием
  #2  
Старый 15.02.2014, 23:41
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Делаешь метод, в параметрах Sender. Можно создать автоматом дабл-кликом на идентичном объекте (меню итем), потом убрать его как обработчик. Ну и назначаешь.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 16.02.2014, 09:04
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Делаешь метод, в параметрах Sender. Можно создать автоматом дабл-кликом на идентичном объекте (меню итем), потом убрать его как обработчик. Ну и назначаешь.
Можно пример?
Ответить с цитированием
  #4  
Старый 16.02.2014, 10:14
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
  private
    { Private declarations }
    procedure Click1Click(Sender: TObject);
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 16.02.2014, 16:42
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию

Цитата:
Ну и назначаешь
Как понять "назначаешь"? mi.OnClick - событие (TNotifyEvent), обработчик это процедура (или как правило процедура?) для компонента добавленного в DesignTime обработчик назначаю в инспекторе объектов, а как это делается для динамически создаваемых компонентов? Вроде что-то с указателями связано, но я не понял.
Еще вопрос в догонку: у TMenuItem есть свойство Hint: String, оно как то по-другому работает по сравнению с аналогичным свойсвом, например, у кнопки?

Последний раз редактировалось Помидоркин, 16.02.2014 в 16:50.
Ответить с цитированием
  #6  
Старый 16.02.2014, 16:50
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

На самом деле всё очень просто. Предварительно создаёте свой обработчик, идентичный по входным/выходным параметрам "родной" процедуре обработки для создаваемого компонента напр.
Код:
private
procedure MyClick(Sender: TObject);
...

procedure TForm1.MyClick(Sender: TObject);
begin
// здесь всё что нужно выполнить при событиии
end;
затем при создании назначаете
Код:
...
mi.OnClick:=MyClick;
...
вот и всё
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Помидоркин (16.02.2014)
  #7  
Старый 16.02.2014, 17:25
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
mi.OnClick:=MyClick;
Да спасибо, так работает. Только столкнулся с другой проблеммой, о которой сразу не подумал: у меня динамически создаются несколько пунктов меню, которым я назначаю один обработчик, а уже обработчику надо передать параметр в зависимости от того какой из пунктов выбран, в моем случае вполне подойдет вариант передать обработчику в качестве параметра Caption выбранного пункта меню.
Ответить с цитированием
  #8  
Старый 16.02.2014, 17:34
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Тоже без проблем. У вас есть такой замечательный союзник в энтом деле, как Sender т.е. это тот кто вызвал это событие. Что вам надо, надпись на пункте меню? Тогда в обработчике
Код:
...
if (Sender as TMenuItem).Caption = 'bla-bla' then // что-то делаем
...
с другими аналогично
Ответить с цитированием
  #9  
Старый 16.02.2014, 17:40
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

А еще есть свойство TAG.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #10  
Старый 16.02.2014, 17:48
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Тогда в обработчике
Код:
...
if (Sender as TMenuItem).Caption = 'bla-bla' then // что-то делаем
...
Скорее как-то так:
Код:
var FileName: String
....
FileName:= (Sender as TMenuItem).Caption
Так правильно будет?
Ответить с цитированием
  #11  
Старый 16.02.2014, 17:54
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Всё верно, это был пример. Прогресс!!!
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Помидоркин (16.02.2014)
  #12  
Старый 17.02.2014, 12:04
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

А для теории почитать вот это
http://www.delphikingdom.com/asp/vie...?catalogid=342
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter