Peter, ich danke für deine Anregungen.
Leider liegt die Sache bei einer DBGrid wohl etwas anders.
Eine StringGrid kennt die verwendeten Ereignisse und Methoden nicht.
Bei dem Abbild einer Datenbank ändert sich ja auch nie nur eine einzelne Zelle. Der Record ist dort meist die kleinste sinnvolle Einheit.
StringGrid aktualisiert immer nur die 2 Zellen, die von der Selektionsveränderung betroffen sind.
Entsprechende Methoden (InvalidateRow), um eine Zeile neu zu Zeichnen, sind in der Basisklasse vorhanden. Leider jedoch nur protected.
Da ich bisher ganz ohne eigene (oder fremde) Komponenten auskomme, möchte ich nun auch nicht damit anfangen.
Erfolgreich habe ich nun die primitive Lösung implementiert.
Die das Grid enthaltene Form bekommt zwei Variablen:
Delphi-Quelltext
1: 2:
| OldSelectedRow: longint; NewSelectedRow: longint; |
und in der FormCreate:
Delphi-Quelltext
1: 2:
| OldSelectedRow := 1; NewSelectedRow := 1; |
Das Ereignis OnCellSelect abfangen. Darin implementieren:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Grid := TStringGrid(Sender); if (Row <> NewSelectedRow) then begin OldSelectedRow := NewSelectedRow; NewSelectedRow := Row; for i := Grid.LeftCol to Grid.LeftCol + Grid.VisibleColCount do begin if OldSelectedRow > -1 then Grid.Cells[i, OldSelectedRow] := Grid.Cells[i, OldSelectedRow]; if NewSelectedRow > -1 then Grid.Cells[i, NewSelectedRow] := Grid.Cells[i, NewSelectedRow]; end; |
Nun wird die OnDrawCell für alle Zellen der beiden betroffenen Zeilen gerufen. Dort steht dann:
Delphi-Quelltext
1: 2: 3:
| ... if (gdSelected in AState) then Grid.Canvas.Brush.Color := ColorOfSelectedLineInStringGrid; |
und schon ist die Zeile bunt.
Mit der Neuzuweisung für die Zellen bin ich nicht gerade glücklich.
Aber wie komme ich an die protected InvalidateRow der TCustomGrid ran, ohne die Klasse selbst abzuleiten?
Beste Grüße und viel Schnee!
Optiman