Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi nochmals StringGridDrawcell (https://www.delphipraxis.net/139303-nochmals-stringgriddrawcell.html)

fl63 26. Aug 2009 13:36


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:
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;
Ich hoffe auf Hilfe.

MacGuyver 26. Aug 2009 13:52

Re: nochmals StringGridDrawcell
 
Moin fl63,

ich kann jetzt so nicht sagen warum, habe nur einen kleinen Tip für die Übersichtlichkeit:

Delphi-Quellcode:
var
  lGrid : TStringgrid;
  lCV : TCanvas;

begin
  lGrid := sender as TStringgrid;
  lCV := lGrid.canvas;
Ab dann kannst du mit lGrid und lCV arbeiten anstelle immer (sender as TStringgrid) und (sender as TStringgrid).canvas zu benutzen.

Musst du bei dem Stringgrid irgendwie "OwnerDraw" aktivieren?

Stefan

fl63 26. Aug 2009 14:07

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: ???

Hobby-Programmierer 26. Aug 2009 14:50

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

fl63 26. Aug 2009 14:52

Re: nochmals StringGridDrawcell
 
Ja zu beidem.

Hobby-Programmierer 26. Aug 2009 15:29

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.

Keldorn 26. Aug 2009 15:36

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:

if integer(JVSG1.objects[col,row])=2 then
in deinem Code steht nirgends, wo Du das object hinterlegts, sicher, das du hier nicht inttostr(cells[acol,arow] stehen haben willst?

Gruß Frank

fl63 26. Aug 2009 15:41

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.

Hobby-Programmierer 26. Aug 2009 15:53

Re: nochmals StringGridDrawcell
 
Du hast immer noch nicht dem angehängtem Object einen Wert zugewiesen!!
Delphi-Quellcode:
if integer(JVSG1.objects[col,row])=2 then
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
Delphi-Quellcode:
if Trim(Cells[col, row]) = '2' then

fl63 26. Aug 2009 16:10

Re: nochmals StringGridDrawcell
 
Zitat:

Zitat von Hobby-Programmierer
Du hast immer noch nicht dem angehängtem Object einen Wert zugewiesen!!
Delphi-Quellcode:
if integer(JVSG1.objects[col,row])=2 then
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
Delphi-Quellcode:
if Trim(Cells[col, row]) = '2' then

Ich bin jetzt langsam davon überzeugt die gesamte DrawCell Routine ist für dieses Problem nicht geeignet. Wie schon geschrieben habe ich diese Routine aus diesem Forum. Sie selber zu schreiben, weiß ich gar nicht wie, da ich Anfänger bin.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 Uhr.
Seite 1 von 3  1 23      

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