Oppure

Loading
02/06/12 11:24
carmelo
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
aaa
02/06/12 12:17
Goblin
credo che i vari esempi li trovi in quelli di delphi male che vada guarda nel sito steema.com

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

procedure TForm20.Button1Click(Sender: TObject);
Var i, x:Integer;
    fSeries: TChartSeriesClass;
begin
// impostazioni di default, li posso impostare anche visualmente
  Chart1.Legend.Visible := True;
  Chart1.Title.Text.Add('Test');
  Chart1.BottomAxis.Automatic := True;
  Chart1.BottomAxis.AutomaticMaximum := True;
  Chart1.BottomAxis.AutomaticMinimum := True;
  Chart1.LeftAxis.Automatic := True;
  Chart1.LeftAxis.AutomaticMaximum := True;
  Chart1.LeftAxis.AutomaticMinimum := True;
  fSeries := TLineSeries;   // genero la serie di tipo linea
  for i:= 0 to 2 do  // faccio un giro di 3 serie
  Begin
  // assegno il colore x ogni serie
    Chart1.AddSeries(fSeries.Create(Self));
    if i=0 then
      Chart1.Series[i].SeriesColor := clRed
    else if i=1 then
      Chart1.Series[i].SeriesColor := clBlue
    else if i=2 then
      Chart1.Series[i].SeriesColor := clGreen;
    // definisco la linea e lo spessore della serie
    TLineSeries(Chart1.Series[i]).LinePen.Style := psSolid;
    TLineSeries(Chart1.Series[i]).LinePen.Width := 1;
   assegno i valori alla serie e al grafico
    for x := 1 to 20 do
      Chart1.Series[i].AddXY(x, x+i*10,'Test_'+IntTostr(x),Chart1.Series[i].SeriesColor);
  End;
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
02/06/12 13:14
carmelo
Gentilissimo!
Ho solo omesso una cosa credo importante...uso Lazarus!
E' la stessa cosa?
Ciau e grazie
aaa
02/06/12 13:51
Goblin
a grandi linee credo di si .. ho preso il codice e l'ho portato su lazarus

procedure TForm1.Button1Click(Sender: TObject);
Var i, x:Integer;
begin
// impostazioni di default, li posso impostare anche visualmente
  Chart1.Legend.Visible := True;
  Chart1.Title.Text.Add('Test');
  for i:= 0 to 2 do  // faccio un giro di 3 serie
  Begin
  // assegno il colore x ogni serie
    Chart1.AddSeries(TLineSeries.Create(Self));
    if i=0 then
      TLineSeries(Chart1.Series[i]).SeriesColor := clRed
    else if i=1 then
      TLineSeries(Chart1.Series[i]).SeriesColor := clBlue
    else if i=2 then
      TLineSeries(Chart1.Series[i]).SeriesColor := clGreen;
    // definisco la linea e lo spessore della serie
    TLineSeries(Chart1.Series[i]).LinePen.Style := psSolid;
    TLineSeries(Chart1.Series[i]).LinePen.Width := 1;
//   assegno i valori alla serie e al grafico
    for x := 1 to 20 do
      TLineSeries(Chart1.Series[i]).AddXY(x, x+i*10,'Test_'+IntTostr(x),TLineSeries(Chart1.Series[i]).SeriesColor);
  End;
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
02/06/12 16:32
carmelo
Smanettando sono riuscito a creare una bozza di quello che volevo con questa parte di codice (valevole per adesso solo per 4 punti).
procedure TForm1.Button1Click(Sender: TObject);
var
     x1, y1, x2, y2, x3, y3, x4, y4 : real;
     Lser: TLineSeries;
begin
x1:=strtofloat(stringgrid1.Cells[1,1]);
y1:=strtofloat(stringgrid1.Cells[2,1]);
x2:=strtofloat(stringgrid1.Cells[1,2]);
y2:=strtofloat(stringgrid1.Cells[2,2]);
x3:=strtofloat(stringgrid1.Cells[1,3]);
y3:=strtofloat(stringgrid1.Cells[2,3]);
x4:=strtofloat(stringgrid1.Cells[1,4]);
y4:=strtofloat(stringgrid1.Cells[2,4]);
chart1.Series.Clear;
Lser:=TLineSeries.Create(Chart1);
Lser.AddXY(x1,y1);
Lser.AddXY(x2,y2);
Lser.AddXY(x3,y3);
Lser.AddXY(x4,y4);
chart1.AddSeries(Lser);
end;                 


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

Uploaded with [URL=imageshack.us]ImageShack.us[/…]

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
x1:=strtofloat(stringgrid1.Cells[1,1]);
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
aaa
02/06/12 16:48
Goblin
prova con
procedure TForm1.Button1Click(Sender: TObject);
var
  Lser: TLineSeries;
  x: Integer;
begin
  chart1.Series.Clear;
  Lser:=TLineSeries.Create(Chart1);
  for x:= 1 to 20 do  // sarebbe meglio un rowcount-1 ...
    Lser.AddXY(strtofloat(stringgrid1.Cells[1,x]),strtofloat(stringgrid1.Cells[2,x]));
  chart1.AddSeries(Lser);
end;                             


NB: Codice creato "al volo" e non testato
Ibis redibis non morieris in bello
03/06/12 11:28
carmelo
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-|)

aaa
14/06/12 14:35
carmelo
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
aaa