VisualStudio2005(VB)でProgramを作成しています。 DFile(DataFile)幾つかを作成しそのデータをfrmDataRW.showdialogで呼び出して利用しています。 DFileを変更したい場合はfrmDataRWにはcmdDFileChangeがありこれをClickすれば frmDataRW.Hideの後にfrmDFileSeltがshowdialogされここでDFileが変更出来ます。 frmDataRW: '************************************************************************************* ' Sub cmdDFileChange_Click ' データファイル変更が入力されたら '************************************************************************************* Private Sub cmdDFileChange_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDFileChange.Click flgDFileChange = True Me.Hide frmDFileSet.ShowDialog() End Sub frmDFileSelt: OptionButtonでどのDFileを使うかを指定しています。 例えば Case 3 '(OptionButton 3) 'サンプルデータファイルの使用 DFile = stCurrentDir & "\DataFile\SD_Sample.dat" lblDataFileName.Text = DFile frmDataRW.lblDataFileName.Text = DFile Me.Hide() 'AAA Try frmDataRW.ShowDialog() 'BBB Catch ex As Exception MsgBox(ex.Message) 'CCC End Tryこの変更後にFrmDFileSelect.Hideし('AAA)再度このDFileでfrmDataRW.showdialog('BBB)しようとしますと('CCC)で「System.InvalidOperationException' の初回例外が System.Windows.Forms.dll で発生しました。」「既に表示されているフォームをモーダル ダイアログ ボックスとして表示できません。showDialog を呼び出す前に、フォームの Visible プロパティを false にしてください」とErrorになります。一旦frmDataRW.Hideとしているのになぜこの様なErrorになるのでしょうか?何方か解決方法をお教え下さい。 よろしくお願い申し上げます。
'メインフォーム Private Sub … frmDFileSet.ShowDialog() 'Show でも可 End Sub 'frmDataRW Private Sub … '1 Me.Hide() '2 frmDFileSet.ShowDialog() '3 frmDFileSet が閉じるまで待機 End Sub '4 'frmDFileSelt Private Sub … '5 Me.Hide() '6 frmDataRW.ShowDialog() '7 frmDataRW が閉じるまで待機 End Sub '8 これらの処理において、4 の行に到達するタイミングというのは、 6 が実行された後ではなく、8 が実行された後です。 また、8 の行に到達するタイミングというのは、 2 が実行された後ではなく、4 が実行された後です。 結局、互いが互いを待ち合わせている状態のままなので、この状態では 4 や 8 には到達しません(Hide を Close にしても同様です)。 ゆえにフォームが消えても、まだモーダル状態として管理されたままとなります。 4 や 8 の箇所にブレークポイントを貼って、テストしてみてください。 > なぜこの様なErrorになるのでしょうか? Timer などを使って、Hide を呼び出したメソッドの実行が終わった後で ShowDialog するようにすれば一応は回避できますが、そもそもは 画面遷移の制御構造を見直すべきかと思いますよ。 frmDataRW / frmDFileSelt を排他的に ShowDialog すること自体は 構わないと思いますが、それを ShowDialog を互いに呼びあう形で 実装してしまうと、今回のような問題に見舞われる事になります。 そもそも、ShowDialog (≠Show) で呼び出したフォームというのは、 最後に Dispose メソッドで破棄する必要があります。しかし今回のように 互いを呼び出すようなコードにしてしまうと、いつ Dispose すれば良いのか 管理しにくくなってしまいますよね。 > frmDataRW.lblDataFileName.Text = DFile 他のフォームのコントロールを直接操作しようとするのではなく、 データ受け渡し用のメンバーを用意するようにした方が良いですよ。
- Child Tree -