DBを使わないQuickreportでの改ページ

解決


ハフナー  2010-06-05 13:36:38  No: 38624  IP: 192.*.*.*

Quickreportを使って、複数枚の図面を描こうとしています。1枚書いたら
改ページして次に図面、というようにしたいのですが、改ページしません。
何が足りないのでしょうか?

procedure TFrmPrev.QuickRep1BeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
begin
  Printreport := true;
end;

procedure TFrmPrev.QuickRep1NeedData(Sender: TObject;
begin
  Drawframe;
  with QRImage1.Canvas do begin
//    描画ルーチン
  end;
  QuickRep1.NewPage;
  Moredata := true;
  with QRImage1.Canvas do begin
//    描画ルーチン
  end;
end;

編集 削除
igy  2010-06-05 15:13:35  No: 38625  IP: 192.*.*.*

試したわけではありませんが、

QuickReportのヘルプには、

>NewPage メソッドを使用すると,レポートは次のページに移動します。
>このメソッドをレポート生成中に任意のバンドの AfterPrint イベントで呼び出せば,
>レポートの改ページの位置を制御できます。

とありますので、NewPage メソッドをAfterPrint イベントで呼び出すようにしてみるのは
、いかがですか?

編集 削除
ハフナー  2010-06-06 00:23:38  No: 38626  IP: 192.*.*.*

QuickRepにはページヘッダ、デティール、ページフッタのバンドがおいてあり
デティールバンド上にQRImageを置いて、それに描画しています。
Quickrep1,Previewとすると、一度目の描画が終わった状態でプレビューされます。そこで、次のページを書くためにQRImageを一度消して、NewpageもしくはMoredata := trueとするコードを書き加えると全くプレビューできなくなります。ステータスバーのページ表示も「1/0」となってページが存在しないかのようになってしまいます。デティールバンドの残念ながらBeforePrint,AfterPrintにNewpageを加えてみましたがだめでした。

編集 削除
igy  2010-06-06 01:55:10  No: 38627  IP: 192.*.*.*

>だめでした。

実際、試したコードは、どのように記述してますか?

# こちらで、実際に試したところ、NewPageメソッドをDetailBandのAfterPrint イベントで
# 呼び出したら、正しく改ページされてました。

編集 削除
igy  2010-06-06 08:19:33  No: 38628  IP: 192.*.*.*

ちなみにこちらで試したのは、以下のコードです。

const
    MAX_IMAGE = 3;

procedure TRepDlg.QuickRep1BeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
begin
    CurrentItem := 0;
    PrintReport := True;
end;

procedure TRepDlg.QuickRep1NeedData(Sender: TObject; var MoreData: Boolean);
begin
    MoreData := (CurrentItem < MAX_IMAGE);
    if not MoreData then    exit;

    QRImage1.Canvas.TextOut(10, 10, IntToStr(CurrentItem + 1) + '枚目');
    inc(CurrentItem);
end;

procedure TRepDlg.DetailBand1AfterPrint(Sender: TQRCustomBand;
  BandPrinted: Boolean);
begin
    if CurrentItem < MAX_IMAGE then
        QuickRep1.NewPage;
end;

編集 削除
ぽむぽむ  2010-06-06 22:31:14  No: 38629  IP: 192.*.*.*

OnNeedDataは、DetailBandを処理する前に1回発生するイベントです。
OnNeedData内で、QRImageに描画してもかいまいませんが、1レコード(1ページ分)のみ処理します。
10の画像がある場合、10回のOnNeedDataイベントでMoreData := True とし、
11回目の OnNeedDataでMoreData := False とします。

また、OnNeedData内でNewPageをしてしまうと、新しいページに移動しますが、
改めてOnNeedDataが発生するため、NewPage→OnNeedData と、
無限ループしているのではないでしょうか?
NewPage は、ヘルプの通り AfterPrint で実行するのがよいと思います。

もっとも、QRImageのサイズが大きく、1ページ内に2枚以上配置できないものであれば
NewPageを使わなくても、勝手にNewPageするはずですが。

編集 削除
ハフナー  2010-06-06 23:11:16  No: 38630  IP: 192.*.*.*

レスポンスありがとうございます。ソースコードは職場のマシンに入って
いるので、明日見直して試してみます。

編集 削除
ハフナー  2010-06-07 16:42:19  No: 38631  IP: 192.*.*.*

>また、OnNeedData内でNewPageをしてしまうと、新しいページに移動しますが、
>改めてOnNeedDataが発生するため、NewPage→OnNeedData と、
>無限ループしているのではないでしょうか?

  そこでした。以前に書いたプログラムではループの中でCurrentItemをはんだインしていましたが、今回はループで書くのではないので、上記引用のようなコードになっていました。ありがとうございました。

編集 削除