Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Stringgrid Zellen färben
Boldar - Mo 20.10.08 22:07
Titel: Stringgrid Zellen färben
Ich habe im ondrawcell folgendes, um Zellen zu färben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure Tmain_form.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin with TStringGrid(Sender).Canvas do begin if ((ACol=1) and (ARow>2)) or ((Acol=3) and (Arow>0)) or ((Acol=2) and (Arow=8)) then begin Brush.Color:= rgb (230, 250, 230); FillRect(Rect); end;
end; end; |
Damit Unterdrücke ich Usereingaben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure Tmain_form.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin CanSelect:= not( (((ACol=1) and (ARow=3)))or (((ACol=1) and (ARow=4)))or (((ACol=1) and (ARow=5)))or (((ACol=1) and (ARow=6)))or (((ACol=1) and (ARow=7)))or (((ACol=1) and (ARow=8)))or (((ACol=3) and (ARow=1)))or (((ACol=3) and (ARow=2)))or (((ACol=3) and (ARow=3)))or (((ACol=3) and (ARow=4)))or (((ACol=3) and (ARow=5)))or (((ACol=3) and (ARow=6)))or (((ACol=3) and (ARow=7)))or (((ACol=3) and (ARow=8)))or (((ACol=2) and (ARow=8))));
end; |
Nun möchte ich aber so
Delphi-Quelltext
1: 2: 3: 4:
| for I := 1 to stringgrid1.ColCount - 1 do begin stringgrid1.Cells[3, i]:=floattostr(strtofloatdef(stringgrid1.Cells[2, i], 0) / 12); end; |
auch auf die gefärbten und geschützten Zellen zugreifen; es soll halt nur der User nichts reinschreiben.
Aber das funktioniert nicht. Vermutlich wird im Ondrawcell der Text gleich wieder Übermalt, oder?
Wie geht dass trotzdem (Färben+text)????
Lannes - Mo 20.10.08 22:37
Hallo,
mit Fillrect übermalst Du den Text,
also nach Fillrect den Text mit TextOut oder DrawText ausgeben/zeichnen.
Boldar - Di 21.10.08 14:25
jetzt habe ich das so geändert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure Tmain_form.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin with TStringGrid(Sender).Canvas do begin if ((ACol=1) and (ARow>2)) or ((Acol=3) and (Arow>0)) or ((Acol=2) and (Arow=8)) then begin Brush.Color:= rgb (230, 250, 230); FillRect(Rect); drawtext (stringgrid1.Handle, Pchar(stringgrid1.cells[acol, arow]), length(Pchar(stringgrid1.cells[acol, arow])), rect, dt_singleline or dt_center or dt_vcenter); end;
end; end; |
Der text wird jedoch immer noch nicht angezeigt.
Was mache ich denn jetzt noch falsch??
Hobby-Programmierer - Di 21.10.08 18:18
Tach ...,
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); const cFormat = DT_SINGLELINE or DT_CENTER or DT_VCENTER; var cText: String; begin with (Sender AS TStringGrid) do begin cText:= Cells[ACol, ARow]; if ((ACol=1) and (ARow>2)) or ((Acol=3) and (Arow>0)) or ((Acol=2) and (Arow=8)) then Canvas.Brush.Color:= rgb (230, 250, 230); Canvas.FillRect(Rect); drawtext (Canvas.Handle, Pchar(cText), Length(cText), rect, cFormat); end; end; |
Prinzipiell würde ich auch
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure Tmain_form.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin CanSelect:= not( (((ACol=1) and (ARow=3)))or (((ACol=1) and (ARow=4)))or (((ACol=1) and (ARow=5)))or (((ACol=1) and (ARow=6)))or (((ACol=1) and (ARow=7)))or (((ACol=1) and (ARow=8)))or (((ACol=3) and (ARow=1)))or (((ACol=3) and (ARow=2)))or (((ACol=3) and (ARow=3)))or (((ACol=3) and (ARow=4)))or (((ACol=3) and (ARow=5)))or (((ACol=3) and (ARow=6)))or (((ACol=3) and (ARow=7)))or (((ACol=3) and (ARow=8)))or (((ACol=2) and (ARow=8)))); end; |
aber durch
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin CanSelect:= ((ARow in [1..3]) and (ACol in [2..3])); end; |
ersetzen!
LG Mario
Boldar - Di 21.10.08 20:52
Hobby-Programmierer hat folgendes geschrieben : |
Tach ...,
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin CanSelect:= ((ARow in [1..3]) and (ACol in [2..3])); end; | |
hat aber nicht den gleichen Effekt, denn da wird [1, 8] zb. Nicht verboten...
Hobby-Programmierer hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); const cFormat = DT_SINGLELINE or DT_CENTER or DT_VCENTER; var cText: String; begin with (Sender AS TStringGrid) do begin cText:= Cells[ACol, ARow]; if ((ACol=1) and (ARow>2)) or ((Acol=3) and (Arow>0)) or ((Acol=2) and (Arow=8)) then Canvas.Brush.Color:= rgb (230, 250, 230); Canvas.FillRect(Rect); drawtext (Canvas.Handle, Pchar(cText), Length(cText), rect, cFormat); end; end; | |
Wird ctext denn irgendwo auf '' Gesetzt??
Hobby-Programmierer - Di 21.10.08 21:33
Boldar hat folgendes geschrieben : |
hat aber nicht den gleichen Effekt, denn da wird [1, 8] zb. Nicht verboten... |
Ich wollte damit nur das Prinzip :wink: verdeutlichen wie er das übersichtlicher lösen kann. So sollte es dann passen
Delphi-Quelltext
1: 2: 3:
| CanSelect:= not (((ACol = 1) and (ARow in [3..8])) or ((ACol = 2) and (ARow = 8)) or ((ACol = 3) and (ARow in [1..8]))); |
Warum sollte cText vorher initialisiert werden? Es bekommt seinen Wert in Zeile 7 zugewiesen bevor mit ihr gearbeitet wird!
LG Mario
Boldar - Di 21.10.08 21:36
Ach mist, tippfehler...
Ich meine ob warum man nicht direkt
nehmen kann??
Hobby-Programmierer - Di 21.10.08 21:42
Ähm, wo? :gruebel:
Boldar - Di 21.10.08 21:47
da:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); const cFormat = DT_SINGLELINE or DT_CENTER or DT_VCENTER; var cText: String; begin with (Sender AS TStringGrid) do begin cText:= Cells[ACol, ARow]; if ((ACol=1) and (ARow>2)) or ((Acol=3) and (Arow>0)) or ((Acol=2) and (Arow=8)) then Canvas.Brush.Color:= rgb (230, 250, 230); Canvas.FillRect(Rect); drawtext (Canvas.Handle, Pchar(cText), Length(cText), rect, cFormat); end; end; |
Und ausserdem, fehlt hinter dem if nicht ein begin...end??
Hobby-Programmierer - Di 21.10.08 21:58
Boldar hat folgendes geschrieben : |
da:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); const cFormat = DT_SINGLELINE or DT_CENTER or DT_VCENTER; var cText: String; begin with (Sender AS TStringGrid) do begin cText:= Cells[ACol, ARow]; if ((ACol=1) and (ARow>2)) or ((Acol=3) and (Arow>0)) or ((Acol=2) and (Arow=8)) then Canvas.Brush.Color:= rgb (230, 250, 230); Canvas.FillRect(Rect); drawtext (Canvas.Handle, Pchar(cText), Length(cText), rect, cFormat); end; end; | |
Klaro kannst du cText durch
Cells[ACol,ARow] ersetzen. Jeder wie er mag, ist nicht Programmrelevant sonder eher 'kosmetischer' Natur wegen der Übersichlichkeit.
Zitat: |
Und ausserdem, fehlt hinter dem if nicht ein begin...end?? |
Versuchs macht kluch :wink: :idea:
Boldar - Di 21.10.08 22:00
wo lag denn dann der Fehler?
Achso, canvas.handle
:autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch:
Hobby-Programmierer - Di 21.10.08 22:04
Boldar hat folgendes geschrieben : |
wo lag denn dann der Fehler?
Achso, canvas.handle
:autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: |
Ups :oops:, hatte ich vergessen das zu erwähnen ...
LG Mario
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!