Chart - criando e imprimindo em runtime

Top  Previous  Next

Tudo sobre criação de gráficos em run-time E impressão:

=======================================================

Uses TeeProcs, TeEngine, Chart, Series;

 

const

  TotalSeries = 2;

var

  Serie: array [0..TotalSeries] of TLineSeries;

 

procedure FormCreate;

var

  I: Integer;

begin

  for I := 0 to TotalSeries do

  begin

    Serie[I]               := TLineSeries.Create(Self); // Do tipo linha

    Serie[I].LinePen.Width := 2;

    Serie[I].ValueFormat   := '#,##0.00';

    // Aquelas caixinhas sobre cada ponto:

    Serie[I].Marks.Visible := True;

    Serie[I].Marks.Style   := smsValue;

    Serie[I].Marks.BackColor := clWhite;

    Serie[I].Marks.Font.Size := 7;

    Serie[I].Marks.Frame.Visible := False;

  end;

  // Titulos e cores.

  Serie[0].Title := 'PC'; Serie[0].SeriesColor := clBlue;   //prodvlrcus

  Serie[1].Title := 'FP'; Serie[1].SeriesColor := clRed;    //totpagar

  Serie[2].Title := 'FR'; Serie[2].SeriesColor := clGreen;  //totreceber

end;  

 

procedure BotaoExecutarClick;

begin

  for I := 0 to TotalSeries do Serie[I].Clear;

  Query.First;

 

  while not Query.EOF do

  begin

    Dia := Query.GetDataStr('data','dd');

    Serie[0].Add( Query.GetValor('valor1'), Dia, Serie[0].SeriesColor);

    Serie[1].Add( Query.GetValor('valor2'), Dia, Serie[1].SeriesColor);

    Serie[2].Add( Query.GetValor('valor2'), Dia, Serie[2].SeriesColor);

    for I:= 0 to TotalSeries do Grafico.AddSeries( Serie[I] );

    Query.Next;

  end;

  Grafico.BottomAxis.ExactDateTime  := True; // Se o rodapé for data, coloque isto

end;

 

procedure ImprimirButtonClick;

var

  A : array[0..TotalSeries] of TLineSeries;

  S : Integer;

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 := 0 to TotalSeries do

  begin

    A[s] := TLineSeries.Create(Self);

    // Para passar os valores da var serie[s] é necessário usar um assign

    A[s].Assign(Serie[s]);

    QuickReport2.QRDBChart1.AddSeries(A[s]);

  end;

 

  QuickReport2.QRDBChart1.Title.Text[0] := 'Gráfico Estoque/Financeiro - Período: ' +                                             DataInicialEdit.GetData +

                                            ' a ' + DataFinalEdit.GetData;

  QuickReport2.QRDBChart1.Title.Font               := Grafico.Title.Font;

  QuickReport2.QRDBChart1.BottomAxis.ExactDateTime := True;

  QuickReport2.QRDBChart1.BottomAxis.Title.Caption := 'Dia';

  QuickReport2.QRDBChart1.BottomAxis.ExactDateTime  := True;

  QuickReport2.Preview;

  // Sem a linha abaixo dá um Access Violation (GPF) ao passar pelo QR.Free.

  for S := 0 to TotalSeries do A[s].Free;

  QuickReport2.Free

end;

 

procedure FormCloseQuery;

var

  I: Integer;

begin

  for I := 0 to TotalSeries do Serie[I].Free; // Necessario remover da memoria

end;