Chart - criando series em runtime |
Top Previous Next |
|
//Criando Séries do TChart em run-time: //Neste exemplo está representado a unit inteira
type TForm1 = class(TForm) ImprimeButton: TButton; Chart1: TChart; CriaButton: TButton; Series1: TLineSeries; procedure PRIMEClick(Sender: TObject); procedure CRIAClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private public Serie: Array[1..3] of TLineSeries; end;
var Form1: TForm1; I : Integer; S : Integer;
implementation
{$R *.DFM}
procedure TForm1.ImprimeButtonClick(Sender: TObject); var A: Array[1..3] of TLineSeries; begin QuickReport2 := TQuickReport2.Create(Self);
// É necessário criar series locais para o QR pois o TChart é chato. Ele não pode // ser destruído se tiver componentes TSeries acoplados. Deve-se primeiro dar um // Free nos TSeries vinculados e depois dar um Free no QR. Isto também vale para // Forms auto-create. for S := 1 to 3 do begin // Ao criar o TSeries Locais não funciona passar os parametros assim: // A[S] := Serie[S] OU // A[S].XValues := Serie[S].XValues (náo sei porque!) // deve-se passar todos os valores individualmente:
A[s] := TLineSeries.Create(Self); A[s].Clear; A[s].Title := Serie[s].Title; A[s].SeriesColor := Serie[s].SeriesColor; A[s].LinePen.Width := Serie[s].LinePen.Width;
A[s].XValues := Serie[s].XValues; A[s].YValues := Serie[s].YValues;
// Se o valor X for data ou string deve-se passá-lo novamente.
for i := 0 to Serie[s].YValues.Count-1 do A[s].Add( Serie[s].YValue[i], // Valor X FloatToStr(Serie[s].XValue[i]), // Valor Y Serie[s].SeriesColor); // Cor.
QuickReport2.QRDBChart1.AddSeries(A[s]); end;
QuickReport2.QRDBChart1.Title.Text[0] := 'Flavio'; QuickReport2.Preview;
// Sem a linha abaixo dá um Access Violation (GPF) ao passar pelo QR.Free. for S := 1 to 3 do A[s].Free; QuickReport2.Free end;
procedure TForm1.CriaButtonClick(Sender: TObject); begin // Esta rotina coloca os valores no gráficos for S := 1 to 3 do begin Serie[S].Clear; Serie[S].Title := 'Valores ' + intToStr(S) + TimeToStr(Time); Serie[S].SeriesColor := clBlue; Serie[S].LinePen.Width := 1;
Chart1.AddSeries(Serie[S]);
for i := 1 to 12 do Serie[S].Add( random(i * S), // Valor Y (geralmente valor $ ou %) IntToStr(i * 2), // Valor X (geralmente data) clBlue); // Cor end; end;
procedure TForm1.FormCreate(Sender: TObject); begin // Cria as series globais for S := 1 to 3 do Serie[s] := TLineSeries.Create(Self); CriaButton.Click; end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin // Remove da memória as series globais for S := 1 to 3 do Serie[s].Free; end;
end. |