Search code examples
delphimouseeventfiremonkeyright-clicktstringgrid

delphi TStringGrid and right mouse button


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


Solution

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