メンバ一覧 showDialog 前のメソッド 次のメソッド

VB C# ALL プログラミング言語によるフィルタ (ここで選んだ言語で選別された説明や図だけが表示されます)

ShowDialog メソッド

機能および役割

MANDALA フォームをモーダルなダイアログボックスとして表示する。このメソッドは、すでに呼び出し側の MANDALA フォームが表示されている場合に、そのフォームから呼び出す新たな MANDALA フォームを表示する場合に使用することができる。

所属クラス (ツーピーススタイルの場合にこのメソッドが宣言されているクラス)

AppliTech.WorkFrame.FormBase (ローカル)

呼出し方

次の 2 種類の呼出し方がある (2 OverLoads)。

fB.ShowDialog()

fB.ShowDialog(親フォーム)

(ただし fB は、クラス FormBase のインスタンス)

戻り値の型および意味

戻り値の型: System.Windows.Forms.DialogResult

意味: .NET Framework におけるモーダルなダイアログボックスからの戻り値である。詳細は .NET Framework クラス ライブラリリファレンスの 「DialogResult 列挙体」をご覧ください。

パラメタの型および意味

親フォーム (System.Windows.Forms.IWin32Window): この親フォームからこのモーダルな MANDALA フォームを表示したという扱い (これが親フォームであるという扱い) にする。

例外の発生 (誤った呼出しの際に発生する例外)

(関係する例外の発生なし)

使用上のヒントと注意事項

このメソッドは、まず FormBase のインスタンスを取得し、そのインスタンスから目的とするフォームを表示させるためのメソッドである。

ある MANDALA フォームから、新たな MANDALA フォームを表示させる場合、通常は次のように記述すればよい。

Dim NewForm As Fr_SomeApp = New Fr_SomeApp(fB)
NewForm.ShowDialog()
Fr_SomeApp NewForm = new Fr_SomeApp(fB)
NewForm.ShowDialog();

ただし、Fr_SomeApp は、新たに表示したいフォームのクラスとする。また、fB は親となる MANDALA フォームの FormBase インスタンスとする。

しかし次のように、表示するフォームの型を System.Windows.Forms.Form (以下 Form と略す) として宣言すると期待通りの動作をしなくなってしまう。

' 正しく動作しない例
Dim NewForm As System.Windows.Forms.Form = New Fr_SomeApp(fB)
NewForm.ShowDialog()
// 正しく動作しない例
System.Windows.Forms.Form NewForm = new Fr_SomeApp(fB)
NewForm.ShowDialog();

これは、Fr_SomeApp クラスの ShowDialog メソッド (これは MANDALA によって自動生成されたものである) が Form クラスの ShowDialog メソッドを継承しておらず、上の例と下の例では異なるバージョンの ShowDialog メソッドが呼ばれてしまうためである。 上の例にあるバージョンの ShowDialog メソッドは、MANDALA フォームを表示するために必要な初期化処理などを実行するが、下の例のバージョンの ShowDialog メソッドはそのような処理を行わないので MANDALA フォームが正しく表示できなかったり、例外が発生してしまったりする。

なぜこのようなことになっているかというと、.NET Framework によって提供されている Form クラスの ShowDialog メソッドはオーバライド不可のメソッドとして定義されているためである。このため、MANDALA システムが自動生成する ShowDialog メソッドは Form クラスの ShowDialog メソッドを隠蔽して、問題のない記述ができるように処置を行っている。

だが、下の例のケースのように抽象クラスとして定義したオブジェクト変数を扱いたい場合、隠蔽による問題点が顕在化してしまう。このような場合、抽象化を FormBase クラスで肩代わりし、本メソッドを用いることで次のように記述することができる。

Dim NewFormBase As FormBase = New Fr_SomeApp(fB).getFormBase()
NewFormBase.ShowDialog()
FormBase NewFormBase = new Fr_SomeApp(fB).getFormBase()
NewFormBase.ShowDialog();

そもそも Form クラスの ShowDialog メソッドがオーバライド可能であればこのような回避策は必要いのだが、オーバライド不可となっているので、このような目的のために本メソッドを使用されたい。

関連事項

使用例

Public Shared Function Create3(ByVal pm_fB As FormBase) As Boolean
    Dim newFormBase As FormBase = Nothing
    Dim parentFormBaseClassName As String = pm_fB.GetType().Name
    Select Case parentFormBaseClassName.ToUpper()
        Case "SCALEAPPAFORMBASE"
            newFormBase = New Fr_ScaleAppB(pm_fB).getFormBase()
        Case "SCALEAPPBFORMBASE"
            newFormBase = New Fr_ScaleAppC(pm_fB).getFormBase()
        Case "SCALEAPPCFORMBASE"
            newFormBase = New Fr_ScaleAppD(pm_fB).getFormBase()
        Case Else
            Return False
    End Select
    newFormBase.ShowDialog()
    Return True
End Function
public static bool Create3( FormBase pm_fB ) {
    FormBase newFormBase = null;
    string parentFormBaseClassName = pm_fB.GetType().Name;
    switch (parentFormBaseClassName.ToUpper()) {
        case "SCALEAPPAFORMBASE":
            newFormBase = new Fr_ScaleAppB(pm_fB).getFormBase();
            break;
        case "SCALEAPPBFORMBASE":
            newFormBase = new Fr_ScaleAppC(pm_fB).getFormBase();
            break;
        case "SCALEAPPCFORMBASE":
            newFormBase = new Fr_ScaleAppD(pm_fB).getFormBase();
            break;
        default:
            return false;
    }
    newFormBase.ShowDialog();
    return true;
}
public static void Create3( FormBase pm_fB ) {
    FormBase newFormBase = null;
    String parentFormBaseClassName = pm_fB.getClass().getName();
    if (parentFormBaseClassName.equalsIgnoreCase("SCALEAPPAFORMBASE")) {
        newFormBase = new Fr_ScaleAppB(pm_fB).getFormBase();
    }
    else if (parentFormBaseClassName.equalsIgnoreCase("SCALEAPPBFORMBASE")) {
        newFormBase = new Fr_ScaleAppC(pm_fB).getFormBase();
    }
    else if (parentFormBaseClassName.equalsIgnoreCase("SCALEAPPCFORMBASE")) {
        newFormBase = new Fr_ScaleAppD(pm_fB).getFormBase();
    }
    if (newFormBase != null) {
        newFormBase.ShowDialog();
    }
}