Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Eine Zelle zuviel gefärbt in StringGrid


Gerhard_S - Do 15.12.11 13:30
Titel: Eine Zelle zuviel gefärbt in StringGrid
Hallo,
ich benutze Delphi XE. Um den Kopf (d.h. die Zellen 0,0 und 1,0) eines zweispaltigen Grids einzufärben benutze ich diesen Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TFrame6.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
   if (ARow=0then  
     with StringGrid1 do
     begin
       Canvas.Brush.Color := clRed;
       Canvas.FillRect(Rect);
       Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
     end;
end;

Leider macht Delphi mehr als nötig: Beim Aufruf des Frames mit dem Grid sind die Zellen 0,0 und 1,0 markiert. Wenn ich dann mit der Maus eine Zelle in Spalte 0, Zeile 1 oder Zeile 2 usw. markiere, wird auch sie rot eingefärbt. Klicke ich danach auf eine andere Zelle, geht die rote Markierung der vorher roten Zelle endgültig weg.
Hier die Eigenschaften des Grids in der dfm-Datei:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
object StringGrid1: TStringGrid
    Left = 24
    Top = 352
    Width = 529
    Height = 153
    Color = clWhite
    ColCount = 2
    DefaultRowHeight = 19
    FixedColor = clDefault
    FixedCols = 0
    RowCount = 8
    FixedRows = 0
    Options = [goHorzLine, goEditing, goRowSelect]
    ScrollBars = ssNone
    TabOrder = 5
    OnDrawCell = StringGrid1DrawCell
  end

Wie kann ich die überflüssige Einfärbung verhindern?

Moderiert von user profile iconMartok: Code- durch Delphi-Tags ersetzt

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Nachtrag:
Das Problem besteht nur, wenn die Anwendung unter Windows 7 gestartet wird. Unter Windows XP tritt es nicht auf; Vista wurde nicht getestet.


bummi - Do 15.12.11 14:23

der Übeltäter scheint goRowSelect zu sein ....


baka0815 - Do 15.12.11 16:38

Du setzt Canvas.Brush.Color := clRed, setzt es danach aber nicht wieder zurück. Ich vermute mal, dass Delphi dann genau diese Einstellung nimmt um die nächste Zeile zu färben?!


bummi - Do 15.12.11 16:50

@baka0815

Du hast recht, wenn man die Farbe zurücksetzt passt es.
Wobei der Fehler interessanterweise nur um Zusammenhang mit gdRowSelect und ((FixedCols=0) oder (FixedRows=0)) auftritt.


baka0815 - Do 15.12.11 16:58

Vermutlich benutzt Delphi/die VCL sonst anderen Code zum Färben der Zellen als zum Füllen der Zeilen.


Gerhard_S - Do 15.12.11 17:49

user profile iconbaka0815 hat folgendes geschrieben Zum zitierten Posting springen:
Du setzt Canvas.Brush.Color := clRed, setzt es danach aber nicht wieder zurück. Ich vermute mal, dass Delphi dann genau diese Einstellung nimmt um die nächste Zeile zu färben?!

Und wo genau machst du das?
Hier:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
 with StringGrid1 do
     begin
       Canvas.Brush.Color := clRed;
       Canvas.FillRect(Rect);
       Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
       Canvas.Brush.Color := clnone;
     end;

bringt es nix. Da kann ich eine beliebige Farbe für Canvas.Brush.Color angeben - es ändert sich nichts.


bummi - Do 15.12.11 18:12

bei mir ging es mit clWhite, aber vielleicht kannst Du ja auch auf das gdRowselect verzichten ...


Gerhard_S - Do 15.12.11 18:28

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
bei mir ging es mit clWhite, aber vielleicht kannst Du ja auch auf das gdRowselect verzichten ...

Weiß hat nichts gebracht, die Zelle bleibt rot; der Verzicht auf gdRowSelect führt zum Verschwinden von Column 0 nach Klick auf Zeile 1.


Gerhard_S - Do 15.12.11 18:33

user profile iconGerhard_S hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
bei mir ging es mit clWhite, aber vielleicht kannst Du ja auch auf das gdRowselect verzichten ...

Weiß hat nichts gebracht, die Zelle bleibt rot; der Verzicht auf gdRowSelect führt zum Verschwinden von Column 0 nach Klick auf Zeile 1.

Ich war zu unaufmerksam: nach dem Setzen der Pinselfarbe auf Weiß muss man natürlich noch das Rechteck füllen.
Danke für die Hilfe. Thema ist gelöst.