# コモンダイアログ

マニュアル > 画面作成ガイド > ダイアログとフレーム > # コモンダイアログ |

コモンダイアログとは

FA-Panelには、汎用的なダイアログを表示するための機能があらかじめ用意されています。この機能のことをコモンダイアログと呼びます。

共通メソッドの「OpenDialog」はユーザーが独自で作成したフォームをダイアログとして表示することができますが、コモンダイアログはそれに近い機能です。よく使用される汎用的なダイアログがあらかじめシステムに組み込まれており、それぞれのコモンダイアログ用の呼び出しメソッドを実行することによって簡単に表示することができます。

例えば、以下のようなメッセージボックス表示も、あらかじめ組み込まれたコモンダイアログが表示されています。

    event OnMouseUp(button)
    {
    	::OpenMsg("Hello");
    }

あらかじめ用意されているコモンダイアログは以下のとおりです。各メソッドの詳細については、コントロールリファレンス「共通メソッド」を参照ください。

| メッセージボックス（OKボタンのみ） 呼び出し用メソッド（共通メソッド）： OpenMsg
| メッセージボックス（Yes/Noボタン） 呼び出し用メソッド（共通メソッド）： OpenYesNoMsg
| メッセージボックス（Yes/No/Cancelボタン） 呼び出し用メソッド（共通メソッド）： OpenYesNoCancelMsg
| パスワード設定ダイアログ 呼び出し用メソッド（共通メソッド）： OpenPassword
| 数値キーボード 呼び出し用メソッド（共通メソッド）： OpenNumKeyEdit
| テキストキーボード 呼び出し用メソッド（共通メソッド）： OpenTextKeyEdit
| カレンダー 呼び出し用メソッド（共通メソッド）： OpenCalendar
| フォームマップ 呼び出し用メソッド（共通メソッド）： OpenFormMap

| ダイアログ関連のメソッドは共通メソッドとして提供されています。例えば、「this.OpenDialog(...)」のようにフォームのメソッドとして実行することも、「::OpenDialog(...)」のようにルートのメソッドとして実行することもできます。いずれの呼び出し方でもダイアログはフォームの裏には隠れませんが、複数のダイアログを同時に表示した場合、両者には階層表示の動作に違いがあります。 ■フォームのメソッドとして実行した場合 表示されたダイアログは呼び出し元のオブジェクトよりも必ず前面になるように表示されます（つまり、呼び出し元の裏に隠れない）。従って、表示されたダイアログの中から更に別のダイアログを表示すると、後に表示したダイアログは先に表示したダイアログより必ず前面に表示されます。 ■ルートのメソッドとして実行した場合 上記に対し、ルートのメソッドとして複数のダイアログを表示させた場合には、各ダイアログは同一の階層にあるものとして位置付けられるため、階層表示に依存関係は生じません。つまり、オペレータは複数のダイアログ表示をマウスで自由に前後できるようになります。

| ダイアログを開くとき、ダイアログを閉じるまで背面の画面を操作できないようにしたい場合があります。そのような場合は、ルートのSetModalDialogメソッドを使用します。SetModalDialogはコモンダイアログを開いた直後に呼び出してください。詳しくはルートメソッドの「SetModalDialog」を参照してください。

コモンダイアログから処理結果を受け取る

コモンダイアログを表示する場面では、例えばYes/Noの確認など、オペレータに対して何らかの確認を促す場合がほとんどです。また、カレンダー選択やパスワードチェックなどのように、コモンダイアログに対して何らかの入力が行われることもあります。ダイアログの呼び出し元となるオブジェクトは、後続の処理のためにコモンダイアログの操作結果を受け取る必要があります。

これらの処理結果は、OnCommonEventというイベントで受け取ることができます。

このイベントでは、nameとvalueというパラメータを介して、ダイアログの操作結果を受け取ります。

    //パスワードダイアログの例
    event OnCommonEvent(name,value)
    {
    if(value && name == "RCPassword") {
    	this.Btn1.Enabled = T;
    }
    else{
    	this.Btn1.Enabled = F;
    }

上記の例ではパスワードダイアログの判定結果により、ボタンの有効・無効を切り替えています。

| 各パラメータに渡ってくる情報はコモンダイアログの種類によって異なります。詳細はコントロールリファレンスの「共通メソッド」を参照して下さい。

| コモンズダイアログを閉じる前に、targetで指定したコントロールが含まれるフォームを閉じないで下さい。もし閉じられる可能性がある場合は、そのコントロールのOnTerminateイベントでコモンダイアログを閉じるようにしてください。この処理によって、targetが含まれるフォームが閉じたときにコモンダイアログも自動的に閉じられます。このような処理が実装されていない場合、親フォームを閉じたあとに、コモンダイアログを閉じると、targetオブジェクトが存在しないためにアプリケーションエラーが発生する場合があります。 例）
    event OnMouseUp(button)
    {
    	::OpenYesNoMsg(this, "OK?");
    }

    event OnTerminate()
    {
    	::CloseYesNoMsg();
    }

コモンダイアログをカスタマイズする

コモンダイアログはレイアウトなどをカスタマイズすることができます。コモンダイアログのカスタマイズには、サンプルに添付されている「rc.xml」という設定ファイルを利用します。この設定ファイルにはコモンダイアログの元となっているフォームが含まれており、この設定ファイルから目的のフォームをターゲットの設定ファイルにコピーし、体裁を自由に変更することによって、以降のコモンダイアログ呼び出しではカスタマイズしたフォームの方が表示されるようになります。

「rc.xml」は、以下のサンプルに含まれています。

カスタマイズの大まかな流れは以下のとおりです。

1)Panel Editorでrc.xmlを開き、カスタマイズしたいコモンダイアログのフォームをコピーする。

2)別のPanel Editorを起動してターゲットの設定ファイルを開き、先ほどコピーしたコモンダイアログのフォームを貼り付けする。

3)コモンダイアログのフォームのレイアウトを自由に変更して保存する。

| 上記の手順において、コピーしてきたコモンダイアログのフォーム名は変更してはいけません。

コモンダイアログのカスタマイズ例

ここでは、テキストキーボードを下記のように変更してみます。

■カスタマイズ前

■カスタマイズ後

本サンプルは、以下のファイルに含まれています（sample_dialog_customize.xml）。

1.Panel Editorを起動し、開発ターゲットの設定ファイルを開く

2.Panel Editorをもう１つ起動し、「rc.xml」を開く

3.RCTextKeyフォームを選択してコピーする

4.ターゲットの設定ファイルに、RCTextKeyを貼り付ける（※張り付け後、フォーム名は変更しません）

5.RCTextKeyフォームのレイアウトをカスタマイズする

この例ではレイアウトを変更しています。

6.動作確認

フォームにのボタンコントロールに呼び出しを用意しています。Panel Browserで実行してボタンを押してみてください。

Panel Browserの起動後、ボタンをクリックするとコモンダイアログが表示されます。カスタマイズされたダイアログが表示されることを確認してください。

| この方法でカスタマイズしたコモンダイアログと元のコモンダイアログは同時には利用できません。カスタマイズ後に元のレイアウトに戻したい場合には、カスタマイズしたコモンダイアログのフォームを削除するか、コモンダイアログのフォーム名を別の名前に変更してください。

新規コモンダイアログを作成する

前述までのカスタマイズ方法では、コモンダイアログは各種類で１つの体裁しか持つことができませんでした。例えばテキストキーの場合、画面の種類や入力する場面に応じて、いくつかの種類のテキストキーを切り替えて表示したいといったニーズがあった場合、これでは対応できません。

そのような場合の解決策として、「rc.xml」から対象のコモンダイアログのフォームをコピーしてフォーム名を変更してカスタマイズし、別のコモンダイアログとして利用する方法が用意されています。又、この方法のためのメソッドとして「OpenCommonDialog」という共通メソッドが用意されており、フォーム名を変更したコモンダイアログはこのメソッドによって呼び出すことができます。

この方法の大まかな流れは以下のとおりです。

1)Panel Editorでrc.xmlを開き、カスタマイズしたいコモンダイアログのフォームをコピーする。

2)別のPanel Editorを起動してターゲットの設定ファイルを開き、先ほどコピーしたコモンダイアログのフォームを貼り付けする。

3)コモンダイアログのフォームのレイアウトを自由に変更して保存する。

4)カスタマイズしたフォームの名称を別の名前に変更する。

5)カスタマイズしたフォームをOpenCommonDialogメソッドで表示する。

新規コモンダイアログの作成例

ここでは、前述の手順に従って、標準のテキストキーとは別に、カスタマイズしたテキストキーを新規に追加します。

本サンプルは、以下のファイルに含まれています（sample_dialog_new.xml）。

1.Panel Editorを起動し、開発ターゲットの設定ファイルを開く

2.Panel Editorをもう一つ起動し、「rc.xml」を開く

3.RCTextKeyフォームを選択してコピーする

4.ターゲットの設定ファイルに、RCTextKeyを貼付けする

5.RCTextKeyフォームのレイアウトをカスタマイズする

6.カスタマイズしたフォームの名称を変更する

ここでは、RCTextKeyフォームの名称をRCTextKey2に変更します。

7.カスタマイズしたフォームをコモンダイアログとして呼び出す

新規に作成したコモンダイアログの呼び出しは、OpenCommonDialogメソッドで行います。OpenCommonDialogの第一引数にはPanel Editorで変更したフォーム名を指定して下さい。

試しに、フォームにエディットボックスを2つ貼り付け、下記のようにコモンダイアログを呼び出すスクリプトを記述してみてください。

    //エディットボックス１のスクリプト
    event OnMouseDown(button)
    {
    	::OpenTextKeyEdit(this);	//標準のテキストキー
    }

    //エディットボックス２のスクリプト
    event OnMouseDown(button)
    {
    	::OpenCommonDialog("RCTextKey2", "SetInfoEdit", this);	//カスタマイズしたテキストキー
    }

Panel Browserで実行し、それぞれのエディットボックスがクリックされた時に、標準のテキストキーボードと、カスタマイズしたテキストキーボードの両方が正しく表示されることを確認してください。

| OpenCommonDialogメソッドで表示したコモンダイアログを閉じるには、CloseCommonDialogメソッドを呼び出して下さい。 例） ::CloseCommonDialog("RCTextKey2");

OpenCommonDialogを使用しない新規コモンダイアログ表示（応用編）

ここでは、コモンダイアログの理解を更に深めることを目的として、OpenCommonDialogを使用せずに、ダイアログを開くためのユーザー定義関数を独自に定義して表示する方法について紹介します。

本サンプルは、以下のファイルに含まれています（sample_dialog_new.xml）。

この方法の大まかな流れは以下のとおりです。

1)Panel Editorでrc.xmlを開き、カスタマイズしたいコモンダイアログのフォームをコピーする。

2)別のPanel Editorを起動してターゲットの設定ファイルを開き、先ほどコピーしたコモンダイアログのフォームを貼り付けする。

3)コモンダイアログのフォームのレイアウトを自由に変更して保存する。

4)カスタマイズしたフォームの名称を別の名前に変更する。

5)新規コモンダイアログの表示・クローズのためのユーザー定義関数を作成する。

6)上記で作成したユーザー定義関数を使用してダイアログを表示する。

つまり、１から４までの作業は前述の「新規コモンダイアログの作成例」で紹介した手順と同様です。

詳細は以下の手順を参考にして下さい。

1.前述の「新規コモンダイアログの作成例」で解説した手順のうち、１から４までの手順を実行する

2.ルートのスクリプトに下記の3つのユーザー定義関数を追加する

    function OpenTextKey2(tg, text, texttype, textformat)
    {
    	::OpenDialog("ViewRCTextKey2", "RCTextKey2",
    		"FormRCTextKey2", "Number", -1, -1, -1, -1, T, 1);
    	::FormRCTextKey2.SetInfo(tg, text, texttype, textformat);
    }

    function OpenTextKeyEdit2(tg)
    {
    	::OpenDialog("ViewRCTextKey2", "RCTextKey2",
    		"FormRCTextKey2", "Number", -1, -1, -1, -1, T, 1);
    	::FormRCTextKey2.SetInfoEdit(tg);
    }

    function CloseTextKey2()　//コモンダイアログの終了用
    {
    	::CloseDialog("ViewRCTextKey2");
    }

3.作成したユーザー定義関数で、カスタマイズしたコモンダイアログを呼び出す

前記で作成したユーザー定義関数を下記の要領で呼び出して、標準のテキストキーとカスタマイズしたテキストキーが両方とも正しく表示されるかどうか試してみてください。

    //エディットボックス１のスクリプト
    event OnMouseDown(button)
    {
    	::OpenTextKeyEdit(this);	//標準のテキストキー
    }

    //エディットボックス２のスクリプト
    event OnMouseDown(button)
    {
    	::OpenTextKeyEdit2(this);	//カスタマイズしたテキストキー
    }

| OpenTextKey2関数とOpenTextKeyEdit2関数から呼び出している“SetInfo”及び“SetInfoEdit”は、コピーしたテキストキーフォーム(RCTextKey2)にあらかじめ定義されている関数です。この関数のコードはスクリプトエディタから見ることができます。OpenTextKeyEdit2で行っている処理としては、OpenDialogメソッドでフォームをダイアログとして表示し、SetInfoEditを呼び出して初期情報を設定しています。 OpenTextKeyEdit2を独自に作成するにあたっては、このSetInfo/SetInfoEditの呼び出しは重要です。それぞれのコモンダイアログのフォームには、SetInfo/SetInfoEditがスクリプトとして定義されています。この処理方式の概念は全てのコモンダイアログで共通的なものです。