Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Delphi - Realizzazione grafico con tchart
Forum - Delphi - Realizzazione grafico con tchart

Avatar
carmelo (Normal User)
Pro


Messaggi: 100
Iscritto: 15/06/2007

Segnala al moderatore
Postato alle 13:24
Sabato, 02/06/2012
Ciao a tutti,
sto cercando di fare un grafico partendo da coordinate x e y prese da una tabella messa nella stessa form.
Una volta inserito il componente tchart, come devo cominciare? 8-|

Se avete degli esempi da consigliarmi per partire sono ben accetti :)

Ciao e grazie
Carmelo

PM Quote
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Segnala al moderatore
Postato alle 14:17
Sabato, 02/06/2012
credo che i vari esempi li trovi in quelli di delphi male che vada guarda nel sito www.steema.com

ti ho scritto 2 righe di esempio con un click di un bottone:

Codice sorgente - presumibilmente Delphi

  1. procedure TForm20.Button1Click(Sender: TObject);
  2. Var i, x:Integer;
  3.     fSeries: TChartSeriesClass;
  4. begin
  5. // impostazioni di default, li posso impostare anche visualmente
  6.   Chart1.Legend.Visible := True;
  7.   Chart1.Title.Text.Add('Test');
  8.   Chart1.BottomAxis.Automatic := True;
  9.   Chart1.BottomAxis.AutomaticMaximum := True;
  10.   Chart1.BottomAxis.AutomaticMinimum := True;
  11.   Chart1.LeftAxis.Automatic := True;
  12.   Chart1.LeftAxis.AutomaticMaximum := True;
  13.   Chart1.LeftAxis.AutomaticMinimum := True;
  14.   fSeries := TLineSeries;   // genero la serie di tipo linea
  15.   for i:= 0 to 2 do  // faccio un giro di 3 serie
  16.   Begin
  17.   // assegno il colore x ogni serie
  18.     Chart1.AddSeries(fSeries.Create(Self));
  19.     if i=0 then
  20.       Chart1.Series[i].SeriesColor := clRed
  21.     else if i=1 then
  22.       Chart1.Series[i].SeriesColor := clBlue
  23.     else if i=2 then
  24.       Chart1.Series[i].SeriesColor := clGreen;
  25.     // definisco la linea e lo spessore della serie
  26.     TLineSeries(Chart1.Series[i]).LinePen.Style := psSolid;
  27.     TLineSeries(Chart1.Series[i]).LinePen.Width := 1;
  28.    assegno i valori alla serie e al grafico
  29.     for x := 1 to 20 do
  30.       Chart1.Series[i].AddXY(x, x+i*10,'Test_'+IntTostr(x),Chart1.Series[i].SeriesColor);
  31.   End;
  32. end;



Lo so non è un granchè, ma spero ti basti per prendere spunto e fare quello che ti serve, se hai bisogno di qualche particolare chiedi :)
G.


Ibis redibis non morieris in bello
PM Quote
Avatar
carmelo (Normal User)
Pro


Messaggi: 100
Iscritto: 15/06/2007

Segnala al moderatore
Postato alle 15:14
Sabato, 02/06/2012
Gentilissimo!
Ho solo omesso una cosa credo importante...uso Lazarus!
E' la stessa cosa?
Ciau e grazie

PM Quote
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Segnala al moderatore
Postato alle 15:51
Sabato, 02/06/2012
a grandi linee credo di si .. ho preso il codice e l'ho portato su lazarus

Codice sorgente - presumibilmente Delphi

  1. procedure TForm1.Button1Click(Sender: TObject);
  2. Var i, x:Integer;
  3. begin
  4. // impostazioni di default, li posso impostare anche visualmente
  5.   Chart1.Legend.Visible := True;
  6.   Chart1.Title.Text.Add('Test');
  7.   for i:= 0 to 2 do  // faccio un giro di 3 serie
  8.   Begin
  9.   // assegno il colore x ogni serie
  10.     Chart1.AddSeries(TLineSeries.Create(Self));
  11.     if i=0 then
  12.       TLineSeries(Chart1.Series[i]).SeriesColor := clRed
  13.     else if i=1 then
  14.       TLineSeries(Chart1.Series[i]).SeriesColor := clBlue
  15.     else if i=2 then
  16.       TLineSeries(Chart1.Series[i]).SeriesColor := clGreen;
  17.     // definisco la linea e lo spessore della serie
  18.     TLineSeries(Chart1.Series[i]).LinePen.Style := psSolid;
  19.     TLineSeries(Chart1.Series[i]).LinePen.Width := 1;
  20. //   assegno i valori alla serie e al grafico
  21.     for x := 1 to 20 do
  22.       TLineSeries(Chart1.Series[i]).AddXY(x, x+i*10,'Test_'+IntTostr(x),TLineSeries(Chart1.Series[i]).SeriesColor);
  23.   End;
  24. end;



Non conosco bene le classi chart e series di lazarus dunque ho fatto in modo spartano ... ma funziona..


Ibis redibis non morieris in bello
PM Quote
Avatar
carmelo (Normal User)
Pro


Messaggi: 100
Iscritto: 15/06/2007

Segnala al moderatore
Postato alle 18:32
Sabato, 02/06/2012
Smanettando sono riuscito a creare una bozza di quello che volevo con questa parte di codice (valevole per adesso solo per 4 punti).
Codice sorgente - presumibilmente Delphi

  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.      x1, y1, x2, y2, x3, y3, x4, y4 : real;
  4.      Lser: TLineSeries;
  5. begin
  6. x1:=strtofloat(stringgrid1.Cells[1,1]);
  7. y1:=strtofloat(stringgrid1.Cells[2,1]);
  8. x2:=strtofloat(stringgrid1.Cells[1,2]);
  9. y2:=strtofloat(stringgrid1.Cells[2,2]);
  10. x3:=strtofloat(stringgrid1.Cells[1,3]);
  11. y3:=strtofloat(stringgrid1.Cells[2,3]);
  12. x4:=strtofloat(stringgrid1.Cells[1,4]);
  13. y4:=strtofloat(stringgrid1.Cells[2,4]);
  14. chart1.Series.Clear;
  15. Lser:=TLineSeries.Create(Chart1);
  16. Lser.AddXY(x1,y1);
  17. Lser.AddXY(x2,y2);
  18. Lser.AddXY(x3,y3);
  19. Lser.AddXY(x4,y4);
  20. chart1.AddSeries(Lser);
  21. end;



[URL=http://img163.imageshack.us/img163/230/catturaxe.png[/IMG] ...'>http://imageshack.us/photo/my-images/163/catturaxe.png/][I ...]

Uploaded with [URL=http://imageshack.us]ImageShack.us[/URL]

Come vedete dall'immagine allegata, sto cercando di realizzare una figura partendo da coordinate che inserisco in una stringgrid per un max di 20 punti.
Adesso il problema è un altro.
Cosi come ho impostato il codice dovrei scrivere 40 variabili e 20 volte la coppia
Codice sorgente - presumibilmente Plain Text

  1. x1:=strtofloat(stringgrid1.Cells[1,1]);
  2. y1:=strtofloat(stringgrid1.Cells[2,1]);


Dato che mi sembra assurdo e non "professionale", mi chiedevo se esiste la possibilità di inserire un ciclo for o altro, per evitare la ripetizione del codice e velocizzare il tutto.
Grazie mille per l'aiuto!
Saluti
Carmelo

PM Quote
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Segnala al moderatore
Postato alle 18:48
Sabato, 02/06/2012
prova con
Codice sorgente - presumibilmente Delphi

  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   Lser: TLineSeries;
  4.   x: Integer;
  5. begin
  6.   chart1.Series.Clear;
  7.   Lser:=TLineSeries.Create(Chart1);
  8.   for x:= 1 to 20 do  // sarebbe meglio un rowcount-1 ...
  9.     Lser.AddXY(strtofloat(stringgrid1.Cells[1,x]),strtofloat(stringgrid1.Cells[2,x]));
  10.   chart1.AddSeries(Lser);
  11. end;



NB: Codice creato "al volo" e non testato


Ibis redibis non morieris in bello
PM Quote
Avatar
carmelo (Normal User)
Pro


Messaggi: 100
Iscritto: 15/06/2007

Segnala al moderatore
Postato alle 13:28
Domenica, 03/06/2012
Testato e funzionante!
L'unica pecca è che dovrei necessariamente avere 20 valori non nulli altrimenti il programma va in crash.
Ed in realtà la figura potrebbe essere composta anche solo da 4 punti.
C'è la possibilità di mettere una condizione del tipo, "se la cella è vuota non considerarla"?

(Altro problemino: non riesco a cambiare sia lo spessore del grafico 8-|)


PM Quote
Avatar
carmelo (Normal User)
Pro


Messaggi: 100
Iscritto: 15/06/2007

Segnala al moderatore
Postato alle 16:35
Giovedì, 14/06/2012
Ciao ragazzi,
fermo restando sia chiaro quello che sto facendo, ovvero un grafico di una figura piana tramite l'unione di più punti di coordinate date da una stringgrid, volevo chiedervi, secondo la vostra esperienza, sarebbe più comodo realizzare questo grafico utilizzando i metodi canvas, quindi line(x1,y1,x2,y2) oppure continuare a portare avanti il progetto con tchart?
Grazie per la vostra opinione in merito ;)
Saluti

PM Quote