AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

nochmals StringGridDrawcell

Ein Thema von fl63 · begonnen am 26. Aug 2009 · letzter Beitrag vom 29. Aug 2009
Antwort Antwort
Seite 1 von 3  1 23      
fl63

Registriert seit: 30. Mär 2008
124 Beiträge
 
#1

nochmals StringGridDrawcell

  Alt 26. Aug 2009, 13:36
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.
  Mit Zitat antworten Zitat
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
293 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: nochmals StringGridDrawcell

  Alt 26. Aug 2009, 13:52
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
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
fl63

Registriert seit: 30. Mär 2008
124 Beiträge
 
#3

Re: nochmals StringGridDrawcell

  Alt 26. Aug 2009, 14:07
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 ???
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#4

Re: nochmals StringGridDrawcell

  Alt 26. Aug 2009, 14:50
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
Mario
'Lesen Sie schnell, denn nichts ist beständiger als der Wandel im Internet!'
  Mit Zitat antworten Zitat
fl63

Registriert seit: 30. Mär 2008
124 Beiträge
 
#5

Re: nochmals StringGridDrawcell

  Alt 26. Aug 2009, 14:52
Ja zu beidem.
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#6

Re: nochmals StringGridDrawcell

  Alt 26. Aug 2009, 15:29
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.
Mario
'Lesen Sie schnell, denn nichts ist beständiger als der Wandel im Internet!'
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: nochmals StringGridDrawcell

  Alt 26. Aug 2009, 15:36
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
fl63

Registriert seit: 30. Mär 2008
124 Beiträge
 
#8

Re: nochmals StringGridDrawcell

  Alt 26. Aug 2009, 15:41
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.
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#9

Re: nochmals StringGridDrawcell

  Alt 26. Aug 2009, 15:53
Du hast immer noch nicht dem angehängtem Object einen Wert zugewiesen!!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 if Trim(Cells[col, row]) = '2then
Mario
'Lesen Sie schnell, denn nichts ist beständiger als der Wandel im Internet!'
  Mit Zitat antworten Zitat
fl63

Registriert seit: 30. Mär 2008
124 Beiträge
 
#10

Re: nochmals StringGridDrawcell

  Alt 26. Aug 2009, 16:10
Zitat von Hobby-Programmierer:
Du hast immer noch nicht dem angehängtem Object einen Wert zugewiesen!!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 if Trim(Cells[col, row]) = '2then
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:03 Uhr.
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