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()だけなのですが、画面終了時に何か
必要な処理があるのでしょうか?
色々と問題を起こしそうなコードですね。。。
[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 すべきでない。です。
特攻隊長まるるう様
ご返信、ありがとうございます。
仰るとおりです。
私もこのプロジェクトを引き継いだ時にびっくりしました。
もともとVB6で作成(その前にVB4?で作成していた)されたもので、
このFormは実はMessageBoxを自前作成しております。
Dsp関数でそのFormを呼び起こすものになってます。
今、
ShowDialogで呼び出した場合に、その呼び出し先で
If Not A Is Nothing Then
A.Dispose()
End If
を行うと、先の現象が発生しなくなっちゃいました。
暗黙の処理でしょう・・・
でも、これが正解ってわけじゃないですよね?
仰るとおり、こういうやり方を止めないといけないですね。
ツイート | ![]() |