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

```txt:動作環境
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する処理が必要になる。