2017-09-27 94 views
0

我正在使用Delphi 10.1柏林来制作多设备应用程序。我有一个TStringGrid为了列出查询中的一些数据。我也有一个弹出菜单(编辑,删除,...),但为了编辑/删除一个项目,我必须使用鼠标左键单击一个单元格。delphi TStringGrid和鼠标右键

在显示弹出式菜单之前,是否可以仅使用右按钮“选择一行”?

我想:

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; 

但它mbRightPerform()显示错误。

+0

我看到你还添加了“multidevice application”。请为FMX应用程序添加一个'firemonkey'标签。 –

+0

你是如何添加“OnMouseDown”事件的? FMX'TStringGrid'不公开此类事件。 –

+0

[单程](https://pastebin.com/BbTG6pAB)。 – Victoria

回答

2

您可以使用下面的代码:

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编译启用Scoped Enumerations,所以用mbRight按钮的问题是与它的枚举类型(TMouseButton.mbRight)前缀值来解决。

+0

哇!有用! 我修改了PopupMenu1.Popup(pf.X,pf.Y);到PopupMenu1.Popup(pf.X,pf.Y + 70);为了在鼠标光标附近有弹出菜单! 谢谢@Rom – Rube

+0

非常感谢@Rube,很高兴我能帮上忙。 –