旧Delphi FAQ – QuickReport

Abstract: このQ&Aは、旧www.borland.co.jp に掲載されていた記事を転載したものです。記事は掲載時点の情報をあるがままに掲載しており、新バージョンでのご利用においては、コンポーネントやAPIの仕様変更等によりご利用いただけない場合がありますのでご留意ください。

    QuickReport を使用して簡単な一覧表示を行なうには,どうしたら良いですか?

該当するバージョン:Delphi 2.0 Delphi 3.0/Delphi 3.1 Delphi 4

Q:
QuickReport コンポーネントを使用して簡単な一覧表示を行なうには,どうしたら良いですか?

A:
DBDEMOD の CUSTOMER.DB を用いて一覧表示を行なう方法をお知らせします。

  1. [ファイル(F)|新規作成(N)] より表示されるオブジェクトリポジトリから [フォーム] をクリックし QuickReport リストを選択します。
  2. Tableコンポーネント、DataSourceコンポーネントのプロパティの設定について説明します。

[Delphi2.0]

フォームに,TTable コンポーネントと TDataSource コンポーネントを配置します。

オブジェクトインスペクタで,以下のプロパティを設定します。

          Table1.Name : MasterTable
          MasterTable.DatabaseName : DBDEMOS
          MasterTable.TableName : CUSTOMER.DB
          DataSource1.DataSet : MasterTable

オブジェクトインスペクタで,QuickReport のプロパティを設定します。

          QuickReport.DataSource : DataSource1 

[Delphi3/Delphi4]

MasterTable.DatabaseName : DBDEMOS

MasterTable.TableName : CUSTOMER.DB

  1. 「このバンドに置かれたコンポーネントがページヘッダーとして表示されます。」(Delphi2.0)
    「このバンドにはカラムヘッダーを配置してください」(Delphi3/Delphi4)
    のようなコメントが記述されている,QRLabel1,QRLabel2,QRLabel3を削除します。

上から3番めのバンド Detail に,QRDBText コンポーネントを5つ配置します。このコンポーネントには,DataSource プロパティと DataField プロパティがあり,データセットの項目を表示することができます。

  1. 配置した QRDBText のそれぞれのプロパティを,オブジェクトインスペクタで設定します。
    *Delphi2.0では以下で定義する各コンポーネントのDataSourceプロパティにDataSource1を設定し、Delphi3/Delphi4では、DataSetプロパティにMasterTableを設定します。
     QRDBText1.DataField : CustNo
     QQDBText1.AutoSize : True;

     QRDBText2.DataField : Company
     QQDBText2.AutoSize : True

     QRDBText3.DataField : Zip
     QQDBText3.AutoSize : True

     QRDBText4.DataField : Addr1
     QQDBText4.AutoSize : True

     QRDBText5.DataField : Phone
     QQDBText5.AutoSize : True
  1. MasterTable の Avtive プロパティを True にして,QuickReport を右クリックしメニューを表示し、レポートプレビュー/プレビューを選択するとプレビューが表示されます。

アプリケーションから,上記のレポートフォームを使用して,印刷したりプレビューするには,このフォームクラスに印刷やプレビューを行なう手続きを追加します。

  1. QRListForm クラスの public 宣言に,以下の記述を追加します。
   type
     TQRListForm = class(TForm)
        QuickReport: TQuickReport;
        Title: TQRBand;
           :
           :
      private
        { Private 宣言 }
      public
        { Public 宣言 }
        procedure PreviewList;  //  追加
        procedure PrintList;    //  追加
     end;
  1. implementation 部に以下の手続きを記述します。
     implementation

     {$R *.DFM}
     procedure TQRListForm.PreviewList;
     begin
       QuickReport.Preview;
     end;

     procedure TQRListForm.PrintList;
     begin
        QuickReport.Print;
     end;
  1. この時点で,このフォームの印刷やプレビューを実行する手段が整いました。
    ここで,この手続きを実行するメインフォームを作成します。
    デスクトップには,レポートフォームの他に空のフォーム(Form1)があるはずです。このフォームをメインフォームとして使用します。
  2. メインフォームに,TButton を2つ配置します。
    オブジェクトインスペクタで,以下のプロパティを設定します。
   Button1.Caption : 印刷
   Button2.Caption : プレビュー
  1. 各Button の OnClick イベントに以下のように記述します。

Button1 の OnClick イベントに以下のように記述します。

   procedure TForm1.Button1Click(Sender: TObject);
   begin
      QRListForm.PrintList;
   end;

Button2 の OnClick イベントに以下のように記述します。

   procedure TForm1.Button2Click(Sender: TObject);
   begin
      QRListForm.PreviewList;
   end;

このメインフォームは,QRListForm を使用しますので,[ファイル(F)|ユニットを使う(U)] から,QRListForm のユニット(デフォルトであえば Unit2)を選択します。

  1. 以上の手順を行なって,コンパイル,実行してください。

    QuickReport を使用してマスターリンクレポートを行なうには

該当するバージョン:Delphi 2.0

Q:
QuickReport コンポーネントを使用してマスターリンクレポートを行なうには,どうしたら良いですか?

A:
マスターリンクレポートとは,1対多の関係にある2つのテーブルのリストです。
マスターテーブルの1つのレコードに対し,リンクテーブルの複数のレコードが表示されます。

DBDEMOS の VENDORS.DB と PARTS.DB を用いて,マスターリンクレポートを作成します。

  1. [ファイル(F)|新規作成(N)] より表示されるオブジェクトリポジトリから [フォーム] をクリックし「QuickReport マスター/リンクフォーム」を選択します。

このフォームの,Detail と DetailFooter という QRBand コンポーネントの BandType プロパティに,rbSubDetail と rbGroupFooter が設定されています。
これらのプロパティを持つバンドは,QRDetailLink のよってマスターテーブルと接続され,1対多の関係が成立します。

  1. フォームに,TTable コンポーネントと TDataSource コンポーネントを2つずつ配置します。
    オブジェクトインスペクタで,以下のプロパティを設定します。
Table1.DatabaseName : DBDEMOS
Table1.TableName : VENDORS.DB
DataSource1.DataSet :Table1
Table2.DatabaseName : DBDEMOS
Table2.TableName : PARTS.DB
DataSource2.DataSet : Table2
Table2.MasterSource :DataSource1

ここで,オブジェクトインスペクタの MasterField プロパティをダブルクリックして,「リンク項目の設計」ダイアログを表示します。選択可能なインデックス(V)から VendorNo を選択し,リンク項目とマスター項目の VendorNo をそれぞれ選択して「追加(A)」ボタンを押します。「OK」ボタンを押して,リンク項目を設定します。

QuickReport.DataSource : DataSource1
DetailLink.DataSource : DataSource2

「このバンドに置かれたコンポーネントがページヘッダーとして表示されます。」,
「このバンドに置かれたコンポーネントがマスター情報となります。」
などのようなコメントが記述されている,QRLabel1,QRLabel2,QRLabel3, QRLabel4,QRLabel4 を削除します。

  1. Master バンドの高さを大きくし,Master バンド上に QRDBText を4つ配置します。
    オブジェクトインスペクタで,以下のプロパティを設定します。
QRDBText1.DataSource : DataSource1
QRDBText1.DataField : VendorNo
QRDBText2.DataSource : DataSource2
QRDBText2.DataField : VendorName
QRDBText2.AutoSize : True
QRDBText3.DataSource : DataSource1
QRDBText3.DataField : Phone
QRDBText4.DataSource : DataSource1
QRDBText4.DataField : FAX
  1. それぞれの QRDBText の左側に QRLabel を配置して,QRDBText 項目にラベルをつけます。
    オブジェクトインスペクタで,以下のプロパティを設定します。
QRLabel1.Caption : VendorNo
QRLabel2.Caption : VendorName
QRLabel3.Caption : Phone
QRLabel4.Caption : FAX
  1. Detail バンドには,PARTS.DB の項目を表形式で表示します。
    Detail バンドの高さを大きくし,Detail バンド上に QRDBText を6つ配置します。
    オブジェクトインスペクタで,以下のプロパティを設定します。
QRDBText5.DataSource : DataSource2
QRDBText5.DataField : PartNo
QRDBText6.DataSource : DataSource2
QRDBText6.DataField : Description
QRDBText7.DataSource : DataSource2
QRDBText7.DataField : OnHand
QRDBText8.DataSource : DataSource2
QRDBText8.DataField : OnOrder
QRDBText9.DataSource : DataSource2
QRDBText9.DataField : Cost
QRDBText10.DataSource : DataSource2
QRDBText10.DataField : ListPrice
  1. Detail バンドの上に新しいバンドを配置します。
    オブジェクトインスペクタで,以下のプロパティを設定します。
新しいバンドの name : DetailHeader
DetailHeader.BandType : rbGroupHeader
DetailLink.HeaderBand :DetailHeader

これで,このバンドが Detail のヘッダバンドとして機能するようになります。
上記 5 と同じ方法で,DetailHeader に QRLabel を6つ配置してヘッダ行を作成します。
オブジェクトインスペクタで,以下のプロパティを設定します。

QRLabel5.Caption : PartNo
QRLabel6.Caption : Description
QRLabel7.Caption : OnHand
QRLabel8.Caption : OnOrder
QRLabel9.Caption : Cost
QRLabel10.Caption : ListPrice
  1. ふたつの TTable の Avtive プロパティを True にして,QuickReport をダブルクリックするとレポートプレビューが表示されます。

アプリケーションから,上記のレポートフォームを使用して,印刷したりプレビューするには,このフォームクラスに印刷やプレビューを行なう手続きを追加します。

  1. QRListForm クラスの public 宣言に,以下の記述を追加します。
      type
        TQRListForm = class(TForm)
          QuickReport: TQuickReport;
          Title: TQRBand;
            :
            :
        private
          { Private 宣言 }
        public
          { Public 宣言 }
          procedure PreviewList;  //  追加
          procedure PrintList;    //  追加
        end;
  1. implementation 部に以下の手続きを記述します。
      implementation

      {$R *.DFM}

      procedure TQRMDForm.PreviewList;
      begin
        QuickReport.Preview;
      end;

      procedure TQRMDForm.PrintList;
      begin
        QuickReport.Print;
      end;
  1. この時点で,このフォームの印刷やプレビューを実行する手段が整いました。
    ここで,この手続きを実行するメインフォームを作成します。
    デスクトップには,レポートフォームの他に空のフォーム(Form1)があるはずです。このフォームをメインフォームとして使用します。
  2. メインフォームに,TButton を2つ配置します。
    オブジェクトインスペクタで,以下のプロパティを設定します。
    Button1.Caption : 印刷
    Button2.Caption : プレビュー
  3. Button1 の OnClick イベントに以下のように記述します。
       procedure TForm1.Button1Click(Sender: TObject);
       begin
         QRMDForm.PrintList;
       end;

Button2 の OnClick イベントに以下のように記述します。

       procedure TForm1.Button2Click(Sender: TObject);
       begin
         QRMDForm.PreviewList;
       end;
  1. このメインフォームは,QRMDForm を使用しますので,[ファイル(F)|ユニットを使う(U)] から,QRMDForm のユニット(デフォルトであえば Unit2)を選択します。
  2. 以上の手順を行なって,コンパイル,実行してください。

    QuickReport を使用して罫線を引くには,どうしたら良いですか?

該当するバージョン:Delphi 2.0 Delphi 3.0/Delphi 3.1 Delphi 4

Q:
QuickReport コンポーネントを使用して罫線を引くには,どうしたら良いですか?

A:
罫線の描画には,QRShape コンポーネントを使用します。QRBand の 高さを高くして QRShape コンポーネントを配置しやすくします。
rbDetail バンドは,グリッド表示の行に相当します。ここに,QRShape を配置して一行分の罫線を描いておけば,表が作成できます。

  1. ebDetail には,項目のデータ表示のために QRDBText が配置されています。
    QRShape を QRDBText の上に配置します。 QRDBText は,QRShape に下に隠れていましますが,配置した QRShape を選択して,マウスの右ボタンをクリックし,「背面に移動(B)」を選択すると QRDBText は上に表示されます。
  2. QRShape の Top プロパティを 0 に設定し,大きさを適当に変更します。
    配置されている QRDBText の数と同じ QRShape を隣接して配置し,表に一行分のセルを作成します。
  3. すべての QRShape の高さ( Height プロパティ)を同じにし,rbDetail バンドの Height プロパティを QRShape の Height プロパティよりも 1 少なく設定します。これは,上の罫線と下の罫線が重なって線が太くなるのを防ぐためです。

    TQRExpr が DisplayFormat の設定を認識しません

該当するバージョン:Delphi 3.0/Delphi 3.1 Delphi 4

Q:
TQRExpr が DisplayFormat の設定を認識しません:
簡単に対応できますか?

A:
TQRExpr コンポーネントの替わりに TQRDBText コンポーネントを使用すると簡単に対応できます。TQRDBText は,DisplayFormat を認識します。

    QuickReport QRExpr コンポーネントの使用方法

該当するバージョン:Delphi 3.0/Delphi 3.1 Delphi 4

QuickReport の QRExpr コンポーネントを使用すると,レポートのプレビュー,印刷の時に汎用的な計算結果を得る事ができます。計算の種類は Expression プロパティを使用して設定します。

ここではフォーム上に QuickReport を使用して Delphi のサンプルデータ,ANIMALS.DBF が表示されている時に,SIZE 項目の平均値を QRExpr を使用して表示する手順を説明します。
以下の手順を実行すると,プレビュー時に QRExpr コンポーネントに計算結果が表示されます。

(Delphi3での手順)

  1. オブジェクトインスペクタの Expression プロパティをダブルクリックして「式の設定」ダイアログを表示します。
  2. 「選択可能な関数」の中から AVERAGE を選択して「追加」ボタンを押します。
    「AVERAGE(」 とダイアログの中に表示されます。
  3. データ項目の中から SIZE を選択して「追加」ボタンを押します。
    (データ項目になにも表示されていない場合には、Table1.ActiveプロパティをTrueに変更してください)
    リストボックスの中に TABLE1.SIZE と表示されます。
  4. 「OK」ボタンを押すとリストボックスには AVERAGE( TABLE1.SIZE ) と表示されます。
  5. 「OK」ボタンを押してダイアログを閉じます。

(Delphi4での手順)

  1. オブジェクトインスペクタの Expression プロパティをダブルクリックして「式の設定」ダイアログを表示します。
  2. 「関数」ボタンを押します。統計をクリックすると、選択可能な関数にAVERAGEが表示されますので、それを選択し、「次へ」ボタンを押します。
  3. 第1引数の入力の後ろにある「...」ボタンを押します。
  4. 「項目」ボタンを押します。選択可能な項目の中にTable1の項目が表示されていますので、その中からSIZEを選択し、「OK」ボタンを押します。
  5. AVARAGE()の第1引数の入力の欄に、Table1.SIZEと表示されているのを確認後、「OK」ボタンを押します。
  6. 第1引数-数値の欄にTable1.SIZEが表示されているのを確認後、「OK」ボタンを押します。
  7. 式を入力してください。にAVARAGE(TABLE1.SIZE)と表示されているのを確認後、「OK」ボタンを押してダイアログを閉じます。

    QuickReport でデータソースを使用せずにレポートを作成する

該当するバージョン:Delphi 2.0 Delphi 3.0/Delphi 3.1 Delphi 4

Q:
QuickReport では Delphi データソースの内容をレポートにできますが,テーブル以外の内容をレポートにする事はできないのでしょうか。

A:
QuickReport には Delphi データソース以外からレポートを作成するために OnNeedData イベントが用意されています。このイベントを使用してレポートを作成する事ができます。
まず,DataSet を使用せずにレポートを作成する際の基本的な処理の流れについて説明します。

  1. BreforePrint イベントで変数の初期化を行います。
  2. OnNeedData イベントで印刷する文字列を QRLabel などに設定します。
    引数 MoreData が True であるならば,印刷後,さらに OnNeedData イベントが発生します。
    MoreData を False に設定すると,OnNeedData イベントの発生は終了します。

以下のサンプルはメモコンポーネントの内容を QRLabel コンポーネントに表示してレポートの作成を行うものです。Form1 に配置したボタンを押すと Form2 のプレビューを実行します。

ユニット

       Unit1 // レポートの印刷フォーム

フォーム

       Form1

コンポーネント

       Memo1 : TMemo
       Button1 : TButton

ユニット

       Unit2 // レポートフォーム

フォーム

       Form2

コンポーネント

       QuickRep1 : TQuickRep   // Delphi2.0の場合 TQuickReport
       DetailBand1 : TQRBand 
       QRLabel1  : TQRLabel  //DetailBand1 上に配置

変数

       CurrentItem : Integer (グローバルに宣言)

[処理]

  1. 各ユニットの implementation 部以降に 以下のように追加して,それぞれのフォームを参照できるようにします。

* Unit1

     uses Unit2;

* Unit2

     uses Unit1;
  1. Unit2 に配置した QuickReport の BeforePrint イベントに以下のように記述します。
   CurrentItem := 0;
   PrintReport := True;
  1. QuickReport の OnNeedData イベントに以下のように記述します。
    // Memo の行数と比較して QRLabel に内容を設定
    if CurrentItem < Form1.Memo1.Lines.Count then
       QRLabel1.Caption := Form1.Memo1.Lines[CurrentItem];

    // CurrentItem のカウンタを1つ増やす
     CurrentItem := CurrentItem + 1;
    // Memo の印刷が終了した時点で MoreData を False に設定して
    // OnNeedData の処理を終了
     if CurrentItem = Form1.Memo1.Lines.Count then
        MoreData := False
     else
        MoreData := True;
  1. Unit1 の Button の OnClick イベントに以下のように記述します。
      Form2.QuickRep1.Preview;

    QuickReportのPreview表示から、レポートの読み込みと保存、プリンタの設定ボタンを消すには、どのようにしたらよいのでしょうか? (99/5/12)

該当するバージョン:Delphi 3.0/Delphi 3.1 Delphi 4

Q:
QuickReportのPreview表示から、レポートの読み込みと保存、プリンタの設定ボタンを消すには、どのようにしたらよいのでしょうか?

A:
通常,Previewで表示されているのは,TQRStandardPreviewを使用して表示されて います。レポートの読み込みや保存,プリンタの設定ボタンは,その中で定義されているDelphi4ではToolButton、Delphi3ではSpeedButtonになっていますので,個々のVisibleプロパティをFalseにする事で 消すことが可能になります。
以下のサンプルを参考にしてください。

  unit Unit2;

  interface

  uses Windows, SysUtils, Messages, Classes, Graphics, Controls,
    StdCtrls, ExtCtrls, Forms, Quickrpt, QRCtrls, QRPrev, QRPrntr, Db,
    DBTables;

  type
    TQuickReport2 = class(TQuickRep)
      Table1: TTable;
      QRBand1: TQRBand;
      QRLabel1: TQRLabel;
      QRDBText1: TQRDBText;
      procedure QuickReport2Preview(Sender: TObject);
    private

    public

    end;

  var
    QuickReport2: TQuickReport2;

  implementation

  {$R *.DFM}

  procedure TQuickReport2.QuickReport2Preview(Sender: TObject);
  var
  test1 : TQRStandardPreview;
  begin

       TEST1 := TQRStandardPreview.CreatePreview(Application,TQRPrinter(Sender));
       TEST1.SaveReport.Visible := false;    //Delphi3.0/3.1ではTEST1.Save.Visible
       TEST1.LoadReport.Visible := false;    //Delphi3.0/3.1ではTEST1.Load.Visible
       TEST1.PrintSetup.Visible := false;
       TEST1.Show;
  end;
  end.