0
votes

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

1
I see that you also added "multidevice application". Please always add a firemonkey tag for FMX applications.Tom Brunberg
How did you add the OnMouseDown event? FMX TStringGrid doesn't expose such event.Tom Brunberg
Yeah @Victoria Still not OnMouseDown:) I was teasing OP on their code which obviously was just copied from the other Q/A. But please enter an answer based on the pastebinTom Brunberg
on formCreate event i wrote StringGrid1.OnMouseDown:=StringGrid1MouseDown;Rube

1 Answers

2
votes

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