Autor Beitrag
Gerhard_S
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Do 15.12.11 12:30 
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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 15.12.11 13:23 
der Übeltäter scheint goRowSelect zu sein ....

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Do 15.12.11 15: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 15.12.11 15: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.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Do 15.12.11 15:58 
Vermutlich benutzt Delphi/die VCL sonst anderen Code zum Färben der Zellen als zum Füllen der Zeilen.
Gerhard_S Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Do 15.12.11 16: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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 15.12.11 17:12 
bei mir ging es mit clWhite, aber vielleicht kannst Du ja auch auf das gdRowselect verzichten ...

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Gerhard_S Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Do 15.12.11 17: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Do 15.12.11 17: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.