![]() |
stringGrid, einzelne Zelle neu zeichnen
Hallo zusammen!
Auch mir geht es darum, den Text in einer einzelnen Zelle einzufärben. Habe hierüber auch schon einiges an Beiträgen gefunden, es ist aber nie erklärt, wie ich für eine einzelne Zelle das OnDrawCell-Ereignis auslösen, also die einzelne Zelle neu zeichnen kann. Oder muß ich jedes Mal das gesamte StringGrid neu zeichnen lassen? Wenn ja, bleiben dabei die Daten in den einzelnen Zellen erhalten oder muß ich diese neu zuweisen? Vielen Dank schonmal, Tigger |
Re: stringGrid, einzelne Zelle neu zeichnen
Hallo Tigger
Delphi-Quellcode:
procedure tform1.stringgrid1drawcell(sender:tobject; acol,arow:integer; rect:trect; state: tgriddrawstate);
begin with stringgrid1.canvas do begin if (acol=5) and (arow=2) then // zeile 2 spalte 5 färben begin brush.color:=clfuchsia; // hintergrundfarbe fillrect(rect); // celle neu zeichnen font.color:=clwhite; // schriftfarbe textout(rect.left+2,rect.top+2, stringgrid1.cells[acol.arow]) end; end; end; |
Re: stringGrid, einzelne Zelle neu zeichnen
Das war nicht ganz die Antwort auf meine Frage, aber ich habe beim
Überlegen jetzt endlich selbst eine Lösung gefunden. Ich setze einfach ein globales Flag, wenn sich der Text in meiner Zelle ändert, Refreshe das StringGrid und frage im OnDrawCell dann eben ab, ob Flag gesetzt. Trotzdem vielen Dank für die schnelle Antwort! Tigger |
Re: stringGrid, einzelne Zelle neu zeichnen
Zitat:
Sobald du den Text einer Zelle veränderst, werden automatisch verändere Zellen neu gezeichnet. Natürlich nur dann, wenn die Zelle sichtbar ist (nicht verdeckt). Wenn du den Inhalt der Zellen nicht ändern möchtest, sondern nur das Einfärbe-Schema verändert hat (z.B. andere Farbe), dann rufst du einfach die Methode [TCustomGrid].InvalidateCell(x,y) auf !!! |
Re: stringGrid, einzelne Zelle neu zeichnen
Jetzt folgendes Problem:
Ich habe eine Routine, in der der Zellinhalt geändert wird. Wenn kein Endzustand erreicht, durchlaufe ich diese Routine mit neuen Parametern. Das OnDrawCell-Ereignis wird aber nicht ausgelöst, wenn die Routine einmal durchlaufen wurde. Das passiert nur, wenn ich in der Routine ein showMessage ausgeben lasse (festgestellt durch Break-Point). Delphi scheint also offensichtlich das gesamte Programm zu durchlaufen und dann erst die Zellen neu zu zeichen. Wie kann ich also nach einmaligem Durchlauf der Routine sicherstellen, daß die Zellen DANN neu gezeichnet werden? Von Delphi verwirrt, Tigger |
Re: stringGrid, einzelne Zelle neu zeichnen
hallo tigger!
ruf nach jedem durchlaufen deiner rechenroutine 'Stringgrid.repaint' auf. damit sollte das stringgrid veranlasst werden, sich neu darzustellen. und zum einfärben reicht die DrawCell-routine, du brauchst keine eigenen flags dafür zu erfinden. mfg, stefan |
Re: stringGrid, einzelne Zelle neu zeichnen
Ich will ja nicht das ganze StringGrid neu zeichnen lassen, sondern nur die geänderten Zellen.
Habe das jetzt mit StringGrid.Update gelöst und funktioniert so, wie ich das brauche. Die Flags brauchte ich nur, damit die Änderung der Farben nicht bei FormCreate schon passiert. Am Anfang also noch alles normal und wenn sich im Programmablauf eine bestimmte Variable ändert, dann Update und im OnDrawCell noch ne if-Abfrage bezüglich des flag. |
Re: stringGrid, einzelne Zelle neu zeichnen/merkw. Phänomen
Wie gesagt hatte ich mein Problem schon mit Update behoben.
Jetzt habe ich es unter ganz bestimmten Voraussetzungen, daß Zellen, die sich gar nicht geändert haben, neu gezeichnet und so fälschlicherweise eingefärbt werden... Kann mir das jemand erklären? Das merkwürdige dabei ist auch, daß ich jeweils am rechten und linken Rand des stringGrids dieselbe Routine aufrufe. Rechts läuft alles richtig, links wie gesagt werden die falschen Zellen erneuert. Ich blicke da nicht mehr durch... |
Re: stringGrid, einzelne Zelle neu zeichnen
Kann mir das Phänomen zwar immer noch nicht erklären, da die Zellen
definitiv nicht angefaßt werden, aber durch Umstellen der Reihenfolge läuft es jetzt wie geplant. |
Re: stringGrid, einzelne Zelle neu zeichnen
Delphi-Quellcode:
in der DrawCell-procedure wird immer der gesamte sichtbare teil eines stringgrids gezeichnet. du kannst einzelne zellen nicht davon ausschliessen, sondern lediglich bestimmen, wie sie dargestellt werden sollen
Ich will ja nicht das ganze StringGrid neu zeichnen lassen, sondern nur die geänderten Zellen.
mfg, stefan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz