Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Stringgrid alle Zellen färben
Grinarn - So 30.12.07 03:27
Titel: Stringgrid alle Zellen färben
Moin Moin,
ich hoffe ich bin hier im richtigen Forum gelandet.
Ich suche nach einer möglichkeit alle Zellen meines X x Y Stringgrids zu färben. Mit Hilfe der Suche habe ich schonmal herausgefunden das ich dies irgendwie mit dem OnDrawCell Ereignis hinbekomme.
Allerdings ist mir die Realisation noch nicht ganz klar.
Ich habe in meinem Programm ein 2d Array mit byte Werten, die mein Stringgrid nun darstellen soll. Jede Zelle soll nun entsprechend ihres Wertes gefärbt werden. Dazu müsste ich das OnDrawCell Ereignis ja für jede Zelle aufrufen, allerdings habe ich keine Ahnung wie man Ereignisroutinen manuell aufruft. Oder wie sollte man dies sonst hinbekommen? Wie wird OnDrawCell überhaupt ausgelöst? Fragen über Fragen.
Vielleicht kann mich hier ja jmd. erleuchten.
Schöne Grüße
Grinarn
Bernhard Geyer - So 30.12.07 11:38
OnDrawCell wird aufgerufen wenn die Zelle gezeichnet werden muss.
Änderst du den Wert eine Zelle kannst du mit einem Aufruf von invalitate das neuzeichnen veranlassen.
Grinarn - So 30.12.07 14:24
Verursacht dann der aufruf für invalidate für mein Stringgrid, dass alle Zellen neu gezeichnet werden? Oder nur geänderte? Oder muss ich invalidate für jede einzelne Zelle aufrufen, also direkt nachdem ich sie geändert habe?
Grinarn - So 30.12.07 14:53
Also ich hab jetzt mal ein wenig rumgetestet, aber es funktioniert garnicht so wie es sollte.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| for x := 0 to XMax do for y := 0 to YMax do begin if Spielfeld[x,y] > 0 then StrGrdSpiel.Cells[x,y] := IntToStr(Spielfeld[x,y]) else StrGrdSpiel.Cells[x,y] := ''; end; StrGrdSpiel.Invalidate; |
Hier erstelle ich im Moment das Spielfeld. Bisher werden noch Zahlen verwendet. Diese Zahlen sollen nun durch entsprechende Farben ersetzt werden.
Ich habe also das OnDrawCell Ereignis benutzt.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TFrmMain.zelleFaerben(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if StrGrdSpiel.Cells[ACol,ARow] = '1' then begin Canvas.Brush.Color := clRed; Canvas.FillRect(Rect); end; end; |
Testweise erstmal nur für Zellen mit dem Wert 1. Allerdings ist das Ergebnis nun, dass er mir 2 rote Quadrate ca. 1cm über meinem Stringgrid malt. Er malt also nicht in das Stringgrid, sondern irgendwo auf dem Formular.
Jmd. eine Idee wodran das liegen kann?
Jerk - Mo 31.12.07 01:58
Welchen wert haben den ACol und Arow?
Acol sind die spalten und Arow sind die Reihen, nimm doch zwei Zählerschleifen.
Aufruf: Stringgrid1.repaint;
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| Procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer; Rect: TRect; State: TGridDrawState); Var Zeile,Spalte :integer; s : String; Begin With Sender As TStringGrid Do Begin If (aCol < FixedCols) Or (aRow < FixedRows) Then Exit; for Spalte:=1 to SpaltenZahl do begin for Zeile :=1 to ZeilenZahl do begin If (aCol = Cell[1,Zeile]) And (aRow = Cell[2,Spalte]) Then Begin s := Cells[aCol, aRow]; Canvas.Brush.Color := Colorarray[Spalte]; DrawText(Canvas.Handle, PChar(s), Length(s), Rect, DT_LEFT); End; end; end; End; End; |
Cell[1,a] wählt bei mir alle Spalten aus die gewünscht werden und Cell[1,i] alle Zeilen.
Das heisst wenn z.b. nur das einzelne Feld an der stelle 5 / 5 rot werden soll wäre das:
Delphi-Quelltext
1:
| Cell[1,1]:=5; und cell[1,2]:=5; |
Grinarn - Mo 31.12.07 02:00
ACol und ARow sind komischerweise immer 0. Deswegen verstehe ich ja die Funktion nicht wirklich. Normalerweise müssten dort ja die Koordinaten jeder Zelle auftauchen.
Jerk - Mo 31.12.07 02:13
Hab meine Post geändert, probier es mal damit.
*edit*
Nochmal geändert damit es leichter verständlich ist
Grinarn - Mo 31.12.07 02:16
Danke, ich werde das bei Gelegenheit mal testen und berichten :D
jasocul - Mo 31.12.07 10:09
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TFrmMain.zelleFaerben(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if StrGrdSpiel.Cells[ACol,ARow] = '1' then begin Canvas.Brush.Color := clRed; Canvas.FillRect(Rect); end; end; |
Das kann gar nicht funktionieren.
Du zeichnest auf dem Canvas von TFrmMain und nicht auf dem StrGrdSpiel.
Warum nimmst du nicht das OnDrawCell des Grids? Dann hättest du das Problem nicht.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!