4D プロジェクトフォームとテーブルフォーム、イベントプロパティが違う
DBを集計した結果を画面に表示して、それをそのまま印刷したいと考えた。結構複雑な集計表なので印刷用と2つ作って両方をメンテするのは面倒。複数のテーブルから情報収集しているので、この印刷フォームは特定のテーブルに帰属させたくない、ということでプロジェクトフォームを作った。
4Dのフォームにはテーブルフォームとプロジェクトフォームがあって、前者はテーブルに帰属している、テーブルが削除されると同時に削除される。後者はプロジェクトに帰属していて呼び出し方が異なる。4Dv17
テーブルフォームを開くときはテーブル名とフォーム名を与える:Open form window([Table1];”P01_Print”)
プロジェクトフォームを開くときはフォーム名だけ与える:Open form window(“P01_Print”)
集計結果を画面に表示したところまでは順調。画面表示用なので[印刷]ボタンと[キャンセル]ボタンがある。当然だ。でも印刷時にはこれらのボタンを隠したい。いつものようにフォームメソッドの「On Printing Detail」でObject set visibleしようかな、と。やろうとしたら、
◆ プロジェクトフォームのプロパティに「On Printing Detail」イベントがない!
テーブルフォームじゃないとこれらのイベントは取得できない、らしい。Object set visibleなどのコマンドはフォームオブジェクトがロードされた後でないとコマンドが無効になるので、フォームがロードされた後、印刷が始まる前までに実行したい。選択肢は次の2つ?
1)プロジェクトフォームのままで、「On Load」イベントでボタンを制御
2)テーブルフォームに変更して、「On Printing Detail」を使う
今回のケースでは、複数のテーブルからデータを集計するのだが、カレントセレクションは使わないためどちらのテーブルに帰属させても動きに問題はない。しかしどちらのテーブルにも帰属させたくない。あとでメンテするたびにどちらのテーブルか思い出す必要があったりするので。
とりあえず1)を試す。
◆ Print formコマンドで「On Load」イベントが来ない!
そうかもしれない、今回のケースでは自身のフォームが画面表示用としてすでにロードされているから。これが別のフォームを開く場合だったら[印刷]ボタンクリックのあとで別のフォームがロードされてOn Loadイベントが発生するのに。
ほかに方法もありそうだけど、このあたりで方針変更して、2)に宗旨替え。
で、どのテーブルに帰属させるか。昔プロジェクトフォームがなかった頃はすべてのがテーブルフォームだった。[Z_Dialog]とか[Z_UserInterfae]とかフォームを作るためだけのレコードのないテーブルを作ってた。これをやりたくなかったけど仕方がない。あとで探しやすいように印刷用フォーム専用の[Z_PrintForm]という名前のテーブルを作ることにした。フォームの名前はP01_のようにPで始めたり、PF01_のようにPFで始める。
以上が印刷用フォーム専用テーブル[Z_PrintForm]ができた背景。これは4Dv17の場合であり、将来の4Dでプロジェクトフォームでもテーブルフォームと同様に「On Printing Detail」がサポートされたら[Z_PrintForm]を廃止するか、というとそうでもない。印刷用フォームを1箇所に集めておく意味はありそうだし、これはこれで悪くないと思う、今のところは。