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

解決


ハフナー  2010-06-05 22:36:38  No: 38624

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-06 00:13:35  No: 38625

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

QuickReportのヘルプには、

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

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


ハフナー  2010-06-06 09:23:38  No: 38626

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


igy  2010-06-06 10:55:10  No: 38627

>だめでした。

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

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


igy  2010-06-06 17:19:33  No: 38628

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

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-07 07:31:14  No: 38629

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-07 08:11:16  No: 38630

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


ハフナー  2010-06-08 01:42:19  No: 38631

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加