Я пытаюсь нарисовать линию под ячейками заголовка TDBGrid, но не могу заставить ее работать. Я делаю это в событии OnDrawColumnCell следующим образом:
Canvas->Pen->Color = TColor(RGB(0, 0, 0));
Canvas->MoveTo(Rect.Left, Rect.Bottom);
Canvas->LineTo(Rect.Right, Rect.Bottom);
Его подпись выглядит так:
void __fastcall TfrmModelDetails::dbGridModelMapDrawColumnCell(TObject *Sender, const TRect &Rect,
int DataCol, TColumn *Column, TGridDrawState State)
Я уверен, что метод вызывается после проверки отладочной информации, но ничего не рисуется. Почему это могло быть?
OnDrawColumnCell
не вызывается для ячеек заголовка. Насколько я вижу в исходном коде TCustomDBGrid
, отрисовка заголовка выполняется внутренней процедурой, которую вы не можете изменить извне. Вероятно, вам нужно создать новый компонент и переопределить DrawCell
, который выполняет всю обработку.
Вы не показали свой полный код для dbGridModelMapDrawColumnCell
... Обязательно назовите DefaultDrawColumnCell
перед ним, а затем нарисуйте свой собственный рисунок.
Кроме того, последняя строка пикселей — Rect.Bottom - 1
. Вы рисуете вне поля зрения.
И, наконец, Canvas
относится только к форме, а не к сетке. Вы должны либо квалифицироваться с помощью экземпляра DBGrid
, который вы используете, либо привести аргумент Sender
к TDBGrid
, чтобы сослаться на его свойство Canvas
.
@KapitaiN Вы не полностью прочитали мой ответ ... Когда строка заголовка рисуется, событие OnDrawColumnCell не вызывается. Процедура рисования жестко закодирована как внутренняя процедура, которую вы можете переопределить и к которой не привязано событие. Таким образом, ваше единственное (IMO) решение состоит в том, чтобы получить новый компонент и переопределить DrawCell, который выполняет всю обработку.
Аааа ок. Я получаю это сейчас. Спасибо!
Спасибо за советы. Приведение Sender к DBGrid помогло отрисовать линии. Однако я пытаюсь нарисовать линию под ячейками заголовка. Я получаю номер строки и использую его, чтобы определить, нужна ли мне эта строка. Проблема в том, что всякий раз, когда я добавляю новую строку в сетку, она считает ее номером строки. 1, даже если он находится в конце сетки. Есть ли другой способ определить, является ли рисуемая линия первой во всей сетке или нет?