Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 442

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
В приложении имеется главное меню, в одном из его элементов (пусть это будет MMain) необходимо во время работы программы создать несколько пунктов. Создаваемые пункты находятся в массиве MContent. Каждому пункту задаётся событие onClick.
Проблема в том, что в данном случае выполняется одни и те же для всех пунктов действия в onClick. Как задать onClick так, чтобы в нём учитывался номер элемента в массиве?

Приложение:
  1. interface
  2.  
  3. type
  4. TForm1 = class(TForm)
  5. MainMenu: TMainMenu;
  6. MMain: TMenuItem;
  7. procedure FormCreate(Sender: TObject);
  8. procedure MContentClick(Sender: TObject);
  9. public
  10. MContent: Array of TMenuItem;
  11. N: Integer;
  12. end;
  13.  
  14. implementation
  15.  
  16. procedure TForm1.FormCreate(Sender: TObject);
  17. var
  18. i: Integer;
  19. begin
  20. N := 10;
  21. setLength(MContent, N);
  22. for i := low(MContent) to high(MContent) do
  23. begin
  24. MContent[i] := TMenuItem.Create(MainMenu);
  25. MContent[i].Caption := intToStr(i);
  26. MContent[i].onClick := MContentClick;
  27. end;
  28. MMain.Add(MContent);
  29. end;
  30.  
  31. procedure TForm1.MContentClick(Sender: TObject);
  32. begin
  33.  
  34. end;


Mihon Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Mihon (статус: Посетитель)
Вопрос отправлен: 24 ноября 2009, 21:17
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: VJe@n

Здравствуйте, Mihon!

Добавьте в цикле создания меню строку: MContent[i].Tag := 100+i;
В обработчике MContentClick:
case (sender as TMenuItem).Tag
... // действия соотвествующие номеру тега (выбранному пунтку меню)
end;

аналогично можно использовать Имя: MContent[i].Name := 'MN'+IntToStr(i);

Ответ отправил: VJe@n (статус: 1-ый класс)
Время отправки: 24 ноября 2009, 21:29
Оценка за ответ: 5

Комментарий к оценке: Спасибо, то что требовалось!

Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 24 ноября 2009, 23:33; участников в обсуждении: 2.
Roma_no_off

Roma_no_off (статус: Посетитель), 24 ноября 2009, 23:27 [#1]:

Честно говоря, с таким вопросом не сталкивался, но все же предположу, что MainMenu - это класс (очевидно), он в себе содержит список объектов (возможно типа TObject), дак вот у каждого компонента, содержащего такой список, должно быть свойство Components, а метод AddItem (или что-то подобное) добавляет элемент в этот список. Отсюда несложно уяснить, что достаточно создать экземпляр класса TMenuItem в Run-Time и его событию onClick присвоить обрабочик MenuItemClick(Sender: TObject).
Может все и не так, но смысл точно таков.
VJe@n

VJe@n (статус: 1-ый класс), 24 ноября 2009, 23:33 [#2]:

Roma_no_off: похоже вы неправильно прочли вопрос.

У меня сегодня радость!
Я сегодня сделал гадость! :)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:00
Выполнено за 0.02 сек.