Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi stringGrid, einzelne Zelle neu zeichnen (https://www.delphipraxis.net/30860-stringgrid-einzelne-zelle-neu-zeichnen.html)

Tigger 30. Sep 2004 11:23


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

ibp 30. Sep 2004 11:47

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;

Tigger 30. Sep 2004 12:15

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

shmia 30. Sep 2004 12:51

Re: stringGrid, einzelne Zelle neu zeichnen
 
Zitat:

Zitat von Tigger
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?

Darum brauchst (und sollst) du dich nicht kümmern. :cyclops:
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 !!!

Tigger 30. Sep 2004 15:13

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

grayfox 30. Sep 2004 15:23

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

Tigger 1. Okt 2004 12:12

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.

Tigger 2. Okt 2004 23:56

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...

Tigger 3. Okt 2004 01:35

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.

grayfox 3. Okt 2004 21:52

Re: stringGrid, einzelne Zelle neu zeichnen
 
Delphi-Quellcode:
Ich will ja nicht das ganze StringGrid neu zeichnen lassen, sondern nur die geänderten Zellen.
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

mfg, stefan

grayfox 3. Okt 2004 22:01

Re: stringGrid, einzelne Zelle neu zeichnen
 
Code:
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...
vermutlich stellst du die farbe nicht zurück, mit der du deine zellen einfärbst und somit wird sie auch für andere zellen übernommen.
probiers mit einer 'case-anweisung' in deiner DrawCell-routine, zb

Delphi-Quellcode:
case Grid.col of
  1,2,3: verwende diese farben
  2,4,6: verwende andere farben
usw....
ohne dazugehörigen quellcode wird die lösung deines problemes zur stecknadelsuche_im_heuhaufen :drunken:

mfg, stefan

Tigger 4. Okt 2004 02:02

Re: stringGrid, einzelne Zelle neu zeichnen
 
Mit dem Quellcode ist das nicht so einfach, da meine unit ca.
600 Zeilen Code umfaßt. Dabei habe ich diverse Routinen, die
Zellen neu belegen und ein Update auslösen, deswegen kann ich
nicht genau eingrenzen, woran es lag.

Wenn ich OnDrawCell mit stringGrid.Update anstoße, werden aber
offensichtlich nur die Zellen neu gezeichnet, die sich auch
tatsächlich geändert haben und nicht alle sichtbaren.

Habe es ähnlich gelöst, wie in deinem Vorschlag. Kann nur leider
nicht mit den Cols arbeiten, da sich immer an anderer Stelle Zeichen
ändern und nur diese andersfarbig werden sollen.

Code:
procedure Tfrm_simulation.sg_simulationDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  //geaendertes Zeichen wird farbig gekennzeichnet
  if flagZeichenAendern then
  with sg_simulation.Canvas do
  begin
      //brush.color:=clfuchsia; //Hintergrundfarbe
      //fillrect(rect); //Hintergrund neu fuellen
      Font.Color := clRed; //Schriftfarbe
      Textout(Rect.Left + 2, Rect.Top + 2, sg_simulation.Cells[ACol, ARow]);
  end; //if
end; OnDrawCell
Wie gesagt, durch ein Umstellen der Zeilen bzw. einzelnen Aufrufe (oder
was auch immer ich sonst jetzt anders mache), erziele ich inzwischen das
gewünschte Ergebnis.

Du brauchst also erstmal nicht weiter nach der Nadel suchen ;).

Gute Nacht, Tigger


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz