如何获取DBGrid单元格的屏幕坐标

Ale*_*hov 5 delphi tdbgrid delphi-6

我想在当前行的特定单元格的右下角显示弹出按钮或花哨的消息(带有彩色背景等).

现在我只想知道如何获取网格坐标:
x = DBGrid.DataSource.DataSet.RecNo
y = DBGrid.Columns [index]

还有TCustomGrid.CellRect,它会做我想要的,但它受到保护,我不想继承和创建另一个组件类.

我能想到的一个疯狂的解决方法是将onDrawColumnCell事件中的TRect-s保存到某个数组中.

所以你怎么看 ?

编辑
如何获取当前行中第二个单元格的屏幕坐标?

Ken*_*ite 8

您可以使用一点点欺骗来获取当前的单元格坐标.:)

允许组件的后代访问祖先类的受保护字段.由于除了获得对受保护CellRect方法的访问权限之外我们不需要做任何事情TDBGrid,因此我们将创建一个内插器(无操作后代),它只允许我们访问该受保护的方法.然后我们可以将其转换TDBGrid为新的后代类,并使用它来访问受保护的方法.我将后代命名THack为前缀,以明确后代的唯一目的是获取访问("hack")祖先类.

// implementation
type
  THackDBGrid=class(TDBGrid);

// Where you need the coordinates
var
  CurrRow: Integer;
  Rect: TRect;
begin
  CurrRow := THackDBGrid(DBGrid1).Row;
  Rect := THackDBGrid(DBGrid1).CellRect(ColIndexYouWant, CurrRow);
  // Rect now contains the screen coordinates you need, or an empty
  // rectangle if there is no cell at the col and row specified.
end;
Run Code Online (Sandbox Code Playgroud)

正如OP在评论中指出的那样,在delphi.about.com上有更详细的说明.

  • 实际上这是最好的解决方案.你可以将`THackDBGrid`更改为`TDBGridAccess`如果它让你压力更小:)铸造`TDrawGrid(DBGrid1).CellRect`也可以工作,但我喜欢这个解决方案,因为`TDrawGrid.CellRect`实现可能会改变(现在它是`结果:=继承CellRect(ACol,ARow)`). (5认同)
  • 如果这回答了你的问题,请问为什么你不接受它是正确的? (2认同)