在 Delphi VCL 中,如果我想查看鼠标悬停在 TStringGrid 的哪个单元格(列和行)上,我会使用 MouseToCell。此方法不再在 Delphi (XE2) for FireMonkey 应用程序中使用。有谁知道我如何确定鼠标所在的单元格?OnMouseMove 具有 X 和 Y 值,但这些是屏幕坐标而不是单元格坐标。
非常感谢。
在 Delphi VCL 中,如果我想查看鼠标悬停在 TStringGrid 的哪个单元格(列和行)上,我会使用 MouseToCell。此方法不再在 Delphi (XE2) for FireMonkey 应用程序中使用。有谁知道我如何确定鼠标所在的单元格?OnMouseMove 具有 X 和 Y 值,但这些是屏幕坐标而不是单元格坐标。
非常感谢。
实际上有一个MouseToCell
方法 in TCustomGrid
, StringGrid 下降,但它是私有的。看它的来源,它使用ColumnByPoint
和RowByPoint
方法,幸好是公开的。
“列”返回 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;
TStringGrid
有一个ColumnByPoint
andRowByPoint
方法。
ColumnByPoint
并RowByPoint
通过字符串网格的坐标。因此,如果您使用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
当超出行和列的范围时将显示。