Autor |
Beitrag |
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Mo 20.10.08 22:07
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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Mo 20.10.08 22:37
Hallo,
mit Fillrect übermalst Du den Text,
also nach Fillrect den Text mit TextOut oder DrawText ausgeben/zeichnen.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Boldar 
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: 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
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: 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 
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: 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
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: 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  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]))); |
Boldar hat folgendes geschrieben : |
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?? |
Warum sollte cText vorher initialisiert werden? Es bekommt seinen Wert in Zeile 7 zugewiesen bevor mit ihr gearbeitet wird!
LG Mario
|
|
Boldar 
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Di 21.10.08 21:36
Ach mist, tippfehler...
Ich meine ob warum man nicht direkt
Delphi-Quelltext
nehmen kann??
|
|
Hobby-Programmierer
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: Di 21.10.08 21:42
Ähm, wo? 
|
|
Boldar 
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: 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
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: 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 
|
|
Boldar 
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Di 21.10.08 22:00
|
|
Hobby-Programmierer
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: Di 21.10.08 22:04
|
|
|