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

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

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

Ответить
Lifter
новенький
Сообщения: 21
Зарегистрирован: 19.04.2012 02:17:24

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

Сообщение Lifter »

На форме несколько StringGrid, к которым привязан один и тот же PopupMenu. Как в процедуре OnClick для MenuItem узнать, на какой таблице и в какой ячейке вызван этот OnClick?
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Grid.MouseToCell()
Lifter
новенький
Сообщения: 21
Зарегистрирован: 19.04.2012 02:17:24

Сообщение Lifter »

Для этого надо знать, с какого Grid было вызвано PopupItem. А в обработчике OnClick источником является PopupItem, а не Grid.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Можно попробовать задействовать обработчик 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;
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Lifter, у PopupMenu есть свойство PopupComponent - компонент, который вызвал меню в данный момент, который вам и сообщит искомый грид.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

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

Сообщение Lifter »

Спасибо!
То есть получается такая конструкция в обработчике пункта меню:

Код: Выделить всё

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 получить номер строки и столбца, я не понял.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Там же выше вроде было

Код: Выделить всё

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;
Ответить