Twoje zdarzenie OnDrawCell
ma niestety bardzo mało wspólnego z prawdziwym (normalnym) rysowaniem komórek... Nie wiem dlaczego stosujesz takie kombinacje, jednak nie tędy droga; Sprawdziłem na Lazarusie jak wygląda sprawa i nie jest źle;
Jedyne co trzeba oprogramować, to zdarzenie OnDrawCell
uwzględniając stan danej komórki oraz ewentualnie jej współrzędne po to, by inaczej rysować nagłówki (w moim przykładzie nagłówki wypełniane są innym kolorem, a tekst w nich zawarty jest pogrubiony);
To, co należy zrobić by kontrolka była poprawnie rysowana, to wykorzystać właśnie goRowSelect
- po kliknięciu na daną komórkę zostanie podświetlony cały wiersz, czyli zostaną przemalowane wszystkie komórki danego wiersza z wartością gdSelected
w argumencie aState
; Jedynym minusem tego rozwiązania jest niemożność przejścia strzałką w bok do sąsiedniej komórki - aby to zrobić należy w nią kliknąć i wtedy nastąpi przesunięcie fokusa; Zastanawiam się dlaczego jest to tak rozwiązane (strzałki w górę i w lewo podświetlają poprzedni wiersz, a strzałki w dół i w prawo następny), jednak nie mam pojęcia...
Kod zdarzenia OnDrawCell
:
Kopiuj
procedure TMainForm.sgExampleDrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState);
begin
with TStringGrid(Sender).Canvas do
begin
if (aCol = 0) or (aRow = 0) then
begin
Pen.Color := $00DCE8ED;
Brush.Color := $00DCE8ED;
Font.Style := [fsBold];
end
else
if gdSelected in aState then
begin
Pen.Color := $00C9F4FE;
Brush.Color := $00C9F4FE;
end
else
begin
Pen.Color := $00E1E1E1;
Brush.Color := $00E1E1E1;
end;
Rectangle(aRect);
if gdFocused in aState then
begin
Pen.Color := clRed;
Pen.Style := psDot;
Rectangle(aRect.Left + 1, aRect.Top + 1, aRect.Right - 2, aRect.Bottom - 2);
end;
TextOut(aRect.Left + 4, aRect.Top + 2, TStringGrid(Sender).Cells[aCol, aRow]);
Font.Style := [];
end;
end;
Efekt:

Kod ten działa poprawnie - kolor tekstu w komórkach jest zawsze taki, jaki sam ustawiam (nigdy nie zmienia się na biały) bez względu na to czy się wartość danej komórki edytowało czy nie; Przy rysowaniu tekstu zadbaj o poprawne przycinanie łańcucha w momencie gdy nie zmieści się w danej komórce - należy go odpowiednio przyciąć by nie zasłonił czerwonej ramki fokusa;
Tak więc zapoznaj się z tym kodem i poczytaj o stosowanych metodach klasy TCanvas
; Do posta dołączam projekt zrobiony w Lazarusie (bez exe), w którym to wykorzystałem wyżej podany kod do malowania komórek; Sprawdź dokładnie w jaki sposób ustawiona jest kontrolka sgExample
- zwróć uwagę na niektóre właściwości; Jeśli cokolwiek jest w nim niejasne to pytaj.
TCanvas
i jej metodami, bo każda kontrolka która umożliwia ręczne rysowanie (OwnerDraw
) wykorzystuje właśnie tą (samą) klasę;