powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как узнать на каком контроле кликнут элемент попапменю?
25 сообщений из 46, страница 1 из 2
Как узнать на каком контроле кликнут элемент попапменю?
    #39852231
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На форме несколько ButtonedEdit, RightButton.DropDownMenu каждого эдита связан с одним и тем же PopupMenu с несколькими MenuItem.
Как узнать на кнопке какого эдита был кликнут пункт меню?
Пробовал так:
Код: pascal
1.
2.
3.
4.
procedure TForm1.mni1Click(Sender: TObject);
begin
  ShowMessage(PopupMenu1.PopupComponent.Name); // Здесь AV, т.к. PopupMenu1.PopupComponent = nil
end;
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852236
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYingКак узнать на кнопке какого эдита был кликнут пункт меню?

А как ты это меню открываешь?
F1Set PopupComponent to associate a control with the menu before calling the Popup
method programmatically to bring up the pop-up menu.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852242
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

т.е. помимо связи RightButton.DropDownMenu эдита с PopupMenu, нужно еще и св-во PopupMenu самого эдита связать с этим же попапом?
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852249
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так тоже не работает.
"А как ты это меню открываешь?" - клик по правой кнопке ButtonedEdit
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852250
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing,

у PopupMenu есть свойство PopupComponent

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TControl.WMContextMenu(var Message: TWMContextMenu);
...
  PopupMenu := GetPopupMenu;
  if (PopupMenu <> nil) and PopupMenu.AutoPopup then
  begin
    SendCancelMode(Self);
    PopupMenu.PopupComponent := Self;
    if InvalidPoint(Pt) then
      Pt := ClientToScreen(Point(0, 0));
    PopupMenu.Popup(Pt.X, Pt.Y);
    Message.Result := 1;
  end;

  if Message.Result = 0 then
    inherited;
end;
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852251
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing,

если у тебя какие-то кастомные компоненты, то весь вопрос к их создателям
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852253
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)LiYing,

если у тебя какие-то кастомные компоненты, то весь вопрос к их создателям
Только родные делфовые.
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852260
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYingпомимо связи RightButton.DropDownMenu эдита с PopupMenu

У стандартного эдита нет ни свойства RightButton, ни свойства DropDownMenu. Что возвращает
нас к вопросу о левых компонентах.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852282
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TEditButton.TGlyph.WndProc(var Message: TMessage);
var
  LPoint: TPoint;
begin
...
    WM_LBUTTONDOWN:
      if FButton.FDropDownMenu <> nil then
      begin
        if not (csDesigning in Parent.ComponentState) then
        begin
          LPoint := ClientToScreen(Point(0, FButton.EditControl.Height));
          FButton.FDropDownMenu.Popup(LPoint.X, LPoint.Y);
        end;
      end
...
end;


Как видим TEditButton игнорирует PopupComponent, поэтому узнать кто вызывает меню не получится никак. Разве что если сделать полностью свой класс TEditButton, т.к. тип TGlyph амба зачем-то засунула в приватную секцию этого класса, т.е. даже в наследнике до неё не добраться...
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852286
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing,

Как вариант - убрать DropDownMenu, назначить OnClick() и там вручную вызывать PopupMenu с присвоением ей нужного PopupComponent.
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852354
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovLiYingпомимо связи RightButton.DropDownMenu эдита с PopupMenu

У стандартного эдита нет ни свойства RightButton, ни свойства DropDownMenu. Что возвращает
нас к вопросу о левых компонентах.

http://docwiki.embarcadero.com/Libraries/Rio/en/Vcl.ExtCtrls.TButtonedEdit
это левый компонент?
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852365
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852372
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr,

А если с клавиатуры откроют? Хотя не факт, что это возможно с этим контролом.
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852383
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYingэто левый компонент?

Да. Они его спёрли то ли у Rz то ли у джедаев.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852474
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovДа. Они его спёрли то ли у Rz то ли у джедаев.

Нууу... так можно договориться о черт знает чем...

Всем спасибо за обсуждение и предложенные решения!
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852516
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот не могу в моск взять, какие могут быть проблемы с определением подлежащего или порождающего контрола.

Есть курсор. Всегда можно узнать, над чем он находится.
Например, в treeview на какой-то ветке вызывается попап. Всегда можно заюзать NodeAT.
А тривиальные способы описаны в учебниках.
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852518
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему так ?
Код: pascal
1.
2.
P := PopupMenu1.PopupPoint;
Dec(P.Y,10)


Здесь в PopupPoint попадают координаты выпадения меню. Экспериментально (возможно из-за того, что у меня картинки больше ButtonEdit) меню появляется чуть ниже компонента и по координатам PopupMenu1.PopupPoint функция ControlAtPos ничего не находит. Поэтому я немного сдвинул координату вверх
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TEditButton.TGlyph.WndProc(var Message: TMessage);
var
  LPoint: TPoint;
begin
...
    WM_LBUTTONDOWN:
      if FButton.FDropDownMenu <> nil then
      begin
        if not (csDesigning in Parent.ComponentState) then
        begin
          LPoint := ClientToScreen(Point(0, FButton.EditControl.Height));  
          FButton.FDropDownMenu.Popup(LPoint.X, LPoint.Y);
        end;
      end
...
end;
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852522
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatorЕсть курсор. Всегда можно узнать, над чем он находится.
Например, в treeview на какой-то ветке вызывается попап. Всегда можно заюзать NodeAT.


А ещё есть комбинации клавиш на клавиатуре, которые или имитируют нажатие правой кнопки мыши на активном контроле (а не под курсором) или вообще вызывают всплывающее меню без нажатия кнопок мыши - например пробел для кнопок с DropDownMenu по-умолчанию. Но зачем нам учитывать такие случаи, они ведь не случатся никогда-никогда, а если и случатся то пользователь сам дурак, верно? :)
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852542
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OnContextPopup?
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852608
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp> ... без нажатия кнопок мыши - например пробел ...

А какая разница? На форме всегда есть что-то активное. Допустим, на мемо вертикально расположен алфавит.
И ты ползаешь стрелками по нему, как на лифте, вверх/вниз.
И ты всегда знаешь, на какой строке ты находишься (по её индексу, например)
Жмакай хоть пробел, хоть [Alt]+?
Так что точка показа попапменю всегда под контролем.
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852647
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatorЕсть курсор. Всегда можно узнать, над чем он находится.

Вот только "над чем он находится сейчас" и "над чем он находился в момент клика" это две
большие разницы. Две типичные ошибки новичка складываются и в результате программы при
кислородном процессорном голодании ведут себя совершенно сумасшедшим образом.

Не надо так делать. А если и приспичило, координаты надо брать не текущие, а те, что
пришли в сообщении WM_LBUTTONDOWN.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852683
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, абсолютно согласен. Я к тому, что позицию попапа можно всегда вычислить.
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852684
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYingтак можно договориться о черт знает чем...

О том, что в VCL внезапно есть баги? Да, в ней туева прорва багов. Если этот - первый на
которого ты нарвался, то ты либо нуб, либо везунчик. Теперь придётся пересматривать своё
мировоззрение и архитектуру программы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852703
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatorЯ к тому, что позицию попапа можно всегда вычислить.

Но это не поможет аффтару с его задачей связать попап с конкретным компонентом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как узнать на каком контроле кликнут элемент попапменю?
    #39852714
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Так компонента может не быть вовсе.
афтар, скорее всего имеет в виду "элемент графического интерфейса".
В конце концов. у компонентов есть их координаты на известна точка клика. Что ещё надо?
...
Рейтинг: 0 / 0
25 сообщений из 46, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как узнать на каком контроле кликнут элемент попапменю?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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