4D-JUG
Would you like to react to this message? Create an account in a few clicks or log in to continue.

【おぼえがき】極細線(幅0)と太線(幅1)を用いた帳票デザインの原則

Go down

【おぼえがき】極細線(幅0)と太線(幅1)を用いた帳票デザインの原則 Empty 【おぼえがき】極細線(幅0)と太線(幅1)を用いた帳票デザインの原則

投稿 by miyako on 2019-01-31, 3:53 pm

PDF帳票で,数行起きに水平線が二重に出力されたり,拡大してみると垂直線が接触していなかったりする例をときたまみかけます。

いろいろやってみた気づいたことをまとめてみました。

パターン a

全体を囲む太線は四角形を使用する・・・rect

rectの上 = 垂直線の上 = y1
行毎の極細水平線 = ヘッダー = y2
詳細 = (y3 - 2)
ブレーク = フッター = rectの下 = 垂直線の下 = y3

(ブレーク行を特に使用しない場合)

ポイント:行毎の極細水平線をy3(つまり行の下)に置かない

パターン b

(印刷時可変サブフォームの場合)

サブフォーム全体の設定はパターン aと同じ

この場合,サブフォームのrectの下が切れるので,
親フォーム側でサブフォームのすぐ下にラストの水平線(太線)を置く・・・line

サブフォームの下 = y1
line = y1 -1

パターン c

(改ページでブレークが挿入される場合)

ポイント:ブレークの位置は,ページの下端から逆算され,隙間が発生するかもしれない。

ブレークの高さ(フッターの位置)を計算するには

GET PRINTABLE AREA($height) で得られた高さが825(A4タテ)の用紙で下記のような帳票を出力する場合

ヘッダー:92
詳細の高さ(詳細 - ヘッダー):22
ブレークの高さ(フッター - ブレーク):20

825(用紙) - 92(ヘッダー) - 20(ブレークの高さ) = 713 なので,
713 \ 22 = 32行の詳細が出力されると,強制的に改行ブレークが挿入されることになります。

前述したように,各行の区切り水平線(極細)は,ヘッダーと同じ位置にあればきちんと出力されます。
しかし,強制的に改行ブレークが挿入された場合,後続の詳細がないので,下の罫線が無い格好になってしまいます。
各行の下端(y座標 = 詳細)に極細線を重ねた場合,その線はフッターと一緒に印刷され,ブレークでは印刷されません。

そこで,改行ブレークが挿入されたときに下端が空かないよう,
ブレークの上橋(y座標=ブレーク)に極細線を置くことになりますが,
ブレークは,92(ヘッダー) + 704(詳細の合計) = Get printed height = 796 から始まるわけではなく,
825(用紙) - 20(ブレークの高さ) = 805 から始まるので,隙間が発生します。
改ページで自動的に挿入されるブレークは,用紙に対して下揃えだからです。
この場合,つまり,713(詳細の合計) % 22(詳細の高さ) = 9 の隙間が詳細のブレークの間に発生します。

ブレークがGet printed height = 796 から始まるようにするためには,
フッターのマーカーを下方に移動し,ブレークの高さを少し増やせば良いはずです。

試してみると,ブレークの高さは,9(ブレークの高さ) + 1まで増やすことができました。
計算上,825(用紙) - 92(ヘッダー) - 30(ブレークの高さ) = 703 であり,
32行まで印刷するには,0.046足りないのですが,
とにかく32行の詳細がブレークの前に出力されました。

これでページラストの詳細を出力した直後のGet printed heightにブレークが出力されるかというと,
そうでもないようで,y座標=ブレークに置いた極細線は確かに印刷されるのですが,
下 = ブレークの垂直線と微妙に接触せず,まだちょっとだけ隙間があります。

ブレークの出力が詳細を32行を印刷したときのGet printed height = 796 ではなく,
825(用紙) - 30(ブレークの高さ) = 795 からスタートしているためだと思われます。

つまり,前述した0.046だけ詳細とブレークが重なっていることになります。

ブレークから上に飛び出すような垂直線を置けば,
詳細の垂直線とうまくつながり,隙間は埋められるのですが,
この位置(y座標=ブレーク)に置いたオブジェクトは,
最終ページのフッター印刷でも出力されてしまうので問題です。

$event:=Form event

Case of
: ($event=On Printing Footer)

If (End selection([見積書]))
OBJECT SET VISIBLE(*;"@break";False)
End if

End case

のようなコードを記述し,改ページによって挿入されたブレークが詳細とくっつくよう,
(y座標=ブレーク)に置いたオブジェクトが,
フッター印刷時には消えるようにすればOKでした。

miyako

投稿数 : 375
登録日 : 2016/07/05

トップに戻る Go down

トップに戻る


 
Permissions in this forum:
返信投稿: 不可