GroupHeader を使った時の改ページ制御


うめももさくら  2006-12-22 21:09:12  No: 24336

Delphi6 Pro、Win2K、SQL Serverです。
クイックリポートでGroupHeaderを使ってみました。

G.Header
+Detail

のようにした場合、Detailが途中で次のページになってしまいます。

その場合、
① 改ページしたページの先頭行にヘッダーを再出力
② 途中で改ページされる場合には、予め改ページする

等の処理はどのようにしたら良いのでしょうか?
お願いします。


orz  2006-12-23 01:21:52  No: 24337

(1)ページヘッダではないので簡単にはできないでしょう。
GroupHeader・・・TQRBandですが、これにはprotectedでPrintと
呼ばれるメソッドがあり、これを使うと、もしかしたら出せるかも
しれませんが、外部から呼ぶことはできないようです。

(2)印刷に必要なDetailBandの高さを知る方法が、おそらくありません。

これをふまえて・・・
[その1]
将来的に使えなくなるかもしれない、コンパイラに依存していると
言われることもある強引な方法。

type
  TMyQuickRep=class(TQuickRep)
  end;
  TMyQRController=class(TQRCustomController)
  end;

DetailBandBeforePrint で 適当なフラグOn
DetailBandAfterPrint で 適当なフラグOff

QucikRep.OnNewPage(ちょっとうろおぼえ)で、適当なフラグOnであれば
  TMyQRController(TMyQuickRep(QucikRep).Controller).PrintGroupHeaders;
を実行。

同一ユニット内のクラスなら、protectedメンバにアクセスできるという
環境依存の魔法を使った方法。

[その2]
正直、普通には無理っぽいので、GroupHeaderの内容と同じものを、
PageHeaderのChildに作成し、[その1]同様、適当なフラグのOn/Offで
PageHeader.ChildBandのOnPrintイベントでの引数PrintBandを
On/Off切り換え。

[その3]
あきらめて、グループ単位で改ページする。
こうすれば、ページヘッダにグループヘッダの内容を用意しておくだけで
済むので、非常にラク。

なお、できるかどうか試したわけではないので、ご了承願います。
(QR3.x系の環境がありません)

余談ですが、例えば1行分の高さのDetailBandにQRMemoを2個貼り付けて、
それぞれ10行分のデータを印刷させようとすると、本当は9行分の
高さの拡張があればいいのですが、QRMemoが、それぞれ9行分バンド高を
拡張するため、9行分の空行ができるという、おもしろ機能があります。
QR3.0系では直っているんでしょうかね?
直っているなら、もしかすると(2)の必要な高さを知る関数が
あるのかもしれません。

さらに詳しい方プリーズ


orz  2006-12-23 01:24:36  No: 24338

余談2
うめももさくらって、うちの本棚の奥にある・・・


かず  2006-12-24 06:27:33  No: 24339

1.
質問のとおりGroupHeaderは条件が変わったときにしか印刷しません。
私の場合はColumnHeaderの中にGroupHeaderの印刷内容を入れます。
GroupHeaderは改ページ制御のみでHeightは0にします。

2.DetailのHeightが変化し、改ページで割れないようにするには、ページでDetailが印刷できる長さを計算し、Detailを印刷する前に印刷可能かを判断します。高さが足りないようであれば、改ページ用Bandで処理します。
Detailを印刷するたびに、Height分を引き算します。


うめももさくら  2006-12-24 22:22:45  No: 24340

回答ありがとうございます。

グループ毎に改ページすると・・余白だらけの頁の方が多くなってしまうので、
良い改ページ方法を模索しております。

お二人の回答からすると、①の方が手間は少ない様に思えますので
まず、①の方法を試してみたいと思います。

同じような需要は、他の方もあると思うのですが。。


死神core2duo  2006-12-25 01:24:52  No: 24341

たぶん かず氏 のカラムヘッダーを使うのが正解

> Detailを印刷するたびに、Height分を引き算します。
これは、orz 氏の文中にもありますが、QRMemo等の高さ可変のコントロールがあり、
高さが変わる場合、Heightでは正しい結果が返ってこないはずです。
固定の高さであれば、Heightで確認するのは有効です。

あたくしはソースがあるので、ページ内に収まるかを返す関数つくりましたけど。


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

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






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