I am using Delphi 10.1 Berlin to make a Multi-Device application. I have a TStringGrid
in order to list some data from a query.
I also have a popup menu (edit, delete, ...), but in order to edit/delete an item I have to click on a cell using the left mouse button.
Is it possible to "select a row" using only the right button before showing the popup menu?
I tried:
procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbRight then
StringGrid1.Perform(WM_LBUTTONDOWN, 0, MakeLParam(Word(X), Word(Y)));
end;
But it displays an error on mbRight
and on Perform()
.
You can use the following code:
procedure TForm39.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: single);
var
pf: TPointF;
begin
if Button = TMouseButton.mbRight then
begin
with Sender as TStringGrid do
SelectRow(RowByPoint(X, Y));
// Do not use the grids PopupMenu property, it seems it
// prevents this event handler comletely.
// Instead, activate the menu manually here.
pf := ClientToScreen(TPointF.Create(X, Y));
PopupMenu1.Popup(pf.X, pf.Y);
end;
end;
FireMonkey is compiled with Scoped Enumerations enabled, so the problem with the mbRight
button is solved by prefixing the value with its enum type (TMouseButton.mbRight
).