4

在 Delphi VCL 中,如果我想查看鼠标悬停在 TStringGrid 的哪个单元格(列和行)上,我会使用 MouseToCell。此方法不再在 Delphi (XE2) for FireMonkey 应用程序中使用。有谁知道我如何确定鼠标所在的单元格?OnMouseMove 具有 X 和 Y 值,但这些是屏幕坐标而不是单元格坐标。

非常感谢。

4

2 回答 2

7

实际上有一个MouseToCell方法 in TCustomGrid, StringGrid 下降,但它是私有的。看它的来源,它使用ColumnByPointRowByPoint方法,幸好是公开的。

“列”返回 a TColumn,如果没有列,则返回 nil。“行”返回一个正整数,如果没有行,则返回 -1。此外,第一行不关心行数,它只考虑行高并基于此返回行号,即使没有行也是如此。另外,我应该注意到,网格标题上的行为是错误的。无论如何,示例示例可能如下:

procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Single);
var
  Col: TColumn;
  C, R: Integer;
begin
  Col := StringGrid1.ColumnByPoint(X, Y);
  if Assigned(Col) then
    C := Col.Index
  else
    C := -1;
  R := StringGrid1.RowByPoint(X, Y);

  Caption := Format('Col:%d Row:%d', [C, R]);
end;
于 2013-09-25T01:45:42.763 回答
2

TStringGrid有一个ColumnByPointandRowByPoint方法。

ColumnByPointRowByPoint通过字符串网格的坐标。因此,如果您使用OnMouseOver字符串网格的 ,X 和 Y 参数将已经在字符串网格的坐标中。

以下是如何在字符串网格中显示行和列(基于 0)OnMouseOver

var
  row: Integer;
  col: TColumn;
  colnum: Integer;
begin
  row := StringGrid1.RowByPoint(X, Y);
  col := StringGrid1.ColumnByPoint(X, Y);
  if Assigned(col) then
  begin
    colnum := col.Index;
  end
  else
  begin
    colnum := -1;
  end;
  Label1.Text := IntToStr(row) + ':' + IntToStr(colnum);
end;

请注意,-1当超出行和列的范围时将显示。

于 2013-09-25T01:56:53.460 回答