C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 画面のモーダル表示


(過去ログ 17 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■6713 / inTopicNo.1)  画面のモーダル表示
  
□投稿者/ zono (10回)-(2007/08/22(Wed) 17:17:25)

分類:[VB.NET/VB2005] 

申し訳ございませんがたびたび質問させていただきます。
現在他の開発者が作成したプログラムの改修をおこなっているのですが、
画面をモーダル表示させたり、消したりの処理(showDialogとCloseを使用)でExceptionが発生しています。

エラー内容は、
*****既に表示されているフォームをモーダル ダイアログとして表示できません。
showDialogを呼び出す前に、フォームのVisibleプロパティをfalseにして下さい。******

と表示されています。

上記の内容のExceptionが発生する原因は何なのでしょうか??

ためしにモーダル表示された画面に対して、クローズせずに再度モーダル表示を行っても上記のExceptionは発生しませんでした。

※ソースは訳あってのせることができません。わかりづらくてもうしわけございません。
引用返信 編集キー/
■6714 / inTopicNo.2)  Re[1]: 画面のモーダル表示
□投稿者/ 囚人 (140回)-(2007/08/22(Wed) 17:30:52)
>上記の内容のExceptionが発生する原因は何なのでしょうか??

原因はコンパイラの言う通りじゃないですか?

>*****既に表示されているフォームをモーダル ダイアログとして表示できません。
>showDialogを呼び出す前に、フォームのVisibleプロパティをfalseにして下さい。******


ちゃんと Visible を false にしてるのに例外が出るという意味ですか?
引用返信 編集キー/
■6716 / inTopicNo.3)  Re[2]: 画面のモーダル表示
□投稿者/ zono (11回)-(2007/08/22(Wed) 17:36:59)
No6714 (囚人 さん) に返信
> >上記の内容のExceptionが発生する原因は何なのでしょうか??
>
> 原因はコンパイラの言う通りじゃないですか?
>
> >*****既に表示されているフォームをモーダル ダイアログとして表示できません。
> >showDialogを呼び出す前に、フォームのVisibleプロパティをfalseにして下さい。******
>
>
> ちゃんと Visible を false にしてるのに例外が出るという意味ですか?

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

> ちゃんと Visible を false にしてるのに例外が出るという意味ですか?
いえ違います。
showDialogで画面を表示する時に、Visibleプロパティを意識したことが
ないので・・・画面を表示する時にVisibleプロパティの設定など
必要なのでしょうか??


引用返信 編集キー/
■6718 / inTopicNo.4)  Re[3]: 画面のモーダル表示
□投稿者/ 囚人 (141回)-(2007/08/22(Wed) 17:41:46)
>原因はコンパイラの言う通りじゃないですか?

間違いました。コンパイラじゃないですね。


>いえ違います。
>showDialogで画面を表示する時に、Visibleプロパティを意識したことが
>ないので・・・画面を表示する時にVisibleプロパティの設定など
>必要なのでしょうか??

わかりません。
でもそういうエラーが出ていて、しかも教えてくれているなら、私ならそれを試します。

既に表示されているフォームを表示しようとしているんですよね?
引用返信 編集キー/
■6720 / inTopicNo.5)  Re[4]: 画面のモーダル表示
□投稿者/ まどか (361回)-(2007/08/22(Wed) 18:02:36)
通常、

Private Sub Button1_Click(...)
Dim newForm As New Form1
newForm.ShowDialog()
newDialog.Dispose()
End Sub

という閉じられたスコープの場合、おっしゃる現象はよほど変なことをしない限り発生しません。

ということは、フォームインスタンスの使い回しがおかしくなっているのかな?と想像できます。
該当のインスタンス変数に対して、どこで生まれどこで死んでいるかを確認してください。
そこでやってることの矛盾が見つかるかもです。
引用返信 編集キー/
■6724 / inTopicNo.6)  Re[1]: 画面のモーダル表示
□投稿者/ 渋木宏明(ひどり) (306回)-(2007/08/22(Wed) 19:02:05)
渋木宏明(ひどり) さんの Web サイト
> ためしにモーダル表示された画面に対して、クローズせずに再度モーダル表示を行っても上記のExceptionは発生しませんでした。

「モーダル表示された画面に対して、クローズせずに再度モーダル表示」なんて無理な話だと思うんですが、どうやってるんでしょう?

ひょっとしたらスレッド跨ぎで操作しようとしてるんでしょうか?

引用返信 編集キー/
■6735 / inTopicNo.7)  Re[1]: 画面のモーダル表示
□投稿者/ 魔界の仮面弁士 (386回)-(2007/08/23(Thu) 03:41:00)
No6713 (zono さん) に返信
> *****既に表示されているフォームをモーダル ダイアログとして表示できません。
> showDialogを呼び出す前に、フォームのVisibleプロパティをfalseにして下さい。******
> と表示されています。
> 上記の内容のExceptionが発生する原因は何なのでしょうか??

再現させるための単純なコードとしては、
 Form2.Show()
 Form2.ShowDialog()
でしょうかね。『Me.ShowDialog()』でも再現するでしょうけれども。
引用返信 編集キー/
■6756 / inTopicNo.8)  Re[2]: 画面のモーダル表示
□投稿者/ zono (12回)-(2007/08/23(Thu) 11:35:08)
返信ありがとうございます。

「モーダル表示された画面に対して、クローズせずに再度モーダル表示」はタイマを使用して行いました。
(同じエラーの内容が出力されるか確認する為)

簡単に言うとある画面からメッセージを送信する時にダイアログとして画面表示し、応答を受信した時に
ダイアログを非表示にしています。

まどか様の指摘通り、矛盾が発生しているのかもしれませんがそのような箇所は見つからなかったので・・・
再度見てみます。

色々教えて頂いてありがとうございます。


引用返信 編集キー/
■6758 / inTopicNo.9)  Re[3]: 画面のモーダル表示
□投稿者/ まどか (362回)-(2007/08/23(Thu) 12:28:32)
> 簡単に言うとある画面からメッセージを送信する時にダイアログとして画面表示し、応答を受信した時に
> ダイアログを非表示にしています。

外から制御しているのであれば、ShowDialogとHide(Visible=False)がちゃんと交互に呼び出されるかどうかですね。
当然ShowDialogするときはVisible=Falseの条件をつける必要があります。
たぶん、その考慮が足りないとか、他の要因で視覚状態遷移が矛盾してるのではないでしょうか。
引用返信 編集キー/
■6948 / inTopicNo.10)  Re[4]: 画面のモーダル表示
□投稿者/ zono (13回)-(2007/08/27(Mon) 20:15:55)
No6758 (まどか さん) に返信
>>簡単に言うとある画面からメッセージを送信する時にダイアログとして画面表示し、応答を受信した時に
>>ダイアログを非表示にしています。
>
> 外から制御しているのであれば、ShowDialogとHide(Visible=False)がちゃんと交互に呼び出されるかどうかですね。
> 当然ShowDialogするときはVisible=Falseの条件をつける必要があります。
> たぶん、その考慮が足りないとか、他の要因で視覚状態遷移が矛盾してるのではないでしょうか。

再度話を上げてもうしわけございません。
ソースを調べたところ矛盾等がみつかりませんでした・・・

メッセージを送信するときにShowDialogでダイアログを立ち上げて、応答時にCloseで画面を閉じています。
(VisibleプロパティやHideプロパティの考慮はしていません)
基本的には上記の繰り返しです。

何か参考になることがありましたら教えて下さい。
よろしくお願い致します。

引用返信 編集キー/
■6949 / inTopicNo.11)  Re[5]: 画面のモーダル表示
□投稿者/ zono (14回)-(2007/08/27(Mon) 20:31:03)
No6948 (zono さん) に返信
> ■No6758 (まどか さん) に返信
> >>簡単に言うとある画面からメッセージを送信する時にダイアログとして画面表示し、応答を受信した時に
> >>ダイアログを非表示にしています。
>>
>>外から制御しているのであれば、ShowDialogとHide(Visible=False)がちゃんと交互に呼び出されるかどうかですね。
>>当然ShowDialogするときはVisible=Falseの条件をつける必要があります。
>>たぶん、その考慮が足りないとか、他の要因で視覚状態遷移が矛盾してるのではないでしょうか。
>
> 再度話を上げてもうしわけございません。
> ソースを調べたところ矛盾等がみつかりませんでした・・・
>
> メッセージを送信するときにShowDialogでダイアログを立ち上げて、応答時にCloseで画面を閉じています。
> (VisibleプロパティやHideプロパティの考慮はしていません)
> 基本的には上記の繰り返しです。
>

> 何か参考になることがありましたら教えて下さい。
> よろしくお願い致します。
>


追記ですが、Closeをコールした後にメッセージを送信する処理があるのですぐにShowDialogが表示されます。
Close直後にShowDialogをコールするのがまずいのでしょうか?
ちなみにダイアログはShowDialogをコールするたびにインスタンスを生成するのではなく、
初期時にインスタンスを生成し、その後はShowDialogとCloseを交互によびだしてます。
引用返信 編集キー/
■6964 / inTopicNo.12)  Re[6]: 画面のモーダル表示
□投稿者/ まどか (369回)-(2007/08/28(Tue) 09:42:23)
> 追記ですが、Closeをコールした後にメッセージを送信する処理があるのですぐにShowDialogが表示されます。
> Close直後にShowDialogをコールするのがまずいのでしょうか?

一応動作しますが。
Form1:Button1,Timer1、Form2

Public Class Form1

Private f2 As Form2

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Timer1.Interval = 5000
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Timer1.Enabled = True
f2 = New Form2
f2.ShowDialog()
f2.ShowDialog()
f2.Dispose()
Timer1.Enabled = False
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If f2 IsNot Nothing Then
f2.Close()
End If
End Sub

End Class

例のメッセージはやはりズバリの事象を表しているわけで、魔界の仮面弁士さんが示されたような状態になっているはずです。
で、ShowDialogなので待ち状態になりますのでそのプロシージャに問題がある可能性は低いです。
やはりメッセージ云々とおっしゃっている仕組みが絡んでいるのではと思います。
#別スレッドとか
もしくは送信が2連続で実行されるような状態になっていませんか?>ShowDialogとCloseの呼び出し部分にConsole.WriteLine入れてみては。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -