Когда у вас есть 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 (и я не знаю, как это сделать), или мне нужно полностью переопределить его.