Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Ondrawcell überschreibt Text


SoulJ03R - Mo 01.01.07 19:19
Titel: Ondrawcell überschreibt Text
Hallo zusammen!

Ich soll für die Schule einen Kalender programmieren und ich möchte gerne den aktuellen Tag des Monats in meinem Stringgrid makieren. Dies habe ich mit ondrawcell hinbekommen. Leider überschreibt die Farbe in der Zelle meine Zahl. Könnte mir jemand helfen dieses Problem in den Griff zu bekommen??

MfG SoulJ03R


Keldorn - Mo 01.01.07 19:40

Hallo,
wie sieht denn deine Lösung bis jetzt aus?

Mfg Frank


Reinhard Kern - Mo 01.01.07 20:34
Titel: Re: Ondrawcell überschreibt Text
user profile iconSoulJ03R hat folgendes geschrieben:
Hallo zusammen!

Ich soll für die Schule einen Kalender programmieren und ich möchte gerne den aktuellen Tag des Monats in meinem Stringgrid makieren. Dies habe ich mit ondrawcell hinbekommen. Leider überschreibt die Farbe in der Zelle meine Zahl. Könnte mir jemand helfen dieses Problem in den Griff zu bekommen??

MfG SoulJ03R


Hallo,
wenn du die Hilfe genau liest, stellst du fest: 1. OnDrawCell ist keine Methode von TStringGrid, sondern von TCustomDrawGrid, wo es die eigentliche Zeichenroutine ist, und 2. es kommt, nachdem TStringGrid das Feld schon gezeichnet hat. Das ist also "by Design". Man kann aber als Workaround so arbeiten, das Flackern sieht man kaum, aber du musst eben den Text in OnDrawCell noch einmal ausgeben, weil du den Feldinhalt beim Einfärben gelöscht hast. Immerhin kannst du den bei der Gelegenheit auch gleich ändern in Font, Grösse oder Farbe.

Gruss Reinhard


SoulJ03R - Mo 01.01.07 21:19

Hallo... und danke für eure Antworten. Bisher sah der Teil in meinem Programm so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.gridDrawCell(Sender: TObject; Col, Row: Integer;
  Rect: TRect; State: TGridDrawState);
begin
   if (Col=2and (Row=3then    // Koordinaten sind nur probeweise eingesetzt
   begin
   Grid.Canvas.Brush.Color := clblue;
   Grid.Canvas.FillRect(Rect);
   end;
end;


... ich habe schon einige Sachen ausprobiert, um die Zahl wieder in die Zelle zu schreiben. Dies war auch eigentlich mein Problem. Wenn ich
"Grid.cells[2,3]:='z.b 22';" in diese Prozedur einfüge tritt auf jeden Fall ein sehr starkes Flackern auf. Ich weiß leider nicht, wie ich ansonsten die Zahl wieder einfügen kann.

Moderiert von user profile iconjasocul: Delphi-Tags hinzugefügt


Keldorn - Mo 01.01.07 21:57

Hallo. da fehlt halt die textausgabe, wie oben beschrieben. Du malst nur den Hintergrund und keinen Text. Der zellinhlat ist trotzdem noch da.

nach dem Hintergrund

Delphi-Quelltext
1:
grid.canvas.textout(rect.left+2,rect.top+2,grid.cells[acol,arow]);                    

gugg mal hier im Forum nach ondrawcell, da findest du auch einige Bsp, insbesondere, wie du den state auswertest (Zelle ist gerade ausgewählt usw).

Dein setzten des Zelltextes führt deshalb zum flackern, weil das setzen des Zelltextes wieder ein neuzeichnen der Zelle erfordert und du landest wieder im ondrwacell und wieder und wieder, das ist eine endlosschleife.

Mfg Frank


SoulJ03R - Mo 01.01.07 22:11

Jetzt funktioniert es. Vielen Dank!!!

MfG SoulJ03R