C++Builder XE6 に付属しているレポート作成ツールにFastReportというのがあります。
大昔は、QuickReportというのが標準ツールだったのが、
途中で、C++Builder 2007くらいから、RaveReportというのが標準に変わり、
さらに、XEシリーズになった頃には、FastReportになったようです。
で、今回、初めて実戦的にFastReportを使ってみたんですが、
まずはちゃんと日本語化されていなくて、
プレビューウィンドウやプリンター設定ウィンドウが英語のままだったりして、
C++Builderがメジャーになれなかった理由は、
やっぱり、日本語化がちゃんとされていなかったからじゃないかなあ、
と思ったりします。
さて、今回発見したツボのようなところというのは、
FastReportに、C++Builderからデータを渡す方法によって、
ちょっとした癖があるというのがわかったことなんです。
まずは、C++BuilderのVCLウィンドウ画面の中に、
レポートコンポーネント frxReportを配置します。
一番簡単にデータを渡す方法は、
FastReportのデザインツールのテキスト部品(オレンジ色のAというアイコン)になりますが、
そのテキスト編集パレットの中で、
[変数名]という風に、[]カッコで囲んでやることです。
すると、C++Builder側から、
frxReport1->Script->Variables["変数名"] = Edit1->Text ;
というような感じで、変数の値をFastReportに渡すことができます。
あとは、印刷を実行するボタンのclickのコード中に、
frxReport1 -> ShowReport();
と記述するだけで、
FastReportのデザインツールで作成したレポートのプレビュー画面が表示されます。
ただ、この方法は、実はあまりお勧めのやり方ではないのです。(理由は、あとで述べます。)
もう一つの方法は、frxReportコンポーネント以外に、
frxUserDatasetというデータセットコンポーネントを配置し、
そのプロパティにあるFieldsという項目(Listコンポーネントのitemsのような感じ)の欄に、
var1
var2
のように変数名を宣言しておいて、
FastReportの画面設計ツールのデータセット追加のウィンドウの中で、
自分がC++Builderの設計画面で追加した
frxUserDatasetを選んであげれば、
FastReportの画面ツールの右側のツールパレットのDataタブの中に、
追加したデータセットが表示され、そこに作成したフィールド名も追加されます。
FastReportの画面の中に、そのフィールドをドラッグして配置してあげればいいだけです。
そして、C++Builderの側からは、
frxUserDatasetのGetValuesイベントの中に、
その変数に値を渡すようにコードを書きます。
具体的には、GetValuesイベントのコードの中に、
if ( VarName == "var1") {
Value = Edit1->Text;
}
else if( VarName == "var2") {
Value = Edit2->Text;
}
のように記述すると、簡単にFastReportへの変数渡しができます。
データベースからDBコンポーネントに直接取得したデータをFastReportに渡す場合は、
こちらのページの動画が参考にした方がいいと思います。
さて、上の2つのデータ渡しの方法の最初の方法はお勧めしない理由をここから説明します。
最初の方法、つまり、C++Builder側でデータセットを作成しないで、
データを渡すやり方というのを実際に、コンパイル、リンクして、
プログラムの実行をし、プレビューするために配置した印刷ボタンをクリックしてみてください。
そして、プレビュー画面でプレビューしたあとに、
何か変数で渡した内容の不都合に気づいて、プレビューを閉じ、
いったんC++Builder側で実行中の、
Editなどが表示されている画面に戻り、Editに入力した値を変更してから、
再度、印刷ボタンをクリックして、プレビュー画面を開き直しても、
その変更した内容がプレビュー画面の内容に反映されないのです。
これはプログラム作成者にとっては、大問題です。
この点は、以前使用していたRaveReportとは大きく異なる点でした。
どうやら、FastReport側のスクリプト中で宣言されている変数に、
C++Builderから値をセットした場合に、プレビュー画面を閉じてから、
再度、C++Builder側のイベントで、変数を変更し、プレビュー画面を開き直しても、
FastReportのスクリプトにある変数の値は変更されないようなのです。
一方、frxUserDatasetコンポーネントの場合には、
プレビューを開くたびに、ちゃんとデータセットの内容を読み直してくれるようで、
ちゃんと変更した内容が反映されます。
ですので、C++BuilderでFastReportを使用する場合には、
frxUserDatasetコンポーネントを使って、FastReportにデータ渡しをした方が賢明です。
