Как узнать на каком контроле кликнут элемент попапменю?

LiYing
Дата: 21.08.2019 16:36:44
На форме несколько ButtonedEdit, RightButton.DropDownMenu каждого эдита связан с одним и тем же PopupMenu с несколькими MenuItem.
Как узнать на кнопке какого эдита был кликнут пункт меню?
Пробовал так:
procedure TForm1.mni1Click(Sender: TObject);
begin
  ShowMessage(PopupMenu1.PopupComponent.Name); // Здесь AV, т.к. PopupMenu1.PopupComponent = nil
end;
Dimitry Sibiryakov
Дата: 21.08.2019 16:40:23

LiYing
Как узнать на кнопке какого эдита был кликнут пункт меню?

А как ты это меню открываешь?
F1
Set 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

LiYing
Дата: 21.08.2019 16:45:32
Dimitry Sibiryakov,

т.е. помимо связи RightButton.DropDownMenu эдита с PopupMenu, нужно еще и св-во PopupMenu самого эдита связать с этим же попапом?
LiYing
Дата: 21.08.2019 16:51:32
Так тоже не работает.
"А как ты это меню открываешь?" - клик по правой кнопке ButtonedEdit
kealon(Ruslan)
Дата: 21.08.2019 16:52:24
LiYing,

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

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;
kealon(Ruslan)
Дата: 21.08.2019 16:53:21
LiYing,

если у тебя какие-то кастомные компоненты, то весь вопрос к их создателям
LiYing
Дата: 21.08.2019 16:56:17
kealon(Ruslan)
LiYing,

если у тебя какие-то кастомные компоненты, то весь вопрос к их создателям

Только родные делфовые.
Dimitry Sibiryakov
Дата: 21.08.2019 17:04:23

LiYing
помимо связи RightButton.DropDownMenu эдита с PopupMenu

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

Posted via ActualForum NNTP Server 1.5

alekcvp
Дата: 21.08.2019 17:28:17
LiYing,

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 амба зачем-то засунула в приватную секцию этого класса, т.е. даже в наследнике до неё не добраться...
alekcvp
Дата: 21.08.2019 17:31:11
LiYing,

Как вариант - убрать DropDownMenu, назначить OnClick() и там вручную вызывать PopupMenu с присвоением ей нужного PopupComponent.