Определить пункт меню
Работаю с динамическим созданием компонентов.
такой вопрос.
я создаю допустим 10 кнопок (динамически)
при наведении на каждую кнопку требуется сформировать для каждой кнопки свой список выпадающего меню который доже формируется динамически.
ни количество кнопок ни количество выпадающих пунктов меню заранее я не знаю.
вопрос:
Как мне привязать за каждой кнопкой событие MousMove и OnClick и там уже узнать координаты кнопки после чего выводить пункты меню.
и как определить в пунктах меню при нажатии какой у пункта меню айдишник.
Получается выбираем кнопку N -> формируем пункты меню -> выбираем пункт M.
Заранее спасибо!
Через параметр Sender - указатель на объект, выдавший событие. В цикле или через блок if () {} else if () {} else {} проверяется совпадение адреса Sender с адресами рабочих компонентов.
А лучше создавать объекты типа TPopUpMenu одновременно с кнопками. Тогда можно будет связывать меню с кнопкой через свойство PopupMenu.
А лучше создавать объекты типа TPopUpMenu одновременно с кнопками. Тогда можно будет связывать меню с кнопкой через свойство PopupMenu.
Я так и собирался делать! Только не могу понять как определить на какой пункт меню пользователь нажал или отследить его порядковый номер в списке меню!
Меню то будет динамический!
Опять же, назначаем обработчик событию OnClick для всех элементов меню при создании. В обработчике используем параметр Sender.
Определить номер элемента в меню чуть-чуть сложнее:
{
// Проверяем реальный тип объекта Sender
if (dynamic_cast <TMenuItem*> (Sender)) (если Sender - это TMenuItem)
{
TMenuItem *Item = (TMenuItem*) Sender; // Приводим
int i = Item->MenuIndex; // получаем номер элемента в меню
// Далее используем этот номер для условий............
}
}
Определить номер элемента в меню чуть-чуть сложнее:
{
// Проверяем реальный тип объекта Sender
if (dynamic_cast <TMenuItem*> (Sender)) (если Sender - это TMenuItem)
{
TMenuItem *Item = (TMenuItem*) Sender; // Приводим
int i = Item->MenuIndex; // получаем номер элемента в меню
// Далее используем этот номер для условий............
}
}
Большое спасибо!
А как мне назначить обработчик событию OnClick для всех элементов меню при создании?
Это был один из первых вопросов! :)
А как мне назначить обработчик событию OnClick для всех элементов меню при создании?
Это был один из первых вопросов! :)
void __fastcall TForm1::AddButtonClick(TObject *Sender)
{
const int num_items = 4;
for (int index = 0; index < num_items; ++index)
{
TMenuItem *NewItem = new TMenuItem(PopupMenu1); // create the new item
PopupMenu1->Items->Add(NewItem);// add it to the Popupmenu
NewItem->Caption = "Menu Item " + IntToStr(index);
NewItem->Tag = index;
NewItem->OnClick = PopupMenuItemsClick;// assign it an event handler
}
}
void __fastcall TForm1::PopupMenuItemsClick(TObject *Sender)
{
TMenuItem *ClickedItem = dynamic_cast<TMenuItem *>(Sender);
if (ClickedItem)
{
switch (ClickedItem->Tag)
{
case 0:
{
ShowMessage("first item clicked");
break;
}
case 1:
{
ShowMessage("second item clicked");
break;
}
// etc...
}
}
}
To edit or destroy an item, grab its pointer via the TMenuItem::Items property.
void __fastcall TForm1::EditButtonClick(TObject *Sender)
{
const int index = 1;
TMenuItem *ItemToEdit = PopupMenu->Items->Items[index];
ItemToEdit->Caption = "Changed Caption";
}
void __fastcall TForm1::DestroyButtonClick(TObject *Sender)
{
const int index = 2;
TMenuItem *ItemToDelete = PopupMenu->Items->Items[index];
delete ItemToDelete;
}