6

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

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

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

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

所以你怎么看 ?

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

4

1 回答 1

9

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

允许组件的后代访问祖先类的受保护字段。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;

正如 OP 在评论中指出的那样,在delphi.about.com上有更详细的描述它是如何工作的。

于 2012-02-20T06:55:18.393 回答