0

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().

Remy Lebeau
  • 555,201
  • 31
  • 458
  • 770
Rube
  • 105
  • 3
  • 11

1 Answers1

3

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).

Remy Lebeau
  • 555,201
  • 31
  • 458
  • 770
Tom Brunberg
  • 20,312
  • 8
  • 37
  • 54