Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как узнать на каком контроле кликнут элемент попапменю?  [new]
LiYing
Member

Откуда:
Сообщений: 515
На форме несколько ButtonedEdit, RightButton.DropDownMenu каждого эдита связан с одним и тем же PopupMenu с несколькими MenuItem.
Как узнать на кнопке какого эдита был кликнут пункт меню?
Пробовал так:
procedure TForm1.mni1Click(Sender: TObject);
begin
  ShowMessage(PopupMenu1.PopupComponent.Name); // Здесь AV, т.к. PopupMenu1.PopupComponent = nil
end;
21 авг 19, 16:36    [21954611]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48155

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

21 авг 19, 16:40    [21954616]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
LiYing
Member

Откуда:
Сообщений: 515
Dimitry Sibiryakov,

т.е. помимо связи RightButton.DropDownMenu эдита с PopupMenu, нужно еще и св-во PopupMenu самого эдита связать с этим же попапом?
21 авг 19, 16:45    [21954624]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
LiYing
Member

Откуда:
Сообщений: 515
Так тоже не работает.
"А как ты это меню открываешь?" - клик по правой кнопке ButtonedEdit
21 авг 19, 16:51    [21954633]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5108
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;
21 авг 19, 16:52    [21954634]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5108
LiYing,

если у тебя какие-то кастомные компоненты, то весь вопрос к их создателям
21 авг 19, 16:53    [21954636]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
LiYing
Member

Откуда:
Сообщений: 515
kealon(Ruslan)
LiYing,

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

Только родные делфовые.
21 авг 19, 16:56    [21954641]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48155

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

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

Posted via ActualForum NNTP Server 1.5

21 авг 19, 17:04    [21954650]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
alekcvp
Member

Откуда:
Сообщений: 1486
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 амба зачем-то засунула в приватную секцию этого класса, т.е. даже в наследнике до неё не добраться...
21 авг 19, 17:28    [21954682]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
alekcvp
Member

Откуда:
Сообщений: 1486
LiYing,

Как вариант - убрать DropDownMenu, назначить OnClick() и там вручную вызывать PopupMenu с присвоением ей нужного PopupComponent.
21 авг 19, 17:31    [21954686]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
LiYing
Member

Откуда:
Сообщений: 515
Dimitry Sibiryakov
LiYing
помимо связи RightButton.DropDownMenu эдита с PopupMenu

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

http://docwiki.embarcadero.com/Libraries/Rio/en/Vcl.ExtCtrls.TButtonedEdit
это левый компонент?
21 авг 19, 20:04    [21954800]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
DimaBr
Member

Откуда:
Сообщений: 11244
Картинка с другого сайта.
21 авг 19, 20:25    [21954819]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
alekcvp
Member

Откуда:
Сообщений: 1486
DimaBr,

А если с клавиатуры откроют? Хотя не факт, что это возможно с этим контролом.
21 авг 19, 20:49    [21954834]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48155

LiYing
это левый компонент?

Да. Они его спёрли то ли у Rz то ли у джедаев.

Posted via ActualForum NNTP Server 1.5

21 авг 19, 21:33    [21954858]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
LiYing
Member

Откуда:
Сообщений: 515
Dimitry Sibiryakov
Да. Они его спёрли то ли у Rz то ли у джедаев.

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

Всем спасибо за обсуждение и предложенные решения!
22 авг 19, 08:06    [21955020]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
Gator
Member

Откуда: Москва
Сообщений: 14934
Вот не могу в моск взять, какие могут быть проблемы с определением подлежащего или порождающего контрола.

Есть курсор. Всегда можно узнать, над чем он находится.
Например, в treeview на какой-то ветке вызывается попап. Всегда можно заюзать NodeAT.
А тривиальные способы описаны в учебниках.
22 авг 19, 09:34    [21955084]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
DimaBr
Member

Откуда:
Сообщений: 11244
Почему так ?
P := PopupMenu1.PopupPoint;
Dec(P.Y,10)

Здесь в PopupPoint попадают координаты выпадения меню. Экспериментально (возможно из-за того, что у меня картинки больше ButtonEdit) меню появляется чуть ниже компонента и по координатам PopupMenu1.PopupPoint функция ControlAtPos ничего не находит. Поэтому я немного сдвинул координату вверх
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;
22 авг 19, 09:38    [21955089]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
alekcvp
Member

Откуда:
Сообщений: 1486
Gator
Есть курсор. Всегда можно узнать, над чем он находится.
Например, в treeview на какой-то ветке вызывается попап. Всегда можно заюзать NodeAT.


А ещё есть комбинации клавиш на клавиатуре, которые или имитируют нажатие правой кнопки мыши на активном контроле (а не под курсором) или вообще вызывают всплывающее меню без нажатия кнопок мыши - например пробел для кнопок с DropDownMenu по-умолчанию. Но зачем нам учитывать такие случаи, они ведь не случатся никогда-никогда, а если и случатся то пользователь сам дурак, верно? :)
22 авг 19, 09:50    [21955097]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
Василий 2
Member

Откуда:
Сообщений: 703
OnContextPopup?
22 авг 19, 10:15    [21955132]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
Gator
Member

Откуда: Москва
Сообщений: 14934
alekcvp> ... без нажатия кнопок мыши - например пробел ...

А какая разница? На форме всегда есть что-то активное. Допустим, на мемо вертикально расположен алфавит.
И ты ползаешь стрелками по нему, как на лифте, вверх/вниз.
И ты всегда знаешь, на какой строке ты находишься (по её индексу, например)
Жмакай хоть пробел, хоть [Alt]+?
Так что точка показа попапменю всегда под контролем.
22 авг 19, 12:06    [21955278]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48155

Gator
Есть курсор. Всегда можно узнать, над чем он находится.

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

Не надо так делать. А если и приспичило, координаты надо брать не текущие, а те, что
пришли в сообщении WM_LBUTTONDOWN.

Posted via ActualForum NNTP Server 1.5

22 авг 19, 12:44    [21955340]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
Gator
Member

Откуда: Москва
Сообщений: 14934
Dimitry Sibiryakov, абсолютно согласен. Я к тому, что позицию попапа можно всегда вычислить.
22 авг 19, 13:20    [21955388]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48155

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

О том, что в VCL внезапно есть баги? Да, в ней туева прорва багов. Если этот - первый на
которого ты нарвался, то ты либо нуб, либо везунчик. Теперь придётся пересматривать своё
мировоззрение и архитектуру программы.

Posted via ActualForum NNTP Server 1.5

22 авг 19, 13:21    [21955389]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48155

Gator
Я к тому, что позицию попапа можно всегда вычислить.

Но это не поможет аффтару с его задачей связать попап с конкретным компонентом.

Posted via ActualForum NNTP Server 1.5

22 авг 19, 13:41    [21955424]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать на каком контроле кликнут элемент попапменю?  [new]
Gator
Member

Откуда: Москва
Сообщений: 14934
Dimitry Sibiryakov,

Так компонента может не быть вовсе.
афтар, скорее всего имеет в виду "элемент графического интерфейса".
В конце концов. у компонентов есть их координаты на известна точка клика. Что ещё надо?
22 авг 19, 13:58    [21955459]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить