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=0) then 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
Martok: Code- durch Delphi-Tags ersetztModeriert von
Narses: Beiträge zusammengefasstNachtrag:
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
baka0815 hat folgendes geschrieben : |
| 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
bummi hat folgendes geschrieben : |
| 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
Gerhard_S hat folgendes geschrieben : |
bummi hat folgendes geschrieben : | | 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!