
C#のSystem.Windows.Forms.FormクラスのShowメソッドについて調べています。
Showメソッドを使うことで、モードレスでフォームを表示できます。
http://msdn2.microsoft.com/ja-jp/library/39wcs2d …
例えば、ボタンがクリックされたときに、モードレスでフォームを表示する場合は、以下のようになると思います。
// ボタンがクリックされたときにコールされるメソッド
private void button1_Click(object sender, EventArgs e) {
MyForm form = new MyForm(); // MyFormはFormの継承クラス
form.Show();
}
このとき、button1_Clickメソッドが終了しても、
つまり、変数formのスコープから処理が外れても、MyFormは表示され続けます。
別スレッドで表示しているのかと思いましたが、MyFormを表示してもスレッド数は変わりませんでした。
なぜ、変数formのスコープから処理が外れても、MyFormが表示され続けるのかわかりません。
どなたかご存知の方がいらっしゃいましたら、ご教授いただけると幸いです。
環境 : WindowsXP SP2, .NET Framework 2.0, Visual Studio 2005
No.2ベストアンサー
- 回答日時:
色々ややこしい話があったと覚えている上に元ネタ失念なのですが,
Formクラスの中で表示中のForm一覧みたいなコレクションを持っている,
というのが理由だったと思います。
その結果,表示されているFormについては,GC対象にならず表示し続けているのだったと思います。
# 公開された,ソースコードをあたれば一発なのでしょうが……。
ちなみに,インスタンスが生存する期間は,newされてからGCされるまでです。
CloseだのDisposeだのは,Unmanaged Resourceを解放するための手段にすぎません。
No.3
- 回答日時:
Formをnewすると、自分で書いたプログラムの変数で受け取る参照とは別にフレームワークが内部で参照を持ちます。
なので変数のライフタイムが終了してもフレームワークからの参照は残り続けるので表示されたままです。
既に書かれている通りフレームワークが保持している参照はコレクションから取得できます。
Disposeはフレームワークが保持している参照を破棄させます。
Closeはフォームを閉じるだけです。
> なぜ、変数formのスコープから処理が外れても、MyFormが表示され続けるのかわかりません。
この理屈だと最初のフォームは表示されること無く(あるいは一瞬で)消えてしまうことになるかと。
No.1
- 回答日時:
fromがnewで実体化されたインスタンス変数だからです
実体化したクラスは 明示的にCloseまたはDisposeを呼び出すまで存続します
ご回答ありがとうございます。
なんなとくわかった気がします。
>fromがnewで実体化されたインスタンス変数だからです
失礼ですが、formはインスタンス変数ではなく、ローカル変数だと認識しております。
http://msdn.microsoft.com/library/ja/default.asp …
>実体化したクラスは 明示的にCloseまたはDisposeを呼び出すまで存続します
なるほど。
よく考えてみると、ローカル変数formは、言わばC言語のポインタの役割しかしていないため、
それがスコープから外れる外れないに関係なく、インスタンス(=実体化したクラス)はメモリ上に残り続けるとというわけですね。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- C言語・C++・C# C# 継承の問題で programに示された拡張をすべて含んだ上で,クラス Mammal に,そのオ 1 2022/07/22 09:48
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CloseとDisposeの違い
-
C# 超初心者です。 this.Refres...
-
フィールド(メンバ変数)のプリ...
-
[C#]FormクラスのShowメソッド...
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
Excelシート上のマクロを登録し...
-
VBA エンターキーでイベントに...
-
switch の範囲指定
-
【Excel】特定の文字を含むセル...
-
DoEventsがやはり分からない
-
エクセルVBAで、MsgBox やInput...
-
PDFフォームに本日の日付を自動...
-
マクロを登録しているボタンが...
-
UMLでの例外処理
-
【Excel VBA】マクロボタンを表...
-
複数シートのボタンに同一の動...
-
VB.NET Excelを読み込んでDataT...
-
UPS警告音を止めたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CloseとDisposeの違い
-
C# 超初心者です。 this.Refres...
-
[C#]FormクラスのShowメソッド...
-
VB.NET スプラッシュスクリー...
-
C#のインスタンスを参照渡ししたい
-
フィールド(メンバ変数)のプリ...
-
どういうプログラムで組みます...
-
vb.net フォームアプリケーシ...
-
DLL内のイベントをハンドリング
-
Try~Catch、Finallyについて。
-
コールバックでイベントを使う...
-
Pythonについて 関数の仮引数に...
-
C# HAPで属性を追加後、OuterText
-
objective-Cについてご相談があ...
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
Excelシート上のマクロを登録し...
-
エクセルVBAで、MsgBox やInput...
-
【Excel】特定の文字を含むセル...
-
VBA エンターキーでイベントに...
おすすめ情報