• ベストアンサー

VB 2005の処理について

質問です。 showとshowdialogの違いについて教えてください。 また逆に、Dispose メソッド、Close メソッドの違いについて教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#259269
noname#259269
回答No.1

A画面から ShowDialog でB画面を開くと、A画面が操作できなくなります。一方 Show だとA画面は操作できます。 Dispose/Closeについては実装によりますが、一般的に言うと、 Dispose は、クラスインスタンス内のアンマネージドリソースを解放する為にあり、通常はそのインスタンスをもう利用しなくなったら呼び出します。 Close は、アンマネージドリソースを解放する点では(おそらく)同じですが、そのインスタンスを Open メソッドなどを呼び出して再利用する事が可能です(実装によると思います)。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • CloseとDisposeの違い

    みなさまこんばんわです。よろしくお願い申し上げます。 VB.NET 2008でコーディングしています。 CloseとDisposeの違いについて教えていただきたいのです。 これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。 たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。 これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。 そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。 ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。 わけわからなくなってきました。。。 ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。 ここで4つの仮説を立ててみました。 1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる 2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる 3. 呼び出し方ではなく、別の要因が存在する 4. 併記する必要がある場合がある Me.Close() Me.Dispose() または、 Me.Dispose() Me.Close() どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

  • WindowsFormの消去について(C#)

    こんにちわ。 C#(WindowsForm)で以下のような処理を考えています。 1.起動するとForm1(ログイン画面)が開く 2-1.認証に成功 → 3へ 2-2.認証に失敗 → メッセージを表示し、ログイン画面のユーザ名にフォーカスをセット 3.Form3(メインメニュー)を開く そこで、スタートアップの画面は、Form1で良いと思うのですが、 2-1の場合に、以下のようなコードを書いてみました。 *************************************** Form3 f = new Form3(); f.ShowDialog(this); f.Dispose(); this.Close(); *************************************** これでは、次の部分で目的を達成できませんでした。 A.Form3をShowDaialog(this)で開くと、モーダルモードで開くだけとなってしまう。 Showではモードレスとなるだけ。 B.Dispose、Closeを記述してみたが、Form3が開いた時に、 画面上からForm1が消えるわけではない。 Closeでは、システム自体が終了してしまう。 そこで、ShowDialogやShowではなく、Form1を消し、Form3を表示するメソッド等あるのでしょうか? ちなみに、Form3をCloseした場合に、Form1を再度呼び出す処理は考えていません。

  • VB.NET でのLaod/unLoad について

    VB6.0 には、Load/unload でのフォームを 読み込み、あるいは、開放(?)があったかと思います。 .NET以降は、調べたところ showメソッドか、 showDialogを使うみたいですが、いずれも 読み込みし終えて、Unloadするときはメモリからも 開放されるんでしょうか? あと、Load・Unloadのコードサンプルを ここで教えていただけないでしょうか。 乱文ですが、教えていただけると嬉しいです。

  • (VB2008EEです)Form1からForm2をモーダレスで表示(S

    (VB2008EEです)Form1からForm2をモーダレスで表示(Show(Me))したのち、 Form2を、(Form2の)閉じるボタン(右上にあるXボタン)で閉じるときに、 単にHideするだけの処理に変更することは可能でしょうか。 デフォルトでは、閉じるボタンですと、Close()と同様、 Close(&Dispose)となると思いますが、Hide()処理に 変えられるかということです。 。。。 試しに、FormClosingイベントハンドラでHide()→e.cancel=Trueって やってみたところ、(再度同じForm2のインスタンスを使ってShowができ、 さらに前回のText表示などが残っているなど)その場はうまく行ったように 見えたのですが、そうすると、アプリ(Form1)が閉じるボタンで終了しなくなって しまいました。 (Application.Exitでもダメ、Endでは(強制終了とのことなので)OKですが) Form2のClose処理をCancelしているからだ、とは思いますが。 ShowDialog→Xボタン(同じ記述のまま) の後では、終了可能です。 では、Show→Xボタンのあとで、同じインスタンスで、上記と同じように、 ShowDialog→Xボタンとしたあと、Form1のXボタンでアプリを 終了させようとするとどうなるか。 結果は、終了不能でした。 一度Show→Xしたらそれをどこかに覚えている?ってことなのでしょうか。。。 ここらへんの現象まで、合わせて説明できる方がいらっしゃったら 合わせてご説明いただけませんでしょうか。 。。。 なお、なぜこんなことするの?という実際論はここではなしで 純粋に技術論でお願いいたします。

  • VB.NET スプラッシュスクリーンについて

    .NET初心者です。 スプラッシュスクリーンについてお尋ねします。スクリーンを自動で閉じるのではなく、手動で(ボタンのクリックで)閉じるようにしたいのですが、 http://msdn.microsoft.com/ja-jp/library/cc681209.aspx、 http://msdn.microsoft.com/ja-jp/library/system.windows.splashscreen.close.aspxによると ScreenSprashのShowメソッドでautoCloseをFalseにすれば手動でスクリーンを閉じることが出来ると書いてあるのですが、これはApplicationEvents.vbに書き込めば良いのでしょうか?それともスクリーンにでしょうか? また、Showメソッドの使い方も良く分かりません。 構文がPublic Sub Show(ByVal autoClose As Boolean)としてあったので、ためしに Public Sub Show(ByVal autoClose As Boolean) autoClose = False End Sub としてみました。案の定ですが動きません。 もう一つ、Closeメソッドの構文を見ると Public Sub Close ( _ fadeoutDuration As TimeSpan _ ) と、時間制がとられているのですが、これをタイムスパンではなくボタンクリックでスクリーンを終了するようにしたいのですが、このメソッドで出来るのでしょうか? スプラッシュスクリーンを使用することが先方の要望のため代替作戦が利かず、かつ調べても使用例が出てこなくて困ってます。あってもC言語でした。

  • スレッド起動したフォームを正常に終了させる。

    Visual Studio 2005 C#.netです。 クラスからフォームをバックグラウンドスレッド起動して、そのフォームを起動したクラスから正常にフォームを消去させたい(終了)させたいのですが、どうすればいいのでしょうか? 現在、以下のプログラムにて実現していますが、Abortで強制終了させているのでDispose(); も行われていないと思います。 呼び出し側からアクションを起こしてAbortではなく、スレッド側から正常に終了させたいのです。 また、Showメソッドだとフォーム表示が一瞬で終わってしまうのは何故でしょうか? よろしくお願いいたします。 クラス: public class FormDisplayClass { //スレッド private System.Threading.Thread thread; //フォーム private TestForm TF = new TestForm();//フォームは別に存在するとします。 //表示メソッド public void Show() { //スレッド設定 this.thread = new System.Threading.Thread( new System.Threading.ThreadStart(FormShow)); //バックグラウンド this.thread.IsBackground = true; //スタート this.thread.Start(); } /// <summary> /// スレッドを終了させる。 /// </summary> public void Close() { this.thread.Abort(); } /// <summary> /// フォームを表示させる /// </summary> private void FormShow() { this.SWD.ShowDialog();//表示      (Showだと表示を持続できない) this.SWD.Dispose(); } #endregion } 呼び出し側: FormDisplayClass FDC = new FormDisplayClass();    private 表示メソッド { FDC.Show(); }    private 終了メソッド { sw.Close(); } } よろしくお願いします。

  • (VB2008)ShowDialogしたFormを閉じた時の、画面の挙

    (VB2008)ShowDialogしたFormを閉じた時の、画面の挙動について (VB2008EE、OSはVista) Form1からForm2を(ボタンのクリックイベントで) Dim f As New Form2 f.Show(Me) と記述して表示させたあと、 Form2の(ボタンのクリックイベントで) Me.Hide() として、Form2を閉じる記述を書きました。 で、Form2をShowDialogしてから、Hideを実行すると、 Form2が消えるのはいいのですが、残るForm1が、 ・デバッグ実行時は、VB2008EEのWindowの後ろに隠れてしまい、そのままとなる。 ・リリースビルドでは、さすがにそのままとはなりませんが、一旦Form1が  ちらつきます。 この回避策がありましたら教えてください。 。。。 ここからは、いろいろ実験した結果です。 ・試しに、Me.Hide()の後ろに、Threading.Thread.Sleep(5000)を 記述して実行すると5秒間Form1が後ろのアプリ画面に隠れた後、 Form1が前に表示される。 ・この場合の「後ろの別アプリのWindow」について、その別アプリが VB2008やエクスプローラだとForm2がそのアプリに隠れるのですが、 ExcelやIEだと、Form1が後ろに隠れることがないようです。。。 ・Hideではなく、Closeだと、後ろには隠れません。 (ただし、Closeの場合、Threading.Thread.Sleep(5000)の間はForm2は その前にClose()があっても、表示されたままSleepしその後閉じます) ・さらにShowDialog()でなく、Show()の場合、Owner指定して実行した場合は、 (つまりSHow(Me))全く問題なく、Form1が前面に表示されたまま 他のアプリが前に来ることはないのですが、 Ownerを指定せずにShowしたところ、ShowDialogと同様のことが起きるようです。 もし、これらの現象全体についてしっかりと説明できる方がいらっしゃれば、 説明もしていただけるとうれしいです。

  • ClientBase<TChannel> クラスの Dispose() メソッドについて

    お世話になっております。 http://oshiete1.goo.ne.jp/qa5572673.html に引き続き、 Dispose() メソッドの実装について不明な点があるので、よろしければご教示願います。 環境は、Visual C# 2008 Express Edition です。 .NET 3.5 まず、公開されているWebサービスに対して、 ソリューションエクスプローラより、サービス参照の追加で、Clientクラスを自動生成いたしました。 その自動生成されたクラス(仮に XSoapClient)が、System.ServiceModel.ClientBase<TChannel> クラスを継承しています。 ClientBase クラスは、IDisposable インタフェースを実装しているのですが、XSoapClient にも ClientBase にも、Dispose() メソッドの実装が見当たりません。 (自動生成のため、別の場所に作成されているのかもしれません。) using (XSoapClient client = new XSoapClient()) {  // ここにコード } とした場合に、client の Dispose() の実装がわからないため、 しっかりとコネクションが切れているのかが不明です。 Dispose() メソッド内では、Close() メソッドが呼ばれているのが普通なのでしょうか。 以上、よろしくお願いいたします。

  • VBでの質問です

    VBでの質問です Form1と2があるとします Form1とあるボタンを押すとForm2が開きFormが閉じるようにしたいのですがうまくいきません。どうしてでしょうか? Form1のコードで Form2.show Me.Close() と記述しましたがどこが違うのでしょうか。

  • showdialogを使わずにモーダル表示したい。

    VB2005環境です。 FormAから、FormBをShowしています。 FormB画面がある時は、FormAを触らせたくないので、 モーダル表示にしたいと考えているのですが、元々Showして 作っており、更にFormAがFormBのCloseイベントをハンドルして いろいろ処理を書いたせいか、原因が特定できないのですが、 ShowDialogしてcloseすると ystem.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。 とのエラーが出ます。 ShowでFormBを起動する作りのまま、FormAだけ触れないように したいのですが、Showでモーダル表示にできるような方法が ありましたら教えていただけないでしょうか? 宜しくお願いします。