我想在当前行的特定单元格的右下角显示弹出按钮或花哨的消息(带有彩色背景等)。
现在我只想知道如何获得网格坐标:
x = DBGrid.DataSource.DataSet.RecNo
y = DBGrid.Columns [index]
还有TCustomGrid.CellRect,它可以做我想要的,但它受到保护,我不想继承并创建另一个组件类。
我能想到的一个疯狂的解决方法是将onDrawColumnCell事件中的TRect-s保存到某个数组。
那么,您怎么看?
修改
如何获取当前行中第二个单元格的屏幕坐标?
答案 0 :(得分:7)
您可以使用一点点欺骗来获取当前的单元格坐标。 :)
允许组件的后代访问祖先类的受保护字段。由于我们不需要做任何事情,除了获得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处有更详细的说明。