Das ist nicht gantz trivial, aber es geht. Aber da gibts einige Tricks mehr. Zunächst mal muss der Stringgrid-Zelleninhalt gesetzt werden. Um eben erst unterscheiden zu können, ob die Box gechecked ist, oder nicht. Dieser Wert wird dann im OnDrawCell ausgewertet und je nach Lage wird zunächst dann ein Rechteck gezeichnet. Dieses Rechteck wird dann eben gecheckt oder nicht.
Delphi-Quellcode:
if ACol
in CheckBoxCols
then begin
// 0 für Unchecked, 1 für checked, 2 für nur anzeigen
if StrToInt (sgArtNr.Cells [ACol,ARow])
in [1,2]
then begin
InflateRect(Rect,-1,-1);
DrawState := ISChecked[StrToInt (sgArtNr.Cells [ACol,ARow]) = 1];
// ^ die 0/1, die aus dem DB-Original in sgArtNr steht beeinflusst, ob die
// CheckBox gecheckt ist ! D.h. sie wird im OnDrawCell je nach Wert gezeichnet !
sgArtNr.Canvas.FillRect(Rect);
// hinter Cells lieg. 0/1/2, aber das soll man nicht sehen
DrawFrameControl(sgArtNr.Canvas.Handle,Rect,DFC_BUTTON,DrawState);
end
else begin // Checkbox nicht anzeigen !!
InflateRect(Rect,-1,-1);
Canvas.FillRect(Rect);
end;
Der Haupttrick ist der, dass die Stringgrid-Zelle tatsächlich nur aus 0/1/2 besteht, aber die Darstellung als CheckBox so geht. Und das wird quasi überschrieben. Aber nicht im Sinne von
OOP, sondern es geht um den Bildschirm, bzw. die StringGrid-Zelle.