Как найти таблицу и ее ячейку, где вызван пункт Popup меню

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как найти таблицу и ее ячейку, где вызван пункт Popup меню

Сообщение Lifter » 08.07.2021 10:38:05

На форме несколько StringGrid, к которым привязан один и тот же PopupMenu. Как в процедуре OnClick для MenuItem узнать, на какой таблице и в какой ячейке вызван этот OnClick?
Lifter
новенький
 
Сообщения: 21
Зарегистрирован: 19.04.2012 02:17:24

Re: Как найти таблицу и ее ячейку, где вызван пункт Popup ме

Сообщение alexs » 08.07.2021 16:35:53

Grid.MouseToCell()
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Как найти таблицу и ее ячейку, где вызван пункт Popup ме

Сообщение Lifter » 08.07.2021 18:45:45

Для этого надо знать, с какого Grid было вызвано PopupItem. А в обработчике OnClick источником является PopupItem, а не Grid.
Lifter
новенький
 
Сообщения: 21
Зарегистрирован: 19.04.2012 02:17:24

Re: Как найти таблицу и ее ячейку, где вызван пункт Popup ме

Сообщение iskander » 09.07.2021 15:54:19

Можно попробовать задействовать обработчик TPopupMenu.OnPopup.
Что-нибудь вроде
Код: Выделить всё
type
   TPopupCell = record
     Col,
     Row: Integer;
   end;

  TForm1 = class(TForm)
  ...
    procedure PopupMenu1Popup(Sender: TObject);
  private
    LastPopupInvoker: TStringGrid;
    PopupCell: TPopupCell;
  ...
  end;
...
...
procedure TForm1.PopupMenu1Popup(Sender: TObject);
var
  c: TControl;
  p: TPoint;
begin
  c := Application.GetControlAtMouse;
  if not (c is TStringGrid) then begin
    LastPopupInvoker := nil;
    exit;
  end;
  LastPopupInvoker := TStringGrid(c);
  p := LastPopupInvoker.ScreenToClient(PopupMenu1.PopupPoint);
  LastPopupInvoker.MouseToCell(p.X, p.Y, PopupCell.Col, PopupCell.Row);
end;

Или назначить всем гридам обработчик OnContextPopup:
Код: Выделить всё
procedure TForm1.StringGridContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
begin
  Handled := False;
  if not (Sender is TStringGrid) then begin
    LastPopupInvoker := nil;
    exit;
  end;
  LastPopupInvoker := TStringGrid(Sender);
  LastPopupInvoker.MouseToCell(MousePos.X, MousePos.Y, PopupCell.Col, PopupCell.Row);
end;
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Как найти таблицу и ее ячейку, где вызван пункт Popup ме

Сообщение Снег Север » 09.07.2021 20:45:25

Lifter, у PopupMenu есть свойство PopupComponent - компонент, который вызвал меню в данный момент, который вам и сообщит искомый грид.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

Re: Как найти таблицу и ее ячейку, где вызван пункт Popup ме

Сообщение iskander » 09.07.2021 21:30:50

Совсем забыл про PopupComponent, наверно давно не брал в руки шашек.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Как найти таблицу и ее ячейку, где вызван пункт Popup ме

Сообщение Lifter » 13.07.2021 16:28:48

Спасибо!
То есть получается такая конструкция в обработчике пункта меню:
Код: Выделить всё
procedure TForm1.MenuItem1Click(Sender: TObject);
var
  aRow, aCol: integer;
  sg: TStringGrid;
begin
  if (Sender is TMenuItem) and
     (TMenuItem(Sender).GetParentMenu is TPopupMenu) and
     (TPopupMenu(TMenuItem(Sender).GetParentMenu).PopupComponent is TStringGrid) then
  begin
    sg := TStringGrid(TPopupMenu(TMenuItem(Sender).GetParentMenu).PopupComponent);
    aRow := sg.Row;  // это неправильно. А как через MouseToCell получить номер строки и столбца, я не понял
    aCol := sg.Col;
    ...
  end;
end;

А как через MouseToCell получить номер строки и столбца, я не понял.
Lifter
новенький
 
Сообщения: 21
Зарегистрирован: 19.04.2012 02:17:24

Re: Как найти таблицу и ее ячейку, где вызван пункт Popup ме

Сообщение iskander » 13.07.2021 18:26:38

Там же выше вроде было
Код: Выделить всё
procedure TpsForm1.MenuItem1Click(Sender: TObject);
var
  aRow, aCol: integer;
  sg: TStringGrid;
  pm: TPopupMenu;
  p: TPoint;
begin
  if (Sender is TMenuItem) and
     (TMenuItem(Sender).GetParentMenu is TPopupMenu) and
     (TPopupMenu(TMenuItem(Sender).GetParentMenu).PopupComponent is TStringGrid) then
  begin
    pm := TPopupMenu(TMenuItem(Sender).GetParentMenu);
    sg := TStringGrid(pm.PopupComponent);
    p := sg.MouseToCell(sg.ScreenToClient(pm.PopupPoint));
    aCol := p.X;
    aRow := p.Y;
    ...
  end;
end;
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14

Рейтинг@Mail.ru