DOBON.NET DOBON.NETプログラミング掲示板過去ログ

モードレスダイアログの結果を待つ?

環境/言語:[WinXP SP1/ VB.NET Standard2002/.NET Framework 1.1]
分類:[.NET]

お世話になっております。

なんと質問していいのかわからないのですが(そのため意味不明なタイトルになってしまいました)、
Form1からForm2を表示し、Form2の作業が終わり、Form2が閉じられたら
Form1でその結果を用いて作業をしたい、と言った感じなのですが、
Form2をモーダルで表示させるなら、

---
Dim frmB As New Form2()
dim strB as string
If frmB.ShowDialog(Me) = ShowDialog.OK Then
strB = frmB.TestProperty()
End If
---

というように、ShowDialogを使ってできるのですが、
Form2をモードレスにしたいのですが、どうしたらいいでしょうか。

ご教授お願いします。
単にモードレスで表示させるだけならForm.Show()を使用すれば可能ですが、DialogResultが重要な場合、
MSDNのForm.DialogResultプロパティの解説には

> メモ Form がモードレス ウィンドウとして表示される場合は、フォームが閉じるときにそのフォームのリソースが自動的に解放されるため、DialogResult プロパティからの戻り値が、フォームに割り当てられている値を返すことはありません。

とあることからもわかるとおり正常なDialogResultを得られる保証はありません(また、Form.AcceptButtonもしくはCancelButtonプロパティに設定されたボタンがクリックされてもフォームは閉じられません)。
そこでこの問題に対して二つほど対策を考えてみました。

1.Form.Show()を使用する方法
 Form2に独自に結果を表わすフィールドを与え、Form2が閉じられたときに結果をそのフィールドに格納してプロパティからその値を取得します。
また、前述したようにOKボタンなどを押してもフォームは閉じられないので、ボタンのクリックイベントを取得してその中で結果をフィールドに設定した上でClose()メソッドでフィールドを閉じます。さらにForm2を呼び出したForm1はForm2が閉じられたことを知るためにClosedイベントを取得する必要があります。

2.Form.ShowDialog()をモードレスのように動かす方法
 別のスレッドでShowDialog()を呼び出せばForm2がモーダルで表示されていてもForm1を操作することができ、またDialogResultを取得することもできます。

Public Class Form1
Inherits System.Windows.Forms.Form
(省略)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Form2を表示させるスレッドを作成させるためのプロシージャです
Dim ts As ThreadStart = New ThreadStart(AddressOf Me.ShowModalDialog)

'別のスレッドでShowModalDialog()を呼び出します
ts.BeginInvoke(Nothing, Nothing)
End Sub

Public Sub ShowModalDialog()
Dim fm As Form2 = New Form2
'DialogResultの結果を取得します
'ShowDialog(Me)とするとForm2が閉じられていない段階でForm1を閉じてしまったときに例外が発生します()
Dim result As DialogResult = fm.ShowDialog()


End Sub
(省略)
返信ありがとうございます。

どちらの方法でもできました。
スレッドの理解がまだよくできてないのですが、
これを機に勉強してみようかと思います。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板