Как найти таблицу и ее ячейку, где вызван пункт Popup меню
Модератор: Модераторы
Как найти таблицу и ее ячейку, где вызван пункт Popup меню
На форме несколько StringGrid, к которым привязан один и тот же PopupMenu. Как в процедуре OnClick для MenuItem узнать, на какой таблице и в какой ячейке вызван этот OnClick?
Для этого надо знать, с какого Grid было вызвано PopupItem. А в обработчике OnClick источником является PopupItem, а не Grid.
Можно попробовать задействовать обработчик TPopupMenu.OnPopup.
Что-нибудь вроде
Или назначить всем гридам обработчик OnContextPopup:
Что-нибудь вроде
Код: Выделить всё
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 - компонент, который вызвал меню в данный момент, который вам и сообщит искомый грид.
Совсем забыл про PopupComponent, наверно давно не брал в руки шашек.
Спасибо!
То есть получается такая конструкция в обработчике пункта меню:
А как через MouseToCell получить номер строки и столбца, я не понял.
То есть получается такая конструкция в обработчике пункта меню:
Код: Выделить всё
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 получить номер строки и столбца, я не понял.
Там же выше вроде было
Код: Выделить всё
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;
