Schriftfarbe für bestimmte Zellen ändern im StringGrid

Rund um die LCL und andere Komponenten
Antworten
RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Schriftfarbe für bestimmte Zellen ändern im StringGrid

Beitrag von RSE »

Hallo!

Neues Projekt, neue Probleme: Wenn ich folgende Prozedur benutze, dann ergibt das eine unendliche Schleife.

Code: Alles auswählen

procedure TFMain.StringGridDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
begin
  if aRow mod 2 = 0 then
    StringGrid.Font.Color := clRed
  else
    StringGrid.Font.Color := clWindowText;
end;
Prinzipiell funktioniert das wie gedacht, aber offenbar merkt sich die LCL, dass Font.Color neu gesetzt wurde, und zeichnet nach dem Zeichnen immer wieder neu. Falls es sich dabei um ein bereits geändertes Verhalten handelt (benutze Version 0.9.25 vom 16.3.08), dann bitte ich um einen Hinweis darauf, dann hat sich die Sache natürlich erledigt. Ansonsten: Wie zeichnet man bestimmte Zellen (Zeilen) andersfarbig?
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Schriftfarbe für bestimmte Zellen ändern im StringGrid

Beitrag von Hitman »

Ansich sollte das die Color Property zwar selbst machen, aber als Workaround könntest Du ja einfach prüfen, ob die Farbe überhaupt geändert werden muss. (if StringGrid.Font.Color clRed then StringGrid.Font.Color := clRed; etc. pp)

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Schriftfarbe für bestimmte Zellen ändern im StringGrid

Beitrag von RSE »

Da ich ein paar bestimmte Zeilen in einer anderen Farbe darstellen will, muss Font.Color irgendwann gesetzt werden. Das blöde ist, dass beim Setzen von Font.Color Font.OnChange ausgelöst wird. Font.OnChange wird in TControl die Methode FontChanged zugewiesen. TWinControl.FontChanged ruft dann Invalidate auf, was zu einem kompletten Neuzeichnen führt. Theoretisch könnte ich also TStringGrid ableiten und FontChanged überschreiben. Dann müsste ich allerdings 1. die komplette Funktionalität dieser bereits vielfach überschriebenen Methode neu implementieren und 2. die Komponente zur Laufzeit erzeugen oder neu registrieren. Das will ich aber alles nicht, es muss auch einen einfacheren Weg geben.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Schriftfarbe für bestimmte Zellen ändern im StringGrid

Beitrag von Hitman »

Naja gibt es ja auch - wie ich sagte: anstatt einfach blind die Farbe neu zu setzen, prüfst du vorher, ob sie überhaupt gesetzt werden muss. So wird nur noch höchstens ein Neuzeichnen ausgelöst.

Oder Plan B: Anstatt einem StringGrid nimmst du ein DrawGrid und zeichnest gleich jede Zelle selbst.

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Schriftfarbe für bestimmte Zellen ändern im StringGrid

Beitrag von RSE »

Du verstehst mich falsch, es wird nicht blos noch ein zusätzliches Neuzeichnen ausgelöst, sondern jedes weitere Neuzeichnen löst ja auch wieder ein Neuzeichnen aus, so dass eine unendliche Schleife entsteht!

Plan B wäre unter Umständen eine Lösung, muss ich mir mal anschauen. Wollt ja eigentlich bei diesem Projekt nicht so viel selbermachen...
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Schriftfarbe für bestimmte Zellen ändern im StringGrid

Beitrag von Hitman »

Ein "StringGrid" über ein DrawGrid zu realisieren, ist dank der Funktion DrawText (aus LCLIntf) eigentlich kein Problem. Doku zu der Funktion findest du im MSDN, da sie der entsprechenden WinAPI Funktion nachempfunden wurde. Für einfache Fälle reicht ggf. auch Canvas.TextOut.

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Schriftfarbe für bestimmte Zellen ändern im StringGrid

Beitrag von RSE »

Ja, scheint ganz vernünftig realisierbar zu sein, bin am Umbauen. Mal sehen was mich erwartet, ich melde mich in jedem Fall wieder ;-)
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Schriftfarbe für bestimmte Zellen ändern im StringGrid

Beitrag von RSE »

OK, Plan B wird umgesetzt ;-) Danke!

Andere Frage: Ich hab nicht die neueste Version (0.9.25 vom 16.3.08), und bei mir klappt das Zeichnen mit Canvas.TextRect auf den Fixed Cells nicht, wenn ich TitleStyle auf tsNative habe. Falls du eine aktuelle Version hast, wärst du so nett und würdest ausprobieren, ob das inzwischen behoben ist? Wenn nicht, dann werd ich einen Bugreport unter Angabe deiner aktuellen Version absetzen.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Schriftfarbe für bestimmte Zellen ändern im StringGrid

Beitrag von Christian »

RSE hat geschrieben:Du verstehst mich falsch, es wird nicht blos noch ein zusätzliches Neuzeichnen ausgelöst, sondern jedes weitere Neuzeichnen löst ja auch wieder ein Neuzeichnen aus, so dass eine unendliche Schleife entsteht!
nein du verstehst ihn falsch :)

Also:

Beim ersten durchlauf setzt du Color damit wird ein neuzeichnen ausgelöst.
Beim 2. Durchlauf prüfst du vor dem Setzen ob die farbe schon die richtige ist da dies so ist setzt du die Farbe nicht wieder und kein neuzeichnen wird mehr ausgelöst...

So:

Code: Alles auswählen

procedure TFMain.StringGridDrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
var
  NewColor : TColor;
begin
  if aRow mod 2 = 0 then
    NewColor := clRed
  else
    NewColor := clWindowText;
  if StringGrid.Font.Color <> NewColor then
    StringGrid.Font.Color := NewColor;
end;
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Schriftfarbe für bestimmte Zellen ändern im StringGrid

Beitrag von RSE »

Denkfehler!

StringGridDrawCell wird für jede Zelle aufgerufen. StringGrid.Font.Color gibt´s nur 1x für das ganze StringGrid. Wenn ich also in der ersten Zeile auf clWindowText schalte und in der 2. auf clRed zurückschalte, dann schalte ich beim 2. Neuzeichnen in der ersten Zeile ja doch wieder auf clWindowText zurück. Wahrscheinlich hast du Zeile 7 übersehen. Da also bei jedem Neuzeichnen StringGrid.Font.Color gesetzt wird, ergibt sich eine Endlosschleife.

Aber es ist jetzt sowieso egal, da ich das Problem umgangen habe. Ich benutze TDrawGrid statt TStringGrid.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Schriftfarbe für bestimmte Zellen ändern im StringGrid

Beitrag von Christian »

In dem Fall ists tatsäclich sicher die ganze zelle selbst zu zeichnen und die Font.Color in ruhe zu lassen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Schriftfarbe für bestimmte Zellen ändern im StringGrid

Beitrag von RSE »

Andere Frage: Ich hab nicht die neueste Version (0.9.25 vom 16.3.08), und bei mir klappt das Zeichnen mit Canvas.TextRect auf den Fixed Cells nicht, wenn ich TitleStyle auf tsNative habe. ... werd ich einen Bugreport ... absetzen.
Ich hab inzwischen gemerkt, was es mit tsNative auf sich hat: Das ist kein Bug, sondern die Aktivierung der Eigenschaft Columns.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Schriftfarbe für bestimmte Zellen ändern im StringGrid

Beitrag von af0815 »

In der neuen ToolBox 5/2008 überflogen, da ist ein Artikel zu den Grids drinnen.

Bezüglich deines Problems mit den farbigen Zeilen, habe ich dort auch die Eigenschaft "alternatecolor " gefunden. Wir diese verwendet so wird jede 2. Zeile mit der Farbe gezeichnet.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Schriftfarbe für bestimmte Zellen ändern im StringGrid

Beitrag von Christian »

Sieht man auch wenn man mal in den Objektinspector schaut ;)
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Schriftfarbe für bestimmte Zellen ändern im StringGrid

Beitrag von RSE »

Das mit dem mod 2 war auch nur ein Test. Ich brauche ein paar bestimmte Zeilen andersfarbig und nicht jede 2. ;-) Inzwischen hab ich´s längst mit DrawGrid umgesetzt.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Antworten