動作環境
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出力するとっかかり。
- フォームにTChartを追加 (Chart1)
- フォームにTfrxPDFExportを追加 (frxPDFExport1)
- フォームにTfrxReportを追加 (frxReport1)
- Chart1にてSeries1を追加しておく (Fast Lineなどを使う)
- 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する処理が必要になる。