Wichtigste Frage: Brauchst du das öfter? Wenn nicht würde ich das mit einem Standard-Grid machen: einfach einen Handler für OnPrepareCanvas schreiben und dort die Farben für die einzelnen Zellen entsprechend setzen. Denn OnPrepareCanvas wird aufgerufen, nachdem das Grid bereits die vordefinierten Farben, Fonts usw. gesetzt hat und bevor die Ausgabe erfolgt; du hast also die Möglichkeiten die Voreinstellungen mit eigenen Wünschen zu überschreiben.
Wenn du trotzdem eine eigene Komponente schreiben willst, dann ist der Ansatz mit dem OnDrawCell falsch. Denn der Anwender deiner Komponente hat nun keine Möglichkeit mehr, seinerseits das onDrawCell-Event zu verwenden. Als Komponentenschreiber hast du aber die Möglichkeit, auf "protected" Methoden zurückzugreifen; darunter findest du in der Regel immer eine Methode, die du überschreiben kannst ohne das Event zu benötigen. Wichtig: die methode muss "virtuell" sein, also den Zusatz "virtual", "override" oder "dynamic" tragen, damit sie zur Laufzeit statt der geerbten aufgerufen wird.
Studiere den Quellcode der Ursprungskomponente, um den richtigen Einsprungpunkt zu finden. Ohne die Komponente verstanden zu haben, wird deine abgeleitete Komponente wahrscheinlich nicht funktionieren.
Wenn du wirklich nur Farben, Fonts usw. verändern möchtest, dann würde ich genau wie oben wieder auf den PrepareCanvas-Zug "aufspringen". Die passende Methode wäre hier DoPrepareCanvas, bei dem alle Standardarbeiten schon erledigt sind und nur noch das Ereignis OnPrepareCanvas aufgerufen wird. Hier kannst du zuerst deine Änderungen vornehmen, und dann "inherited" aufrufen, so dass das Ereignis dem Anwender weiterhin zur Verfügung steht. Etwa so:
Code: Alles auswählen
procedure TExtStringGrid.DoPrepareCanvas(aCol,aRow:Integer; aState: TGridDrawState);
var
cp: TCellProp;
begin
cp := CellPropArray[aCol, aRow];
Canvas.Brush.Color := cp.Color;
Canvas.Font.Color := cp.FontColor; // oder was auch immer...
inherited;
end;
Wiegesagt, diese Methode macht selbst keine Ausgabe, sondern überlässt dies der dem Grid-Vorfahren, der dies gleich anschließend erledigt. Das hat für dich den Vorteil, dass du dich nicht mehr darum kümmern musst, dass der Text richtig positioniert wird, evtl. Checkboxen oder Icons in der Zelle gezeichnet werden uvm.