• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Tmainmenu определение пункта по клику

  • Автор темы monsters
  • Дата начала
M

monsters

В компоненте TMainMenu нужно по клику определить название или номер пункта по которому он и производился. Создавать для каждого пункта функцию не подходет так как создаются пункты динамически, и все ссылаются на одну и туже функцию.
 
D

dreamer

ЕМНИП, у TMenuItem должно быть свойство Tag. Можно его определять для каждого из элементов меню, а обработчик нажатия для них навесить общий.
 
M

monsters

ЕМНИП, у TMenuItem должно быть свойство Tag. Можно его определять для каждого из элементов меню, а обработчик нажатия для них навесить общий.
C++:
							i=0;
while (row = mysql_fetch_row(result))
{

TMenuItem *NewItem = new TMenuItem(MainMenu1);
zapros=row[0];
NewItem->Caption=zapros;
NewItem->OnClick=sklad;
NewItem->Tag=i;
MainMenu1->Items->Items[2]->Add(NewItem);
i++;
}
Вот например создаю я в цикле и назначаю для каждого элемента меню Tag. Все меню ссылаются на функцию sklad. Как мне узнать какой именно Tag был выбран(по какому из них кликнули)?
 
D

dreamer

У любого обработчика события UI есть параметр Sender:*Object (ну или не Sender - в зависимости от того, как назовёте), который принимает значение указателя на тот контрол, который отправил сообщение. Т.е. теоретически (я с C++ Builder никогда не работал) нужно привести тип Object к TMenuItem и забрать Tag. Т.е. это будет выглядеть так:
C++:
((*TMenuItem)Sender)->Tag
 
M

monsters

Звучит обнадеживающе, но я ничего не понял. Можете привести пример? Хотябы на делфи, с ним мне приходилось работать раньше.
 
D

dreamer



См. функцию TMessing.TargetClick
 
M

monsters

Все, разобрался!
C++:
(TMenuItem*)Sender)->Tag
Тоесть знак звездочки в другую строну от TMenuItem нужно было поставить )
Но мне не сколько даже индекс нужен был, сколько имя кнопочки поэтому сделал так
C++:
(TMenuItem*)Sender)->Caption
dreamer
Большое спасиба! В начале не очень понял =)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!