Mein bisheriges OnDrawCellEvent (Der Umweg über "sg", da ich mehrere Stringgrids hab, die ich gleich Formatieren möchte):
Delphi-Quellcode:
sg := TStringGrid (Sender);
if (((((ARow+1) mod 2 <> 0) And (ARow<>0) AND (ACol<>0))) OR (((ACol+1) mod 2 <> 0) And (ACol<>0) AND (ARow<>0))) then
begin //Färbe jede zweite Zelle zur Übersicht ein (Außer die Erste Spalte/Reihe)
sg.canvas.brush.color := cl3DLight;
sg.canvas.FillRect(Rect);
end;
if ((ARow>=sg.Selection.Top) AND (Arow<=Sg.Selection.Bottom) AND (ACol>=sg.Selection.Left) AND (ACol<=Sg.Selection.Right)) then
Begin //Färbt die makierten Felder
sg.canvas.brush.color := $FACE87;
sg.canvas.FillRect(Rect);
End;
if ((Arow=sg.Row) ANd (ACol=sg.Col)) then
Begin //Färbt das selektierte Feld
sg.canvas.brush.color := $0045FF;
sg.canvas.FillRect(Rect);
End;
Wenn ich ein Feld mit Text(z.B. "TEST" oder "111222333") selektiere verschwindet der Text, da er von dem OnDrawCell-Event übermalt wird. Sobald ich die Selektion aufhebe ist der Text aber wieder sichtbar, der Inhalt geht also nicht verloren, wird nur überzeichnet.
Der Inhalt der Felder kann je nachdem sowohl vom Nutzer als auch vom Programm selbst verändert werden.
Ich schätze mal, ich verstehe nicht ganz richtig, was du mit "Alles was dort erscheinen soll..." meinst, aber einen ähnlichen Gedanken hatte ich auch schon, daher stand probehalber mal
Delphi-Quellcode:
for X:=0 To Sg.ColCount do
Begin
for Y:=0 To Sg.RowCount do
Begin
if Sg.Cells[X,Y]<>'' then sg.Cells[X,Y]:=sg.Cells[x,Y];
End;
End;
am Ende des Events, da ich mir erhofft hatte, durch die "Änderung" des Inhalts würde der Text nocheinmal neu (-> Über die Farbe) geschriben. Es führt aber nur dazu, dass die gesamte Tabellendarstellung flimmert (Wahrscheinlich, da dadurch dasselbe Event immer wieder aufgerufen wird).