LoginSignup
0
1

More than 5 years have passed since last update.

c++ builder XE4, 10.2 Tokyo > グラフのPDF出力

Last updated at Posted at 2015-05-27
動作環境
C++ builder XE4
    TeeChart Lite v2013.08.130414
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/09)
    TeeChart v2016.17.160129 32bit VCL

とっかかり

TChartのグラフをPDF出力するとっかかり。

  1. フォームにTChartを追加 (Chart1)
  2. フォームにTfrxPDFExportを追加 (frxPDFExport1)
  3. フォームにTfrxReportを追加 (frxReport1)
  4. Chart1にてSeries1を追加しておく (Fast Lineなどを使う)
  5. frxReport1にて図オブジェクトを追加しておく

以下の実装をすることでbuttonクリック時にtest.pdfが作成される。

pdfout.cpp
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
    Chart1->Series[0]->AddXY(1, 2.7182);
    Chart1->Series[0]->AddXY(2, 3.1415);
    Chart1->Series[0]->AddXY(3, 6.022);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    frxPDFExport1->FileName = L"test.pdf";
    frxPDFExport1->ShowDialog = false;
    frxReport1->PrepareReport(true);
    frxReport1->Export(frxPDFExport1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::frxReport1BeforePrint(TfrxReportComponent *Sender)
{
    TfrxPictureView *p = (TfrxPictureView *)Sender;
    if (p->Picture == NULL) {
            return;
    }
    p->Picture->Assign(
        Chart1->TeeCreateMetafile(
            false,
            Rect(0, 0, int(Sender->Width), int(Sender->Height))
        )
    );
}
//---------------------------------------------------------------------------

複数ページ出力

複数のグラフを出力する方法の一つ

frxReport1->PrepareReport()する前にデータをセットする方法をとっている。

multipage.cpp
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    frxPDFExport1->FileName = L"test.pdf";
    frxPDFExport1->ShowDialog = false;
    updateData(0);
    frxReport1->PrepareReport(true);
    updateData(1);
    frxReport1->PrepareReport(false);
    updateData(2);
    frxReport1->PrepareReport(false);
    frxReport1->Export(frxPDFExport1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::frxReport1BeforePrint(TfrxReportComponent *Sender)
{
    TfrxPictureView *p = (TfrxPictureView *)Sender;
    if (p->Picture == NULL) {
            return;
    }
    p->Picture->Assign(
        Chart1->TeeCreateMetafile(
            false,
            Rect(0, 0, int(Sender->Width), int(Sender->Height))
        )
    );
}
//---------------------------------------------------------------------------

void __fastcall TForm1::updateData(int idx)
{
    Chart1->Series[0]->Clear();

    switch(idx) {
    case 0:
        Chart1->Series[0]->AddXY(1, 2.7182);
        Chart1->Series[0]->AddXY(2, 2.7182);
        Chart1->Series[0]->AddXY(3, 2.7182);
        break;
    case 1:
        Chart1->Series[0]->AddXY(1, 3.1415);
        Chart1->Series[0]->AddXY(2, 3.1415);
        Chart1->Series[0]->AddXY(3, 3.1415);
        break;
    case 2:
        Chart1->Series[0]->AddXY(1, 6.022);
        Chart1->Series[0]->AddXY(2, 6.022);
        Chart1->Series[0]->AddXY(3, 6.022);
        break;
    }

}
//---------------------------------------------------------------------------

補足 (気づき点)

実行時パッケージを使ってリンク: true
動的RTLとリンク: true
の時はfrxReport1BeforePrint()の処理内ではp->Pictureには必ずNULL以外が入る。

実行時パッケージを使ってリンク: false
動的RTLとリンク: false
の時はfrxReport1BeforePrint()の処理内ではp->PictureがNULLの時もある。

そのためp->Picture == NULLでreturnする処理が必要になる。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1