![]() |
nochmals StringGridDrawcell
Hallo DPler,
ich möchte eine Spalte eines Stringgrids, in Abhängigkeit des Inhaltes färben(rot,grün). Mein Quelltext läßt sich auch fehlerfrei kompilieren, nur seh ich keinen Erfolg. Das Stringgrid welches ich verwende ist Jedi Stringgrid. Die DrawCell Methode habe ich aus diesem Forum. Anbei mein Text.
Delphi-Quellcode:
Ich hoffe auf Hilfe.
procedure TForm1.Button1Click(Sender: TObject);
begin //Lade Datei JvSG1.LoadFromCSV('messwert.txt',#9); //Färbe Spalte 2 Rechnen(Sender); //Spring zur letzten Zeile //JvSG1.Row := JvSG1.RowCount-1; end; Procedure TForm1.Rechnen(Sender: TObject); var i:Integer; k,l:extended; begin For i := 2 to JvSG1.RowCount-1 do k := StrToFloat(JvSG1.Cells[2,i]); l := StrToFloat(JvSG1.Cells[2,i-1]); If k > l then begin JvSG1.Canvas.Brush.Color := clred; DrawCell(Sender,2,i,Rect(0,0,0,0),[gdselected]) ; end; end; procedure TForm1.DrawCell(Sender: TObject; Col, Row: Integer; Rect: TRect; State: TGridDrawState); begin (sender as TStringgrid).canvas.Brush.color:=(sender as TStringgrid).color; (sender as TStringgrid).canvas.Font.color:=clWindowText; if (col<(sender as TStringgrid).fixedCols) or (row<(sender as TStringgrid).fixedRows) then (sender as TStringgrid).canvas.Brush.color:=(sender as TStringgrid).FixedColor //farbe der Header else if gdSelected in state then begin (sender as TStringgrid).canvas.Brush.color:=clHighlight; //farbe von markierung (sender as TStringgrid).canvas.Font.color:=clWindow; end else if integer(JVSG1.objects[col,row])=2 then (sender as TStringgrid).canvas.Brush.color:=clgreen; (sender as TStringgrid).canvas.FillRect(rect); (sender as TStringgrid).canvas.TextOut(rect.left+2,rect.top+2,(sender as TStringgrid).Cells[col,row]); end; |
Re: nochmals StringGridDrawcell
Moin fl63,
ich kann jetzt so nicht sagen warum, habe nur einen kleinen Tip für die Übersichtlichkeit:
Delphi-Quellcode:
Ab dann kannst du mit lGrid und lCV arbeiten anstelle immer (sender as TStringgrid) und (sender as TStringgrid).canvas zu benutzen.
var
lGrid : TStringgrid; lCV : TCanvas; begin lGrid := sender as TStringgrid; lCV := lGrid.canvas; Musst du bei dem Stringgrid irgendwie "OwnerDraw" aktivieren? Stefan |
Re: nochmals StringGridDrawcell
Hallo Mac Guyver
Die DrawCell Methode habe ich wie schon geschrieben aus diesem Forum nur kopiert. In diesem Beitrag wurde ein Ereignis über eine Click Routine ausgelöst. So ähnlich wie bei mir. Ownerdraw :gruebel: :gruebel: ??? |
Re: nochmals StringGridDrawcell
Tach ...
fangen wir mal von vorne an. - Hast Du die Zeichnenfunktion auch mit dem enstpr. Ereigniss des Stringrids verbunden? (OnDrawCell) - DefaultDrawing auf False umgestellt? LG Mario |
Re: nochmals StringGridDrawcell
Ja zu beidem.
|
Re: nochmals StringGridDrawcell
Zeig mal bitte den kompletten Code. Irgendwie fehlt mir da einiges!
P.S.: Nimm mal Draw aus Deiner Rechenroutine raus, darum kümmert sich das SG selbstständig. |
Re: nochmals StringGridDrawcell
Hallo
da sind mehrere Sachen drin, die nicht gehen können, wobei ich das Jedi Grid nicht kenne. u.a.: Ich versteh dein "Rechnen" nicht, da keine Zuweisung erfolgt. Das drawcell direkt aufzurufen ist unnötig, das macht das Grid alleine, sobald sich ein Wert ändert. So kann es auch nicht gehen, da du dort 1. als Sender einen Button übergibst, und mit sender as tstringgrid bist du nicht im Grid, sondern im Button 2. als rect übergibst du 0,0,0,0 -> was glaubst Du, wo dein Textout(rect.left,rect.top,...) den Text hinschreiben wird ;-)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin ... Rechnen(Sender); //Sender=Button1 ... end; Procedure TForm1.Rechnen(Sender: TObject); begin ... DrawCell(Sender,2,i,Rect(0,0,0,0),[gdselected]) ; //übergebener Sender ist der Button1 ... end; Zitat:
Gruß Frank |
Re: nochmals StringGridDrawcell
Ich habe DrawCell aus der Rechenroutine gestrichen und es passiert nichts.
Im übrigen ist das der komplette Code
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, JvExGrids, JvStringGrid; type TForm1 = class(TForm) JvSG1: TJvStringGrid; Button1: TButton; procedure Button1Click(Sender: TObject); Procedure Rechnen(Sender: TObject); procedure DrawCell(Sender: TObject; Col, Row: Integer; Rect: TRect; State: TGridDrawState); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin //Lade Datei JvSG1.LoadFromCSV('messwerte.txt',#9); //Färbe Spalte 2 Rechnen(Sender); //Spring zur letzten Zeile //JvSG1.Row := JvSG1.RowCount-1; end; Procedure TForm1.Rechnen(Sender: TObject); var i:Integer; k,l:extended; begin For i := 2 to JvSG1.RowCount-1 do k := StrToFloat(JvSG1.Cells[2,i]); l := StrToFloat(JvSG1.Cells[2,i-1]); If k > l then begin JvSG1.Canvas.Brush.Color := clred; // DrawCell(Sender,2,i,Rect(0,0,0,0),[gdselected]) ; end; end; procedure TForm1.DrawCell(Sender: TObject; Col, Row: Integer; Rect: TRect; State: TGridDrawState); begin (sender as TStringgrid).canvas.Brush.color:=(sender as TStringgrid).color; (sender as TStringgrid).canvas.Font.color:=clWindowText; if (col<(sender as TStringgrid).fixedCols) or (row<(sender as TStringgrid).fixedRows) then (sender as TStringgrid).canvas.Brush.color:=(sender as TStringgrid).FixedColor //farbe der Header else if gdSelected in state then begin (sender as TStringgrid).canvas.Brush.color:=clHighlight; //farbe von markierung (sender as TStringgrid).canvas.Font.color:=clWindow; end else if integer(JVSG1.objects[col,row])=2 then (sender as TStringgrid).canvas.Brush.color:=clgreen; (sender as TStringgrid).canvas.FillRect(rect); (sender as TStringgrid).canvas.TextOut(rect.left+2,rect.top+2,(sender as TStringgrid).Cells[col,row]); end; end. |
Re: nochmals StringGridDrawcell
Du hast immer noch nicht dem angehängtem Object einen Wert zugewiesen!!
Delphi-Quellcode:
läuft ins leere. Bist Du sicher das dies der richtige Weg für dich ist? Prüfe stattdessen doch einfach den Wert der Zelle direkt
if integer(JVSG1.objects[col,row])=2 then
Delphi-Quellcode:
if Trim(Cells[col, row]) = '2' then
|
Re: nochmals StringGridDrawcell
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 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