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..3of TLineSeries;

  end;

 

var

  Form1: TForm1;

  I : Integer;

  S : Integer;

 

implementation

 

{$R *.DFM}

 

procedure TForm1.ImprimeButtonClick(Sender: TObject);

var

  A: Array[1..3of 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.