powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кто вызвал PopupMenu?
6 сообщений из 6, страница 1 из 1
Кто вызвал PopupMenu?
    #32362394
Milch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Один компонент TPopupMenu привязан к нескольким компонентам на форме.

Во время вызова меню (OnPopup) или срабатывания позиции меню (OnClick) необходимо узнать, какой из компонентов инициализировал меню.

К примеру, в событии OnClick(Sender: TObject) это будет
(Sender as TMenuItem).GetParentMenu.PopupComponent.

Все прекрасно до тех пор, пока позиция меню вызывается мышкой.
Если происходит инициализация с помощью ShortCut, то
(Sender as TMenuItem).GetParentMenu.PopupComponent = nil.

Почему и как с этим бороться?
...
Рейтинг: 0 / 0
Кто вызвал PopupMenu?
    #32362401
Berg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант:
устанавливаешь свойство Tag компонент, к которым привязан TPopupMenu в 0,1,2,3...
Тогда в обработчике OnClick(Sender: TObject) пишешь:
if (Sender as TComponent).Tag = 0 then ... else
if (Sender as TComponent).Tag = 1 then ... else ...
...
Рейтинг: 0 / 0
Кто вызвал PopupMenu?
    #32362465
Milch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Berg

В принципе подошло бы, но Sender в данном случае TMenuItem, а не вызывающий коммпонент:(
...
Рейтинг: 0 / 0
Кто вызвал PopupMenu?
    #32362666
LexusR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй так
Напиши функцию определения контрола под мышью типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function TForm1.FindControlAtMousePos(Control: TWinControl): TControl;
var
  ChildControl   : TControl;
begin
  ChildControl := Control.ControlAtPos(Control.ScreenToClient(Mouse.CursorPos),false,true);
  if Assigned(ChildControl) then
   if ChildControl is TWinControl then
     Result := FindControlAtMousePos(ChildControl as TWinControl)
   else
     Result := ChildControl
  else
   Result := Control;
end;


и в обработчике пункта меню используй эту функцию типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
procedure TForm1.MenuItemClick(Sender: TObject);
var
  CurrControl   : TControl;
begin
  CurrControl := FindControlAtMousePos(self);
  Caption :=CurrControl.ClassName;
end;
...
Рейтинг: 0 / 0
Кто вызвал PopupMenu?
    #32362760
Milch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LexusR

Так не получится. Мышь не при делах. В момент срабатывания ShortCut мышь может находиться где угодно, в том числе и за пределами приложения.

Решение уже найдено. Поскольку событие ShortCut происходит не для контрола, а для формы, то и спрашивать нужно у формы, какой у нее активный контрол в момент возникновения события. У формы есть на этот случай OnShortCut.
...
Рейтинг: 0 / 0
Кто вызвал PopupMenu?
    #32362784
LexusR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос просто в том что нужно получить в момент нажатия ShortCut
если Control находящийся под курсором то тот вариант что я написал
а если контрол активный в данный момент то можно просто прямо в обработчике нажатия пункта меню спросить у формы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TForm1.MenuItemClick(Sender: TObject);
var
  CurrControl1   : TControl;
  CurrControl2   : TControl;
begin
  CurrControl1 := FindControlAtMousePos(self);// контрол под курсором
  CurrControl2 := Self.ActiveControl;             // активный контрол 
  Caption :=CurrControl1.ClassName + '  ' +CurrControl2.ClassName ;
end;
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кто вызвал PopupMenu?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]