Einzelne Zellen in einem StringGrid einfärben in Lazarus / Delphi

Ich habe mich durch einige Foren gelesen, aber immer nur Schnipsel gefunden,
die zwar auch funktionierten, jedoch meistens nicht, wie ich es wollte.

Man kann ein beliebiges Formular anlegen. Z.B. Form1.
Dann in dieser Form ein StringGrid platzieren.
Ich habe dem StringGrid den Namen sg gegeben, da ich nicht gerne soviel schreibe.
Wenn man dann das StringGrid markiert, sieht man im Objektinspektor einen Reiter
„Ereignisse“. In diesem Reiter gibt es das Ereignis „OnDrawCell“. Wenn man dieses
Ereignis markiert und dann auf den Button daneben klickt erhält man dieses Prozedurgerüst.
Dann kann man mit with sagen, dass man nicht immer sg.Canvas schreiben möchte, sondern immer nur die Prozedure und Funktionen hinter sg.Canvas nutzen möchte (z.B.: Brush.Color statt sg.Canvas.Brush.Color).

Nun ist es wichtig zu wissen, dass die Funktion DrawCell automatisch für jede Zelle aufgerufen wird. D.h. für ein Grid mit 3 Spalten und 4 Reihen braucht man keine Schleifen zu bauen, da jede einzelne Zelle die Funktion aufruft. Es ist nur wichtig zu entscheiden, was mit der Zelle geschehen soll oder nicht.

Im Beispiel wird die Zelle Spalte 2 Reihe 1 gelb gefärbt.
Dazu werden ACol und ARow abgefragt. Wie oben gesagt, wird die Funktion von jeder Zelle aufgerufen.
Also wäre es auch möglich einfach nur die IF-Bedingung mit einer Reihe (ARow) zu machen um z.B. mit wenig Aufwand jede 2. Zeile andersfarbig zu gestalten.
Brush.Color gibt die gewünschte Hintergrundfarbe der Zelle an. Dafür wird hier die Konstante clyellow verwendet. Analog dazu gibt es auch clred usw.
Mit FillRect(aRect) wird die Zelle ausgemalt

.
!!! Achtung : Die Farbe übermalt auch den Text (Inhalt der Zelle). !!!

Bei diesem Punkt endeten meist die Tutorial, die ich gefunden habe.
Man hat nun eine toll ausgemalte Zelle, kann nur nichts mehr lesen.
Das ist irgendwie doof.
Mit sg.Cells[ACol, ARow] liest man jetzt den Inhalt der Zelle, die man eben farbig gemacht hat (der noch vorhanden ist, man kann ihn nur nicht mehr sehen) und schreibt (malt) ihn mit der TextOut Funktion wieder an seine Stelle.

Also, hier meine Lösung :

procedure Tfrmverm.sgDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
begin
  with sg.Canvas do begin
       if (ACol=2) and (ARow=1) then begin
       Brush.Color:= clyellow;
       FillRect(aRect);
       TextOut(aRect.Left+2, aRect.Top+2, sg.Cells[ACol, ARow]);
       end;
  end;
end;