4D プロジェクトフォームとテーブルフォーム、イベントプロパティが違う その2

以前のブログで間違いがあったので修正するとともに、印刷用フォームについて再考した。プロジェクトフォームとテーブルフォームで制御できるイベントプロパティが違うのは「テーブルのレコードセレクションを前提としたイベントがプロジェクトフォームではサポートされていない」ということだった。以前ブログを書いた時の理解が足りていなかっただけで、考えてみればプロジェクトフォームには帰属するテーブルがないから、セレクションを前提としたプロパティが設定できないのは当たり前だ。

たとえばプロジェクトフォームのプロパティには「On Printing Detail」などの印刷時に発生しそうなプロパティがない。これはPrint selectionの時に有効で、セレクションが必要なのでテーブルに帰属していることが前提になるためにテーブルフォームにしかないプロパティなのだ。

たとえば、印刷時に「文字列が多くて印字領域に収まらなかった時に文字フォントを小さくして印刷する」という技を使っているのだが、これは印字しようとしている文字列長によって適用するかしないかが異なる。「On Printing Detail」が発生した時、文字列を一度配置してみて文字列オブジェクトの矩形の長さを評価して、所定の幅に収まりきらなかったら小さいフォントサイズを再設定するという仕様だ。それで「On Printing Detail」にコードを記述することになる。この実装がプロジェクトフォームでもテーブルフォームでも動いてしまう。あれっ、と思って調べたらどちらのフォームにも「On Printing Detail」イベント(Form event = 23)が発生していたのだ。では、テーブルフォームで「On Printing Detail」チェックを外したらどうなるか。これでも「On Printing Detail」イベントは発生していた。

印刷時に使っているコマンドは次。

Print form([Z_PrintForm];”PP11_PrintList”;Form detail)

ここで印刷するフォームオブジェクトに配置されているのは配列要素またはプロセス変数でありテーブルのセレクションは無関係。

Print formではフォームプロパティのイベント「On Printing Detail」のチェックオフが無視される。Print formでForm detailを直接印刷しているため、4Dが内部的に「On Printing Detail」イベントを発生させているように見える。よく見たらPrint formの説明に書いてあった。つまり、Print formを使うということは、印刷イベント「On Printing Detail」を強制的に発生させるという意味であり、フォームのプロパティ設定は無視される、ようだ。しかしヘッダーを印刷するとき、つまりPrint formの指定領域が「Form header」でも同じイベント「On Printing Detail」が発生するのはわかりにくい。どうやら指定領域ごとに異なるイベントを発生させる必要はない、と考えているようだ。まあ実用上は問題ないかもしれない。次のコードはいずれも「On Printing Detail」が発生した。

Print form([Z_PrintForm];”PP11_PrintList”;Form header)
Print form([Z_PrintForm];”PP11_PrintList”;Form detail)
Print form([Z_PrintForm];”PP11_PrintList”;Form footer)

以前のブログは次のように補足しよう。

1)Print formを使う場合、「On Printing Detail」イベントプロパティのチェックは印刷時に影響しない。

2)配列を印刷する場合のフォームはプロジェクトフォームでもテーブルフォームでもよい。

Print formで配列を印刷する場合はセレクションが関係しないため、どちらにフォームを作っても問題はない。テーブルフォームに作ることもできるがテーブルに帰属させる必要性はない。フォームを整理するという側面からは、テーブルの内容を一覧する(配列に転送したとしても)ものはそのテーブルのフォームに作る、ことは意味があるかもしれない。

しばらくは、印刷用フォーム専用テーブル[Z_PrintForm]に印刷フォームを作成して、プロジェクトに印刷フォームがどのくらいあるかを把握できるようにしたい。フォーム名は出力するデータの元のテーブルのプレフィックスをつけて、10番代から始める。たとえば上記であれば、PPというお売りフィックスのテーブルの1番目の印刷フォーム「PP11_」をつけてフォーム名を続ける。「PP11_SiharaiIchiran」とか。

以前のブログはこちら
4D プロジェクトフォームとテーブルフォーム、イベントプロパティが違う その1