LoginSignup
0
1

More than 5 years have passed since last update.

C++ Builder XE4 > FastReport > 手順: ボタンを押したらChart1の内容をPicture1にコピーしてPDFにする

Last updated at Posted at 2018-12-05
動作環境
C++ Builder XE4
FastReport VCL5

関連

資料

Chart1のPDF化概要

  • TfrxRerpotから開くリポートのデザインでPicture1を配置
  • Picture1に対してC++ BuilderのコードからChart1の内容をコピーする
  • PDFに出力

前準備

に記載の内容を実施する。

今回の実施

ここでChart1を追加して作業を進めると、Chart1に関するエラーが発生する。

対処として下記を実施する (Chart1を追加してからfrxReport1を追加する)

  1. frxReport1を削除する
  2. フォームにTeeChartを追加する (Chart1)
  3. フォームにTfrxReportを追加する (frxReport1)
  4. frxReport1をダブルクリックしてリポートのデザイン画面に移る
  5. Pictureを追加する (Picture1)
    • 小さいので大きくする
  6. リポートのデザインを保存せずに閉じる
    • デザインはUnit1.dfmに追加される
  7. frxReport1のOnBeforePrintで関数を定義する (下記のコード参照)
Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <DateUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "frxClass"
#pragma link "frxExportPDF"
#pragma link "frxChart"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // PDFエクスポート
    frxPDFExport1->FileName = L"test.pdf";
    frxPDFExport1->ShowDialog = true;
    frxPDFExport1->Quality = 100;
    frxReport1->PrepareReport(/* clearLastReport= */true);
    frxReport1->Export(frxPDFExport1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
    // ダミーデータでグラフ生成
    Chart1->Series[0]->XValues->DateTime = true;
    Chart1->BottomAxis->DateTimeFormat = L"nn:ss";

    TDateTime dt;

    dt = Now();

    double yval;
    for (int idx=0; idx < 10; idx++) {
        yval = (1+ idx) % 2;
        Series1->AddXY(dt, yval, "", clRed);
        dt = IncSecond(dt, 1);
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::frxReport1BeforePrint(TfrxReportComponent *Sender)
{
    TfrxPictureView *picptr = (TfrxPictureView *)Sender;

    if (Sender->Name == L"Picture1") {
        TMetafile *metaPtr = Chart1->TeeCreateMetafile(false, Rect(0, 0, Sender->Width, Sender->Height));
        picptr->Picture->Assign(metaPtr);
    }
}
//---------------------------------------------------------------------------

動作結果

  1. Button1を押下
  2. PDFへのエクスポートダイアログで[OK]を押す

生成されるtest.pdf
(PDF-XChange Viewerで開いた状況)

2018-12-05_17h23_10.png

古い記事

実は2015年に似たようなことを記事にしてた。
今回ほど丁寧にしてはいないが。

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