Newsgroup: it.comp.lang.delphi
Titolo: Grafico ......

Ciao a tutti,
        ho una serie di dati da rappresentare in un grafico, lo sche e' 
quello classico, ovvero una serie di barre verticali con base sull'asse X.
Lo ordinate sono
Asse Y : Importo in euro
Asse X : Mese e anno
Tramite Series1.AddXY(...) sono riuscito a visualizzarele barre con i 
diversi colori, ma quello che non riesco a a fare perche' non ho ancora 
capito come ottenerlo e' di visualizzare sull'asse X il mese e l'anno (per 
esempio 10/2006).
Premetto che ho settato Series1.XValuea.DateTime:=True;
Grazie per chi mi rispondera'.
Ciao
Daniele

 sull'asse X. 
che componente?
Ciao.
-- 
Mauro Falzari
"Le gambe delle donne sono l'unico compasso che misura il mondo"
  (François Truffault)

 che componente?
Hai ragione da  vendere ....
Nella form ho messo 2 componenti, il primo quello in dotazione con delphi 
TChart.
Il secondo e' la versione shareware della Steema, e' un TChart anche lui ma 
e' diverso.
In entrambi i casi non riesco a mettere le date !!!
Greazie
Ciao, Daniele 

 lui ma e' diverso.
io non ho il secondo componente, ma ho il TChart.
Ho fatto piazzato un TChart su una form vuota e ho scoperto (leggendo la 
guida!) che scrivendo...
procedure TForm1.FormCreate(Sender: TObject);
begin
  Chart1.Series[0].FillSampleValues(10);
  Chart1.Series[0].XValues.DateTime := True;
  Chart1.BottomAxis.DateTimeFormat := 'dd/mm/yyyy';
end;
-- 
Mauro Falzari
"Creative minds have always been known
to survive any kind of bad training."
  (Anna Freud)

 end;
Ok, ma non finisce qui .....
Nel senso che il grafico e' un po piu' complesso, ti sposto il codice (dove 
trovi i numeri in realta' c'e' un collegamento ai valori del BD).
.....
Var : Anno,Mese : String; // li prendo dal database
......
Series1.Clear; // Resetto la serie
Series1.XValues.DateTime:=True; // Per preparare l'asse ad accettare la data
CH.BottomAxis.DateTimeFormat:='mm/yyyy'; // specifichiamo il formato da 
visualizzare
// Aggiungo i dati della prima serie ovvero metto tutti i dati che dovro' 
confrontare con quelli della seconda serie riferiti all'anno
// prima; in totale 4 serie per i confronti su 4 anni
Series1.AddXY(EncodeDate(StrToInt(Anno),StrToInt(Mese),StrToInt(Giorno)),10000,'Valore 
1',ClGreen);
Series1.AddXY(EncodeDate(StrToInt(Anno),StrToInt(Mese),StrToInt(Giorno)),5000.Value,'Valore 
2',ClRed);
Series1.AddXY(EncodeDate(StrToInt(Anno),StrToInt(Mese),StrToInt(Giorno)),7000,'Valore 
3'ClYellow);
....
Come potrai vedere con encodedate forzo il grafico ad essere espresso nella 
stessa area e ottengo e barre verticali di colore diverso.
Dopo penosi tentativi sono riuscito a "pulire" dall'asse x le label, cosi' 
raprresento solo le date.
Il problema e' quando inserisco la seconda serie (anche con gli stessi 
valori), in questo caso le barre non iniziano sul mese esatto (per esempio 
10/2006 e 10/2005), ma un po sfalsate e il risultato ottenuto non e' quello 
di visualizzare solo le 2 (o 4) date inserite ma anche tutti gli altri mesi 
non necessari (forse per questo vedo nei settaggi ....).
Sono alle prime armi con i grafici, scusami se sono domande "bananli".
Grazie, Ciao
Daniele 

 Grazie, Ciao
allora io non sono meglio di te, pensa che č la prima volta che provo a 
usare un grafico in Delphi! Tantomeno TChart. Perň ho voluto provare, per 
divertirmi (e imparare qualcosa anch'io).
Spero di aver capito qual'č il problema che hai descritto: se le serie sono 
piů di una, i valori delle label appaiono duplicati nel bottom axis e le 
barre non appaiono centrate.
Cosě ho letto un po' di help e ho piazzato un TChart su una form vuota, ho 
aggiunto manualmente (dall'editor) due serie a barre. Vedi se ti dŕ il 
risultato che volevi.
procedure TForm1.FormCreate(Sender: TObject);
  function iRnd: Integer;
  begin
    Result := Random(10000);
  end;
const
  BAR_WIDTH =    100;
  BAR_OFFSET =   0;
var
  dt: TDateTime;
begin
  dt := Date;
  Chart1.BottomAxis.DateTimeFormat := 'mm/yyyy';
  Chart1.BottomAxis.LabelStyle := talText;
  Randomize;
  with Series1 do
  begin
    Clear;
    XValues.DateTime := True;
    SeriesColor := clYellow;
    BarWidthPercent := BAR_WIDTH;
    OffsetPercent := BAR_OFFSET;
    MultiBar := mbStacked;
    AddXY(IncMonth(dt, 1), iRnd);
    AddXY(IncMonth(dt, 2), iRnd);
    AddXY(IncMonth(dt, 3), iRnd);
    AddXY(IncMonth(dt, 4), iRnd);
  end;
  Randomize;
  with Series2 do
  begin
    Clear;
    XValues.DateTime := True;
    SeriesColor := clPurple;
    BarWidthPercent := BAR_WIDTH;
    OffsetPercent := BAR_OFFSET;
    MultiBar := mbStacked;
    AddXY(IncMonth(dt, 1), iRnd);
    AddXY(IncMonth(dt, 2), iRnd);
    AddXY(IncMonth(dt, 3), iRnd);
    AddXY(IncMonth(dt, 4), iRnd);
  end;
end;
procedure TForm1.Chart1GetAxisLabel(Sender: TChartAxis;
  Series: TChartSeries; ValueIndex: Integer; var LabelText: String);
begin
  if ValueIndex > -1 then
    LabelText := FormatDateTime('mmmm yyyy', Series.XValue[ValueIndex])
end;
-- 
Mauro Falzari
"Military justice is to justice 
what military music is to music".
  (Groucho Marx)

Ciao,
   direi che tu te la stai cavando meglio di me !!!!!!
Ho provato il tuo studio ..... ma ancora non e' quello che si deve fare ....
Quindi ho modifcato il tuo esempio e ho inserito il codice che uso (e' 
arrangiato nei valori e nelle date, ma il risultato che da e' uguale a 
quello che ho io nel mio programma).
 procedure TForm1.FormCreate(Sender: TObject);
  function iRnd: Integer;
  begin
    Result := Random(10000);
  end;
 const
  BAR_WIDTH =    100;
  BAR_OFFSET =   0;
 var
  dt: TDateTime;
 begin
  dt := Date;
  Chart1.BottomAxis.DateTimeFormat := 'mm/yyyy';
  Chart1.BottomAxis.LabelStyle := talText;
// Questo e' il tuo codice




//  Questo e' il mio .....
// Dovresti togliere il tuo ....
  Series1.Clear;
  Series1.XValues.DateTime:=True;
  Chart1.BottomAxis.DateTimeFormat:='mm/yyyy';
  Chart1.BottomAxis.LabelStyle:=talText;
  Series1.OffsetPercent:=0;
// Aggiungo i dati della prima serie
  Series1.AddXY(EncodeDate(2005,10,01),10000,'Totale Mese',ClGreen);
  Series1.AddXY(EncodeDate(2005,10,01),5000,'Parziale',ClRed);
  Series1.AddXY(EncodeDate(2005,10,01),7000,'Altro',ClYellow);
// Aggiungo i dati della seconda serie
  Series2.Clear;
  Series2.XValues.DateTime:=True;
  Series2.OffsetPercent:=0;
  Series2.AddXY(EncodeDate(2006,10,01),15000,'Totale Mese',ClGreen);
  Series2.AddXY(EncodeDate(2006,10,01),3000,'Parziale',ClRed);
  Series2.AddXY(EncodeDate(2006,10,01),8000,'Altro',ClYellow);
 end;
 procedure TForm1.Chart1GetAxisLabel(Sender: TChartAxis;
  Series: TChartSeries; ValueIndex: Integer; var LabelText: String);
 begin
  if ValueIndex > -1 then
    LabelText := FormatDateTime('mmmm yyyy', Series.XValue[ValueIndex])
 end;
Il problema, se di problema si tratta, sembra essere quello su AddXY, 
infatti l'unica (o quasi) differenza tra il tuo codice e il mio e' che nel 
tuo tu cambi mese, mentre io no; E non posso fare diversamenteperche' in un 
mese ho ben 7 risultati da visualizzare e ne visualizzo 2 per volta 
(cambiando ovviamente i valori a seconda delle necessita').
Quindi nella serie1 ho 2 o 3 valori da visualizzare da cmparare con la 
serie2.
Come potrai notare, c'e' ancora qualche cosa che non va !!!
Mi raccomando .... non molliamo !!!!
Grazie
Daniele 

 Come potrai notare, c'e' ancora qualche cosa che non va !!!
...guarda se cosě puň andar bene!!! :-D
P.S.: per provare l'esempio, riparti da zero; applicazione nuova, piazzi un 
TChart sulla form e aggiungi manualmente due serie a barre, poi scrivi solo 
questo nell'OnCreate.
procedure TForm1.FormCreate(Sender: TObject);
var
  d: TDate;
begin
  with Chart1.BottomAxis do
  begin
    DateTimeFormat := 'mm/yyyy';
    LabelStyle := talValue;
    ExactDateTime := True;
    Increment := DateTimeStep[dtOneMonth];
  end;
  with Series1 do
  begin
    Clear;
    XValues.DateTime := True;
    BarWidthPercent := 100;
    d := EncodeDate(2005, 10, 1);
    MultiBar := mbNone;
    AddXY(d , 10000, 'Totale Mese', clGreen);
    AddXY(d, 5000, 'Parziale', clRed);
    AddXY(d, 7000, 'Altro', clYellow);
  end;
  with Series2 do
  begin
    Clear;
    XValues.DateTime := True;
    BarWidthPercent := 100;
    d := EncodeDate(2005, 11, 1);
    MultiBar := mbNone;
    AddXY(d, 15000, 'Totale Mese', clGreen);
    AddXY(d, 3000, 'Parziale', clRed);
    AddXY(d, 8000, 'Altro', clYellow);
  end;
end;
-- 
Mauro Falzari
"Il futuro non mi interessa. Io lavoro sul futuro del futuro".
  (Robert Doniger, 1996)

     Increment := DateTimeStep[dtOneMonth];
P.S.: devi regolare la proprietą increment col DateTimeStep che ti occorre; 
dalla guida:
TDateTimeStep = (dtOneSecond, dtFiveSeconds, dtTenSeconds, 
dtFifteenSeconds, dtThirtySeconds, dtOneMinute, dtFiveMinutes, 
dtTenMinutes, dtFifteenMinutes, dtThirtyMinutes, dtOneHour, dtTwoHours, 
dtSixHours, dtTwelveHours, dtOneDay, dtTwoDays, dtThreeDays, dtOneWeek, 
dtHalfMonth, dtOneMonth, dtTwoMonths, dtSixMonths, dtOneYear);
Con i tuoi dati "annuali" il mio esempio del post precedente diventa:
procedure TForm1.FormCreate(Sender: TObject);
var
  d: TDate;
begin
  with Chart1.BottomAxis do
  begin
    DateTimeFormat := 'mm/yyyy';
    LabelStyle := talValue;
    ExactDateTime := True;
    Increment := DateTimeStep[dtSixMonths];
  end;
  with Series1 do
  begin
    Clear;
    XValues.DateTime := True;
    BarWidthPercent := 100;
    d := EncodeDate(2005, 10, 1);
    MultiBar := mbNone;
    AddXY(d , 10000, 'Totale Mese', clGreen);
    AddXY(d, 5000, 'Parziale', clRed);
    AddXY(d, 7000, 'Altro', clYellow);
  end;
  with Series2 do
  begin
    Clear;
    XValues.DateTime := True;
    BarWidthPercent := 100;
    d := EncodeDate(2006, 10, 1);
    MultiBar := mbNone;
    AddXY(d, 15000, 'Totale Mese', clGreen);
    AddXY(d, 3000, 'Parziale', clRed);
    AddXY(d, 8000, 'Altro', clYellow);
  end;
end;
-- 
Mauro Falzari
"Il futuro non mi interessa. Il lavoro sul futuro del futuro".
  (Robert Doniger, 1996)

Ciao,
   alla fine, grazie a te, sono riuscito ad ottenre quello che avevo 
auspicato !!!!
Comunque non e' cosi' semplice lavorare con i grafici !!!!
Infatti a seconda di quante serie si visualizzano si deve andare a cambiare 
l'incremento.
Un'ultima domanda : Come te la cavi con i DataBase ???
In breve ti spiego quello che devo fare (questa e' un'altra sfida) :
C'e' un database con circa 700000 record indicanti altrettanti prodotti, il 
record e' lungo 640 byte e ... ho la struttura originale; Questo siginifica 
che, in teoria ed in pratica, sappiamo cosa contiene.
Ci sono due problemi :
1 - E' un data base commerciale che ho comprato, lungo qualche decina di 
megabyte e, accettando i contenuti della licenza, non lo posso divulgare 
neanche in parte.
2 - E' un DataBase "costruito" (scusa il termine) con un'applicazione COBOL, 
piu' precisamente ACUCOBOL, e tutti i programmi che usano questo DB sono in 
cobol, lo stesso vale per gli indici, ovvero sono fatti sempre con quel 
linguaggio.
L'applicazione che ho scritto (e dovrei usare) e' quasi finita e devo 
riuscire ad interfacciarmi a quel database, le operazioni sono:
1) Tramite lettore ottico leggo il barcode (fatto)
2) Accedo al db tramite il barcode (da fare)
3) Leggo il nome del prodotto ed il prezzo relativo (da fare)
Visto che in definitiva i dati sono dati e ho la struttura sia del record 
che dei file indice, manca solo un guru che mi possa orientare sulla lettura 
dei record !!!
Accetti la sfida????
Ti ringrazio per il grafico !!!
Ciao
Daniele
PS : Tra poco riapro l'argomento DB sul forum ..... 

 PS : Tra poco riapro l'argomento DB sul forum .....
Postalo anche anche qua, sul NG.
;-)
Ciao
ACSH
-- 
Il più grande sbaglio nel progettare software
a prova di stupido è sottostimare l'enorme
ingegnosità degli stupidi.