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;
試したわけではありませんが、
QuickReportのヘルプには、
>NewPage メソッドを使用すると,レポートは次のページに移動します。
>このメソッドをレポート生成中に任意のバンドの AfterPrint イベントで呼び出せば,
>レポートの改ページの位置を制御できます。
とありますので、NewPage メソッドをAfterPrint イベントで呼び出すようにしてみるのは
、いかがですか?
QuickRepにはページヘッダ、デティール、ページフッタのバンドがおいてあり
デティールバンド上にQRImageを置いて、それに描画しています。
Quickrep1,Previewとすると、一度目の描画が終わった状態でプレビューされます。そこで、次のページを書くためにQRImageを一度消して、NewpageもしくはMoredata := trueとするコードを書き加えると全くプレビューできなくなります。ステータスバーのページ表示も「1/0」となってページが存在しないかのようになってしまいます。デティールバンドの残念ながらBeforePrint,AfterPrintにNewpageを加えてみましたがだめでした。
>だめでした。
実際、試したコードは、どのように記述してますか?
# こちらで、実際に試したところ、NewPageメソッドをDetailBandのAfterPrint イベントで
# 呼び出したら、正しく改ページされてました。
ちなみにこちらで試したのは、以下のコードです。
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;
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するはずですが。
レスポンスありがとうございます。ソースコードは職場のマシンに入って
いるので、明日見直して試してみます。
>また、OnNeedData内でNewPageをしてしまうと、新しいページに移動しますが、
>改めてOnNeedDataが発生するため、NewPage→OnNeedData と、
>無限ループしているのではないでしょうか?
そこでした。以前に書いたプログラムではループの中でCurrentItemをはんだインしていましたが、今回はループで書くのではないので、上記引用のようなコードになっていました。ありがとうございました。
ツイート | ![]() |