Tips

カレントテーブル表示ができなくなる理由

日付2010/02/10
ID10-006
バージョン11
プラットフォームWin, Mac

デザインモードで作業を行っている時、テーブルが存在しているにも関わらず、カレントテーブル表示(旧ユーザモード)が使えなくなることがあるなら、このTipsを読む価値があります。

また、アプリケーションプロセスを利用したくないが、複数のウィンドウを開くことも避けたい場合にも、このTipsが役に立つと思います。

理由と原因

カレントテーブル表示は、アプリケーションプロセスを使って処理します。もしアプリケーションプロセスをメソッド等で使用してしまうと、アプリケーションプロセスはカレントテーブル表示を行うことができません。そのような時には、4Dのデザインモードでメニューそのものがグレー表示(下図参照)となり、選択できなくなります。

メニューが利用できない状態

このようになる理由は、アプリケーションプロセスをメソッドで利用しているからに他なりません。そうした状態に陥る原因としては、次のようなものがあります。

  1. On Startupが終了していない
  2. メニューからの呼出しで「新規プロセス開始」オプションが無効となっている

On Startupは、4D自身の初期化を兼ねているので、できるだけ速やかに終了することが望ましい特別なメソッドです。もしダイアログのようなものを表示、あるいはデータベースを開始する際の特別な処理に時間が掛かるのであれば、New processコマンドを使い別プロセスで処理させるような工夫が必要です。

メニューからの呼出しで「新規プロセス開始」オプションが無効となっている時、メニューから呼び出されたメソッドは、アプリケーションプロセスで動作します。例えば、メニューエディタで下図のように設定した時には、メニューから「業務処理1」を選択するとMethod1がアプリケーションプロセスで動作することになります。

メニュー設定例1

このような状態を避けるには、メニューからの呼出しで「新規プロセス開始」オプションを有効にします。しかし、新規プロセス開始オプションを使うと、同じ処理を行う複数の画面が同時に開くことができるようになり、都合が悪いこともあります。

新規プロセス開始オプションを無効にしながらアプリケーションプロセスを使わない方法

「新規プロセス開始」オプションを無効にしながらアプリケーションプロセスを使わない方法は様々ありますが、簡単に実現する方法の一つをご紹介します。

下準備として次のように記述した「MENU_Execute」メソッドを用意します。

`MENU_Execute

$methodName:=Get selected menu item parameter
$refProc:=New Process($methodName;0;"業務プロセス";*)//第2引数に0を渡すと推奨値で動作する
BRING TO FRONT($refProc)

次にメニューで直接「Method1」を呼び出す代わりに下図のように設定します。

メニュー設定例2

この設定のポイントは…

メニューから呼び出されたMENU_Executeメソッドは、メニューから渡されたパラメタをGet selected menu item parameterコマンドで受け取り、そのメソッド名を新規プロセスで起動するためにNew Processコマンドに渡しています。New Processコマンドの最後のパラメータとして、*オプションが指定されているので「業務プロセス」と名のついたプロセスが既にある時には、新しくプロセスを起動することは無いので、複数のウィンドウが開かれるのを抑制することになります。

このテクニックを使うことで、アプリケーションプロセスを使わずに、複数のウィンドウを開くことの無いシステムを製作できます。実際にこのプログラム例で、起動したのが下図です。

画面表示例

この例では「業務プロセス」画面の他に、アプリケーションプロセスが表示している「スプラッシュスクリーン」が見えています。スプラッシュスクリーンは起動時に4Dと表示される画面ですが、これはアプリケーションプロセスが表示している画面ですので、これの利用はあまり好ましいとは言えません。むしろ利用せず、不要ならば表示しないようにしてください。スプラッシュスクリーンの非表示設定は、4Dの環境設定で行うことができます。

なお、この技法は、以前Tipsでご紹介した技法「複数のメニュー項目で1つのメソッドを共有」の応用になります。