Delphi 在TDBGrid中模拟鼠标单击单元格

Delphi 在TDBGrid中模拟鼠标单击单元格,delphi,dbgrid,tdbgrid,Delphi,Dbgrid,Tdbgrid,如何模拟鼠标点击TDBGrid中的某个单元格?更新: 此代码应该执行您似乎想要的操作: type TMyDBGrid = class(TDBGrid); function TForm1.GetCellRect(ACol, ARow : Integer) : TRect; begin Result := TmyDBGrid(DBGrid1).CellRect(ACol, ARow); end; procedure TForm1.DBGrid1MouseUp(Sender: TObjec

如何模拟鼠标点击TDBGrid中的某个单元格?

更新:

此代码应该执行您似乎想要的操作:

type
  TMyDBGrid = class(TDBGrid);

function TForm1.GetCellRect(ACol, ARow : Integer) : TRect;
begin
  Result := TmyDBGrid(DBGrid1).CellRect(ACol, ARow);
end;

procedure TForm1.DBGrid1MouseUp(Sender: TObject; Button: TMouseButton; Shift:
    TShiftState; X, Y: Integer);
var
  Coords : TGridCoord;    
begin
  Coords := DBGrid1.MouseCoord(X, Y);
  Caption := Format('Col: %d, Row: %d', [Coords.X, Coords.Y]);
end;

procedure TForm1.SimulateClick(ACol, ARow : Integer);
type
  TCoords = packed record
    XPos : SmallInt;
    YPos : SmallInt;
  end;
var
  ARect : TRect;
  Coords : TCoords;
begin
  ARect := GetCellRect(ACol, ARow);
  Coords.XPos := ARect.Left;
  Coords.YPos := ARect.Top;
  DBGrid1.Perform(WM_LButtonUp, 0, Integer(Coords));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SimulateClick(StrToInt(edX.Text), StrToInt(edY.Text));
end;
TDBGrid的MouseCoord函数将一对坐标X,Y转换为列号TGridCoord.X和行号TGridCoord.Y

OnMouseUp事件显示对X&Y输入参数调用DBGrid1.MouseCoord的结果

SimulateClick模拟对网格单元的单击。它使用GetCellRect获取指定单元格左上角的DBGrid中的坐标,然后调用PerformWM_LButtonUp,。。。在DBGrid上,在LParam参数中传递坐标


最后按钮1单击调用模拟单击使用一对TEDIT中的列和行值。这会导致OnMouseUp事件触发并显示列和行号,因此您可以确信它与鼠标单击相应单元格的效果相同。

@RBA:似乎无法回答OP的具体问题?为什么需要模拟单击单元格?如果您知道要操作的行和列,只需编写代码即可。然后,如果希望在实际单击单元格时发生相同的情况,只需在OnCellClick处理程序中调用该代码。或者你不确定该怎么做?@MartynA有时候,当我试图删除一条记录时会出现问题。。但是,当我选择当前行中的某个单元格时,将执行删除操作。。在我看来,当你删除一条记录时,你做了一些错误的事情,现在你想做一些更糟糕的事情来解决它。如果这与你在这个q中遇到的问题有关,你最好找到问题的根源并加以解决。顺便说一句,考虑到你所说的,在继续我在回答这个问题之前,试着调用'DBGrid1.PerformWM_LButtonUp,0,0,然后看看你的删除是否继续;在“起来”之前,我得到了我需要的。。选择带有坐标的单元格并将其作为“焦点”。。谢谢@userPro:很高兴你把它整理好了。事实上,我想回到你关于记录删除的问题,看看我们是否能解决这个问题——我会在我的回答中给你一些关于你的问题的建议/疑问。