Search Results for

    Show / Hide Table of Contents

    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');
    

    もちろん、対象とするデータ ソースは、[レポート]>[データ]メニューから開くダイアログで有効になっている必要があります。

    Back to top © Copyright Fast Reports Inc.