メニューからウィンドウを開くときの方法について
| ID | 156 |
|---|---|
| カテゴリー | 4D v14関係 4D v13関係 4D v12関係 4D v11 SQL関係 データベースデザイン |
| プラットフォーム |
まずはじめに、ウィンドウを開く時の基礎として、次のことをしっかりと把握していることが重要です。
- 基本的にアプリケーションプロセス(注1)は使わない
- 基本的に独立したウィンドウは独立したプロセスで動作させる
- フォームとメニューバーの連結
もちろんこれらを無視したプログラミングも可能ですが、上記のことは基本中の基本なので十分に理解しておくことが大切です。
またこれとは別に安定性を確保するためには、次のことにも配慮するべきです。
- CLOSE WINDOWコマンドはできるだけ省略して4Dに任せる
- CLOSE WINDOWコマンド使うときにはパラメータを必ず渡す
注1:アプリケーションプロセスとは、4D起動時に用意されるプロセスで、GUIのマネージメント等を行う特殊なプロセスの名称です
常にひとつだけしかウィンドウを開かないケース
特性として、ひとつだけのウィンドウで処理を行うアプリケーションもあります。そのようなとき、メニュープロパティの「新規プロセス開始」オプションを無効にしてメソッドを起動するプログラムをすることがあります。しかしそれは大抵の場合、大きな過ちであり、安定性を損ねていることにつながっています。
安定性を損ねる理由として、メニューなどのGUIは、全てアプリケーションプロセスが請け負っている関係上、このプロセスを使い続けることはGUIを始め4Dの割り込み処理に支障をきたす可能性があるからです。
資料
メニュープロパティの「新規プロセス開始」オプションを無効にする理由は、メニューからメソッドにパラメータを渡すためだけにあります。他の目的で、メニュープロパティの「新規プロセス開始」オプションを無効にしてはなりません。
アプリケーションプロセスを使わずに、1つだけしかウィンドウを開かないアプリケーションを作成するための方法は、下記の記事を参考に作成すると、簡単かつ安定したプリケーションを作成できます。
複数のウィンドウを開く
複数のウィンドウを開いて、それぞれが別の処理を行えるようにするためには、独立したプロセスで動作させることが必要です。しかし別プロセスで起動すると、同じ処理を行うウィンドウが複数立ち上がる問題を考えなくてはなりません。多くの場合、同じ処理を行うウィンドウが複数開かれることは、都合が悪いことになります。
そのような問題を避けるためには、プロセスを起動するときに処理の内容を表すプロセス名を明示的に指定することです。先に紹介した記事「カレントテーブル表示ができなくなる理由」では、New Processの第3パラメータに文字列 "業務プロセス" を渡すことで、複数のウィンドウが開かれることを抑制していました。この "業務プロセス" の代わりに、処理の内容を表すプロセス名を渡すことで、同じ処理のプロセスが新しく開かれることを抑制するようにできます。複数のプロセスつまり複数のウィンドウを開いた時の問題は無いはずです。
例えば、メソッド毎にウィンドウが開かれるように、言い換えるなら同じメソッドで別々のウィンドウが開かないようにするためには、先の記事にある例題プログラムを応用すれば簡単に解決できます。
//目的: //メニューで指定されたメソッドを開く //概要: //メソッドはプロセスとして独立して動作するが、同じメソッドがメニューから複数から起動されることはない。 //メニューでのメソッド指定は、メニューのパラメータにて行う。 $methodName:=Get selected menu item parameter $refProc:=New process($methodName;0;"MENU:"+$methodName;*)//第二引数は0を渡すとそのバージョンの推奨値が利用される BRING TO FRONT($refProc)
これは、ほんの一例ですので、これを基本にして応用すれば、様々な要求に答えることができるはずです。
開かれたウィンドウでメニュー操作を有効にする
複数のウィンドウを開くことが可能なアプリケーションの場合、ウィンドウが開かれている時にもメニューが操作できるようにしたいと考えるのが普通です。フォームを表示している場合には、フォームとメニューを連結することで、ウィンドウを開いている時にもメニューを操作できるようになります。
資料
- デザインリファレンス:フォームにメニューバーを割り当てる
同じプロセスで複数のウィンドウを開く
あるウィンドウを補佐するようなツールウィンドウの場合、相互にウィンドウを操作しつつ、同じプロセスで動作させたいと思うかもしれません。そのような場合にはDIALOGコマンドにアスタリスク(*)オプションを渡して利用します。
資料
- ランゲージリファレンス:DIALOG
アスタリスクオプションで開かれたウィンドウは、DIALOGコマンドを実行したプロセス内で動作します。プロセス変数も共有されるので、プロセス間通信も不要です。詳しくはランゲージリファレンスを参照してください。