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

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

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

Re[8]: フォームClose後にデータ読みとってもよいのでしょうか?


(過去ログ 67 を表示中)

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

■39228 / inTopicNo.1)  フォームClose後にデータ読みとってもよいのでしょうか?
  
□投稿者/ プリ太 (38回)-(2009/07/31(Fri) 22:52:17)

分類:[C#] 

プリ太です。
度々お世話になります。

関数中で、フォームAから別のフォームBを呼び出しています。
AがBを呼び出すときに、フォームBを宣言して、Bに宣言しているpublicな変数に値を設定し、その後、ShowDialogで呼び出しています。
BでOKボタンを押されると、Bはpublicで宣言している変数に値を格納し、自分自身をHideにします。
その後、AではBのpublic変数から値を読み込みAの変数に設定を行っています。
値の読み込みを行ったあと、BをDisposeしています。

コンパイルは問題なく、動作も問題はないのですが、Bが消える際にどうしても画面のちらつきが発生してしまうので、
ためしにBでOKボタンを押された際にHideではなくCloseにしてみたところ、値の読み込みもでき、ちらつきも発生しませんでした。

私個人は、Hideだと変数等の領域はDisposeまで残っているので、値が壊れる心配はない、
Closeは画面を閉じるので、変数等の領域は保障されない、的なイメージを持っていたのですが、
Closeでも関数中はBの領域は残っているものなのでしょうか?
CloseだとDispose忘れもないので、楽なことは楽だと思うのですが・・・

環境はVS2005です。
宜しくお願いします。
引用返信 編集キー/
■39229 / inTopicNo.2)  Re[1]: フォームClose後にデータ読みとってもよいのでしょうか?
□投稿者/ Hongliang (442回)-(2009/07/31(Fri) 23:01:33)
> 私個人は、Hideだと変数等の領域はDisposeまで残っているので、値が壊れる心配はない、
> Closeは画面を閉じるので、変数等の領域は保障されない、的なイメージを持っていたのですが、
Dispose や Close とメモリには直接的な関係はありません。
まあフォーム上に乗っているコントロールも破棄され、それらの場合はアンマネージドリソースから情報を取得することが多いので、それらのコントロールから値を取得する場合は例外ってことになるでしょうけど。

しかしそもそも ShowDialog で表示されたフォームの場合、Close を呼び出してもそのフォームが非表示なるだけで破棄はされません。明示的に Dispose するまでハンドル等は残ったままです。
引用返信 編集キー/
■39230 / inTopicNo.3)  Re[2]: フォームClose後にデータ読みとってもよいのでしょうか?
□投稿者/ プリ太 (39回)-(2009/07/31(Fri) 23:33:03)
Hongliang さん ありがとうございます。

> Dispose や Close とメモリには直接的な関係はありません。
> まあフォーム上に乗っているコントロールも破棄され、それらの場合はアンマネージドリソースから情報を取得することが多いので、それらのコントロールから値を取得する場合は例外ってことになるでしょうけど。

Close後の取得を何度も試していますが、今のところ値が取れない等のエラーは発生していません。


> しかしそもそも ShowDialog で表示されたフォームの場合、Close を呼び出してもそのフォームが非表示なるだけで破棄はされません。明示的に Dispose するまでハンドル等は残ったままです。

フォームの宣言、値の設定、フォーム表示、値の読み込みを、すべてを同じ関数内で行っています。
だからClose後も読み込みができたのでしょうか。

CloseでもDisposeしたほうが良いのですね。
なるほど。
追加します。
引用返信 編集キー/
■39250 / inTopicNo.4)  Re[3]: フォームClose後にデータ読みとってもよいのでしょうか?
□投稿者/ Jitta on the way (367回)-(2009/08/03(Mon) 23:25:54)
No39230 (プリ太 さん) に返信
>>しかしそもそも ShowDialog で表示されたフォームの場合、Close を呼び出してもそのフォームが非表示なるだけで破棄はされません。明示的に Dispose するまでハンドル等は残ったままです。
>
> フォームの宣言、値の設定、フォーム表示、値の読み込みを、すべてを同じ関数内で行っています。
> だからClose後も読み込みができたのでしょうか。
>
> CloseでもDisposeしたほうが良いのですね。
> なるほど。
> 追加します。

ん?
Show メソッドと、ShowDialog メソッドで、Close メソッドの動作が変わります。
また、インスタンスをどの様に使うかによって、Dispose した方が良いのかどうかも異なります。
今提示されている情報からは、どっちの方が良いという判断はできません。
引用返信 編集キー/
■39251 / inTopicNo.5)  Re[4]: フォームClose後にデータ読みとってもよいのでしょうか?
□投稿者/ プリ太 (40回)-(2009/08/04(Tue) 00:33:25)
Jitta on the way さん、こんばんわ。

>>CloseでもDisposeしたほうが良いのですね。
>>なるほど。
>>追加します。
>
> ん?
> Show メソッドと、ShowDialog メソッドで、Close メソッドの動作が変わります。
> また、インスタンスをどの様に使うかによって、Dispose した方が良いのかどうかも異なります。
> 今提示されている情報からは、どっちの方が良いという判断はできません。

現在フォームBの呼び出しはShowDialogで行っています。
呼び出されたフォームBはOKボタンが押されたら自分で自分をCloseしています。
フォームBを表示する際にBで宣言しているpublic変数に値を設定するのは、呼び出し元のフォームAです。
CloseでアクティブがAに戻ってきたら、Bで設定した値をAは読みとっています。
そのあと、AがBをDispose しています。

拙い説明ですが、お分かりいただけますでしょうか?
引用返信 編集キー/
■39305 / inTopicNo.6)  Re[5]: フォームClose後にデータ読みとってもよいのでしょうか?
□投稿者/ Jitta on the way (371回)-(2009/08/04(Tue) 22:56:02)
No39251 (プリ太 さん) に返信
> Jitta on the way さん、こんばんわ。
>
> >>CloseでもDisposeしたほうが良いのですね。
> >>なるほど。
> >>追加します。
>>
>>ん?
>>Show メソッドと、ShowDialog メソッドで、Close メソッドの動作が変わります。
>>また、インスタンスをどの様に使うかによって、Dispose した方が良いのかどうかも異なります。
>>今提示されている情報からは、どっちの方が良いという判断はできません。
>
> 現在フォームBの呼び出しはShowDialogで行っています。
> 呼び出されたフォームBはOKボタンが押されたら自分で自分をCloseしています。
> フォームBを表示する際にBで宣言しているpublic変数に値を設定するのは、呼び出し元のフォームAです。
> CloseでアクティブがAに戻ってきたら、Bで設定した値をAは読みとっています。
> そのあと、AがBをDispose しています。
>
> 拙い説明ですが、お分かりいただけますでしょうか?


変数の有効範囲がわかりません。
インスタンスと同じ期間有効な変数に参照させているなら、Dispose する必要は、あまりありません。
メソッド内のみ有効な変数に参照させているなら、メソッドを出る前に Dispose するのがいいでしょう。
引用返信 編集キー/
■39315 / inTopicNo.7)  Re[6]: フォームClose後にデータ読みとってもよいのでしょうか?
□投稿者/ プリ太 (42回)-(2009/08/05(Wed) 11:00:22)
Jitta on the way さん、ありがとうございます。

>>>>CloseでもDisposeしたほうが良いのですね。
>>>>なるほど。
>>>>追加します。
> >>
> >>ん?
> >>Show メソッドと、ShowDialog メソッドで、Close メソッドの動作が変わります。
> >>また、インスタンスをどの様に使うかによって、Dispose した方が良いのかどうかも異なります。
> >>今提示されている情報からは、どっちの方が良いという判断はできません。
>>
>>現在フォームBの呼び出しはShowDialogで行っています。
>>呼び出されたフォームBはOKボタンが押されたら自分で自分をCloseしています。
>>フォームBを表示する際にBで宣言しているpublic変数に値を設定するのは、呼び出し元のフォームAです。
>>CloseでアクティブがAに戻ってきたら、Bで設定した値をAは読みとっています。
>>そのあと、AがBをDispose しています。
>>
>>拙い説明ですが、お分かりいただけますでしょうか?
>
>
> 変数の有効範囲がわかりません。
> インスタンスと同じ期間有効な変数に参照させているなら、Dispose する必要は、あまりありません。
> メソッド内のみ有効な変数に参照させているなら、メソッドを出る前に Dispose するのがいいでしょう。

フォームBで宣言している変数はpublicです。
Bの値を設定するのはフォームAに配置しているコントロールです。
フォームBを宣言して、呼び出して〜の一連の処理はフォームAのクラスの中の1つの関数のなかですべて行っています。
フォームBの変数の有効範囲は関数中ということになるので、Disposeの必要はあまりないと考えてOKでしょうか?
引用返信 編集キー/
■39338 / inTopicNo.8)  Re[7]: フォームClose後にデータ読みとってもよいのでしょうか?
□投稿者/ Jitta on the way (372回)-(2009/08/05(Wed) 18:36:13)
No39315 (プリ太 さん) に返信
>>変数の有効範囲がわかりません。
>>インスタンスと同じ期間有効な変数に参照させているなら、Dispose する必要は、あまりありません。
>>メソッド内のみ有効な変数に参照させているなら、メソッドを出る前に Dispose するのがいいでしょう。
>
> フォームBで宣言している変数はpublicです。
> Bの値を設定するのはフォームAに配置しているコントロールです。
> フォームBを宣言して、呼び出して〜の一連の処理はフォームAのクラスの中の1つの関数のなかですべて行っています。
> フォームBの変数の有効範囲は関数中ということになるので、Disposeの必要はあまりないと考えてOKでしょうか?


コードで示せたら早いのかも知れないけど、on the way なので難しい。ごめんね。

public や private というのは、アクセス範囲の問題です。
あなたが言われている「関数内」は、私が言っている「メソッド内」です。


VB だと module という反則技に近いものがありますが、これは横にどけておいて。
変数の有効範囲は、それが宣言されたブロックに、ほぼ等しいです。VB だと、終わりの「End なんとか」と対の「なんとか」です。「If 〜 End If」「Sub 〜 End Sub」「Class 〜 End Class」など。
(C# などでは宣言された位置から下にのみ有効ですが、VB は宣言されたブロック全体で有効なのが悩ましい。)
「Class 〜 End Class」の範囲で有効なものを、「インスタンスと同じ範囲で有効」と書きました。

この辺、デバッグの時に意識しないと大変なことになることがあるので、しっかり覚えてください。


これでだいたい通じると思いますが、どうでしょう?
引用返信 編集キー/
■39339 / inTopicNo.9)  Re[8]: フォームClose後にデータ読みとってもよいのでしょうか?
□投稿者/ プリ太 (45回)-(2009/08/05(Wed) 19:14:39)
Jitta on the way さん、ありがとうございます。

とても丁寧に説明していだきありがとうございました。
確かに、VBは宣言無しでも変数を使うことができるので、面倒でした。
#Option Explicit使い出してからは防げましたが。

丁寧に説明していただいたので、納得&理解できました。
説明時に、ちゃんと語句を使えるようにならないといけませんね。
今まで書いてきたところも、もう一度見直してみます。

ありがとうございました。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -