ShowDialog( ) の後の、Show( )


タメ子  2007-12-28 02:38:24  No: 138508

VB 2005 WindowsXP

あるForm (Aとします)を用意し、Aの関数Dspが

Pubric Function Dsp(ByVal flg as integer) as Boolean

    Dim ret as Boolean = True
    
    if flg = 1 then
        Me.ShowDialog
    Else
        Me.Show
    End If

    Return ( ret )

End Function

となっており、他の画面からこの関数を呼び出し、このForm
を起動します。
起動を分けているのは、条件により画面のボタン(このFormの
Loadでボタンなどを用意します)で終了するか(ShowDialog)、
ボタンを押下を待たずにある条件下でこの画面を強制終了
するかを区別します。

問題は、ShowDialogで画面を起動し、ボタン押下でその画面を
終了した後、次にShowで画面を起動すると、そのFormのLoad
関数に入ってきません。画面は起動するのですが、Loadで画面
表示を設定しているので、以前に起動した画面のままが起ち
あがります。
ShowDialogの後のShowDialogや、Showの後のShow、
Showの後のShowDialogはちゃんとLoadに入ってくるのに・・・。
画面の終了はMe.Close()だけなのですが、画面終了時に何か
必要な処理があるのでしょうか?


特攻隊長まるるう  2007-12-28 03:03:17  No: 138509

色々と問題を起こしそうなコードですね。。。

[Form.ShowDialog メソッド]
http://msdn2.microsoft.com/ja-jp/library/c7ykbedk(VS.80).aspx
>現在のアクティブ ウィンドウを所有側フォームに設定して、
>フォームをモーダル ダイアログ ボックスとして表示します。

[モーダル ダイアログ]
http://e-words.jp/w/E383A2E383BCE38380E383ABE38380E382A4E382A2E383ADE382B0.html
>一度開いたダイアログボックスを閉じるまで、他の操作を
>できなくするタイプのダイアログボックス。

自分自身をモーダル表示するって時点で、概念をぶち壊してますね。
[Form.ShowDialog メソッド]のページの[解説]に書いてますが、
もともと、DialogResult を取得するために、Close 処理を行わず、
呼び出し元で明示的に破棄する設計になっています。

ところが呼び出し元が自分自身だと、自分を破棄した後の処理が
続行できません。
>ShowDialogの後のShowDialog
これで呼び出されるほうがおかしいんじゃないかと思います。
…暗黙のインスタンスがどこかで生成されているんじゃ。。。

ボクの結論は、自分自身を ShowDialog すべきでない。です。


タメ子  2007-12-28 03:15:23  No: 138510

特攻隊長まるるう様

ご返信、ありがとうございます。

仰るとおりです。
私もこのプロジェクトを引き継いだ時にびっくりしました。

もともとVB6で作成(その前にVB4?で作成していた)されたもので、
このFormは実はMessageBoxを自前作成しております。
Dsp関数でそのFormを呼び起こすものになってます。

今、
ShowDialogで呼び出した場合に、その呼び出し先で

    If Not A Is Nothing Then
        A.Dispose()
    End If

を行うと、先の現象が発生しなくなっちゃいました。
暗黙の処理でしょう・・・

でも、これが正解ってわけじゃないですよね?
仰るとおり、こういうやり方を止めないといけないですね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加