hatena
hatena
2023/12/28 (木) 11:49:58
フォーマット時イベントで関係する設定を計算してレイアウトを決定します。印刷時イベントでは、それを出力するだけですので、印刷時ではレイアウトは変更できません。
印刷時拡張後の高さは印刷時にしか取得できない、しかし、レイアウト変更は印刷時ではできない、レイアウトの設定には印刷時拡張後の高さが必要である、
ということで普通の方法では不可能な状態です。
そこで利用するのが、下記で紹介している総ページを取得するときのダミーのフォーマット時イベントです。
レポートのイベントの発生メカニズムの研究 その2 - hatena chips
総ページを取得するために最終レコードまでダミーのフォーマット時イベントを発生させる。
その後、先頭に戻って、本番のフォーマット時、印刷時イベントを発生させて実際に出力する。
という動作になってます。
これを利用して、下記のような処理にします。
ダミーのフォーマット時に配列に各行毎の印刷時拡張後の高さを格納しておく。
本番のフォーマット時に配列から印刷時拡張後の高さを取得してそれをもとにレイアウトを設定する。
レポート上のどこでもいいので、総ページ数を取得するためにコントロールソースが=[Pages]
のテキストボックスを配置しておく。(すでに総ページ数を表示するためのテキストボックスがあるなら不要)
下記のような感じでレイアウトを設定できます。
Option Compare Database
Option Explicit
Dim h() As Long '印刷時拡張後の高さを格納する配列
'開くとき
Private Sub Report_Open(Cancel As Integer)
Redim h(1 to Me.Recordset.RecordCount) '配列のサイズをレコード数分に設定
End Sub
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
If Me.Pages = 0 Then 'ダミーのフォーマット時はPages=0
h(Me.CurrentRecord) = Me.詳細.Height
Else
Dim exHeight As Long
exHeight = h(Me.CurrentRecord)
'exHeightに拡張後の高さが格納されているのでそれを利用してレイアウトを設定
End If
End If
通報 ...