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

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

还有TCustomGrid.CellRect,它可以满足我的要求,但是它受到保护,我不想继承并创建另一个组件类。

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

所以你怎么看 ?

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

最佳答案

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

组件的后代可以访问祖先类的受保护字段。由于除了获得对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处有更详细的描述。

10-05 23:51
查看更多