Как получить экранные координаты ячейки DBGrid? - PullRequest
5 голосов
/ 20 февраля 2012

Я хочу показать всплывающую кнопку или необычное сообщение (с цветным фоном и т. Д.) Прямо под правым нижним углом определенной ячейки текущей строки.

Пока я только понял, как получить координаты сетки:
x = DBGrid.DataSource.DataSet.RecNo
y = DBGrid.Columns [индекс]

Существует также TCustomGrid.CellRect, который делает то, что я хочу, но он защищен, и я не хочу наследовать и создавать другой класс компонента.

Один безумный обходной путь, о котором я могу подумать, это сохранить TRect-ы в событии onDrawColumnCell в некоторый массив.

Итак, что вы думаете?

EDIT
Как получить координаты экрана, скажем, второй ячейки в текущей строке?

1 Ответ

7 голосов
/ 20 февраля 2012

Вы можете получить текущие координаты ячейки, используя небольшой обман. :)

Потомкам компонента разрешен доступ к защищенным полям класса предка. Поскольку нам не нужно ничего делать, кроме как получить доступ к защищенному методу CellRect из TDBGrid, мы создадим промежуточный элемент (потомок бездействия), который просто позволяет нам получить доступ к этому защищенному методу. Затем мы можем типизировать TDBGrid к этому новому классу-потомку и использовать его для доступа к защищенному методу. Я называю потомка, используя THack в качестве префикса, чтобы было ясно, что единственная цель потомка - получить доступ («взломать») класс предка.

// 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;

Как указала ОП в комментарии, более подробное описание того, как это работает, можно узнать по адресу delphi.about.com .

...