OnManualBuild ページ イベント
通常、FastReport のコアがレポートの構築を担当します。レポート バンドを一定の順序で、データで要求される回数だけ表示することによって、完全なレポートを作成していきます。
ときには、FastReport のコアでは完成できない非標準のフォームでレポートを表示する必要が生じることもあります。この場合は、レポートのデザイン ページの OnManualBuild イベントを使用して、レポートを手動で構築することができます。このイベントのハンドラーが定義されていると、FastReport のコアは、データ出力が要求されたときにハンドラーへ制御を渡します。
その一方、FastReport のコアは、ページに配置されているレポート タイトル、ページ タイトル、列タイトル、レポート フッター、ページ フッター、列フッター、および背景などのバンドを自動的に表示します。またコアは、新しいページや列の作成も処理します。OnManualBuild イベントのハンドラーの目的は、データ バンドと、それらのタイトルおよびフッターをユーザー制御の順序で表示することです。
つまり、OnManualBuild ハンドラーの本質は、FastReport のコアに対し、特定の時期にバンドを表示するためのコマンドを与えることです。残りの部分はコア自体が行います。たとえば、現在のページに空き領域がなくなったらすぐに新しいページを作成したり、イベントにアタッチされたスクリプトを処理したりなどします。
簡単な例を使ってハンドラーを説明しましょう。このレポートには、データに接続されていない 2 つのマスター データ バンドがあります。
ハンドラーは、これらのバンドを交互にそれぞれ 6 回ずつ表示します。6 つのバンドが表示された後、小さなすき間が入れられます。
Pascal スクリプト:
procedure Page1OnManualBuild(Sender: TfrxComponent);
var
i: Integer;
begin
for i := 1 to 6 do
begin
{ 2 つのバンドを表示する }
Engine.ShowBand(MasterData1);
Engine.ShowBand(MasterData2);
{ すき間を作る }
if i = 3 then
Engine.CurY := Engine.CurY + 10;
end;
end;
C++ スクリプト:
void Page1OnManualBuild(TfrxComponent Sender)
{
int i;
for (i = 1; i <= 6; i++)
{
// 2 つのバンドを表示する
Engine.ShowBand(MasterData1);
Engine.ShowBand(MasterData2);
// すき間を作る
if (i == 3)
Engine.CurY = Engine.CurY + 10;
}
}
次の例は、同じバンドの 2 つ目のコピーを右へシフトさせて表示します。
Pascal スクリプト:
procedure Page1OnManualBuild(Sender: TfrxComponent);
var
i, j: Integer;
SaveY: Extended;
begin
SaveY := Engine.CurY;
for j := 1 to 2 do
begin
for i := 1 to 6 do
begin
Engine.ShowBand(MasterData1);
Engine.ShowBand(MasterData2);
if i = 3 then
Engine.CurY := Engine.CurY + 10;
end;
Engine.CurY := SaveY;
Engine.CurX := Engine.CurX + 200;
end;
end;
C++ スクリプト:
void Page1OnManualBuild(TfrxComponent Sender)
{
int i, j;
Extended SaveY;
SaveY = Engine.CurY;
for (j = 1; j <= 2; j++)
{
for (i = 1; i <= 6; i++)
{
Engine.ShowBand(MasterData1);
Engine.ShowBand(MasterData2);
if (i == 3)
Engine.CurY = Engine.CurY + 10;
}
Engine.CurY = SaveY;
Engine.CurX = Engine.CurX + 200;
}
}
ご覧のように、これらの例ではデータ バンドの出力だけを制御しました。残りのバンド(このケースでは "レポート タイトル")は自動的に出力されました。
最後に、これまでにいくつかのバージョンを示してきた「クライアントの一覧」を含むレポートを、OnManualBuild イベントを使用して構築する方法を示します。今回は、データ バンドをデータ ソースに接続します。
そして、次のスクリプトを使用します。
Pascal スクリプト:
procedure Page1OnManualBuild(Sender: TfrxComponent);
var
DataSet: TfrxDataSet;
begin
DataSet := MasterData1.DataSet;
DataSet.First;
while not DataSet.Eof do
begin
Engine.ShowBand(MasterData1);
DataSet.Next;
end;
end;
C++ スクリプト:
void Page1OnManualBuild(TfrxComponent Sender)
{
TfrxDataSet DataSet;
DataSet = MasterData1.DataSet;
DataSet.First();
while (!DataSet.Eof)
{
Engine.ShowBand(MasterData1);
DataSet.Next();
}
}
レポートをプレビューして、標準レポートと同じレポートがスクリプトによって生成されることを確認してください。Dataset へのリンクを取得する方法に注目してください。次のコードを使用して、データ ソースにデータセット変数を接続しました。
DataSet := MasterData1.DataSet;
マスター データ バンドがデータ ソースに接続されていない場合は、次の方法で必要なデータ ソースへのリンクを作成できます。
DataSet := Report.GetDataSet('Customers');
もちろん、対象とするデータ ソースは、[レポート]>[データ]メニューから開くダイアログで有効になっている必要があります。