Когда у вас есть TDBGrid, полный выбор строки и всегда показывать выделение, даже если он не сфокусирован, и вы хотите, чтобы полностью нарисованный владельцем, у вас есть выбор из устаревшего события OnDrawDataCell
и нового события DrawColumnCell
, я выбрал последнее и попробую следующее:
procedure TDbGridTestForm.mygridDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if gdSelected in State then begin
// mygrid.DrawCellHighlight(Rect, State, Col, Row);
mygrid.Canvas.Brush.Color := clHighlight;
mygrid.Canvas.Font.Color := clHighlightText;
mygrid.Canvas.FillRect(Rect);
end;
mygrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
И что меня движет сумасшествие заключается в том, что индикация фокуса (цвет выделения и прямоугольник фокуса) не отрисовывается кодом DefaultDrawColumnCell, и я уверен, что мне следует вызывать DrawCellHighlight вместо того, чтобы выполнять хак FillRect, который я делаю выше.
Если я включаю DefaultDrawing, я получаю один набор сбоев (проблемы с рисованием нечетных шрифтов), а если я его выключаю, я получаю еще один набор сбоев (без выделения, даже когда gdSelected).
Код в DBGrids.pas DefaultDrawColumnCell
не делает ничего, кроме рисования текста. Итак, ясно, что вы должны сделать больше, если возьмете на себя весь код рисования. Однако встроенный в Grids.pas код отрисовки подсветки, от которого зависит DBGrids.pas, не предназначен для вызова из этого контекста. Я не могу понять, следует ли мне напрямую вызывать DrawCellHighlight
(показано закомментировано выше) и вычислять значения Col и Row, или я должен писать свою собственную сложную версию TCustomGrid.DrawCellHighlight, который обрабатывает все различные случаи вручную.
Конечно, это так просто и очевидно, и я просто не замечаю этого. Обратите внимание, что я должен оставить DefaultDrawing выключенным, и поэтому я должен полностью рисовать изнутри моего события рисования владельца, и что я должен иметь возможность запускать, когда службы тем недоступны, и я должен использовать службы тем, когда они доступны. Поэтому мне нужно вызвать TCustomGrid.DrawCellHighlight напрямую (и я не знаю, как это сделать), или мне нужно полностью его реализовать.