none
呼び出し元のフォームをクロースするには? RRS feed

  • 質問

  • VB6では呼び出したフォームのフォームロードルーチンとかに、呼び出し元のフォームの

    アンロード文を書けばアンロード出来たが、VB2005のCloseでは、プログラム自体が

    終わってしまったりクロースしてくれなかったりする。

    どうしたら呼び出し元のフォームをクロース(アンロード)出来るでしょう??

    ご指導下さい。

    2007年3月2日 13:08

回答

  •  CatSystem さんからの引用

    よねKENさんご指導ありがとうございます。
    ご指摘の様に アプリケーションフレームワークを有効にする
    にチェックを入れ シャットダウンモード を 最後のフォームが閉じるときを選んでみました。

    動作させると、以前と同様に終了してしまいました。
    これはご指摘の親子関係になっているのかも知れません。

    親子関係になっているためではなくShowDialogを使っているためでしょう。
    例えば、FormAからFormBをShowDialogで表示した場合、
    FormBは前面に表示され、FormAを触れられません。これはShowDialogが呼び出し元フォームに対して
    モーダルフォームだからです。この方法で表示を行う場合、FormBがあるのにFormAがないという状態は変ですね。

     CatSystem さんからの引用

    親子関係とならない様に、立ち上げのフォームから別のフォームを立ち上げるにはどの様にすればよいのでしょう。
    VB6の xxxx.Show 1 が変換されて xxxx.ShowDialog()となっています。
     

    先の例でいうところのFormAはFormBを表示したときにクローズしたいのであれば、
    ShowDialogで表示する意味がありませんので、Showで呼び出してはどうでしょうか。
    私の予想が正しければおそらくそれだけで改善はされると思います。

     CatSystem さんからの引用

    次に、クローズしない件ですが、特に条件判断の中ではなく
    順次に立ち上げた2番目のフォームを3番目のフォームロード
    でクローズさせようとした場合、無視される感じでクローズされない
    といった感じです。

    私の方でも試しましたが、ShowDialogであればおっしゃるようになりました。

    それはさておき、例のFormBからFormAはどのようにクローズしているのでしょうか?
    My.Forms.~を利用されているのでしょうか?
    #My.Formsを使っていない場合、今までのお話の内容からはFormBはFormAへの参照を持っていないように思えるので、
    #FormAをCloseする手段がありません。

    これで解決しない場合は、問題の起きる最小限のコードを提示してください。
    今までもエスパー的な勘を働かせているだけなので、コードなしで問題点を当てるのはなかなか難しいです。

    2007年3月4日 8:10

すべての返信

  • #本題と関係ありませんが、クロースでなくクローズです。(クロースだと閉じるではなく近いの意味になります)

    > VB2005のCloseでは、プログラム自体が終わってしまったり

    メニューからプロジェクトのxxxxxのプロパティ(xxxxxはプロジェクト名)を開いてください。
    その中のシャットダウンモードが「スタートアップフォームが閉じるとき」となっている場合、
    最初のフォームが閉じる=アプリケーションの終了動作となります。
    「最後のフォームが閉じるとき」を選んでみてはどうでしょうか?
    呼び出し元フォームを閉じてもアプリケーションは終了しません。
    ただし、親子関係にあるフォーム間で子フォームが親フォームをクローズすると子フォームも閉じられてしまいます。

    >  クロースしてくれなかったりする。

    これはどのような場合でしょうか?
    もしLoadイベント内でなんらかの条件で判断してCloseしようとしているなら、それは止めましょう。
    呼び出し元フォームで条件判断をして最初から新しいフォームを開かないようにしましょう。

    2007年3月2日 13:39
  • よねKENさんご指導ありがとうございます。

    ご指摘の様に アプリケーションフレームワークを有効にする

    にチェックを入れ シャットダウンモード を 最後のフォームが閉じるとき

    を選んでみました。

    動作させると、以前と同様に終了してしまいました。

    これはご指摘の親子関係になっているのかも知れません。

    親子関係とならない様に、立ち上げのフォームから別のフォーム

    を立ち上げるにはどの様にすればよいのでしょう。

    VB6の xxxx.Show 1 が変換されて xxxx.ShowDialog()

    となっています。

     

    次に、クローズしない件ですが、特に条件判断の中ではなく

    順次に立ち上げた2番目のフォームを3番目のフォームロード

    でクローズさせようとした場合、無視される感じでクローズされない

    といった感じです。

    よろしくお願い致します。

     

     

    2007年3月3日 7:31
  •  CatSystem さんからの引用

    よねKENさんご指導ありがとうございます。
    ご指摘の様に アプリケーションフレームワークを有効にする
    にチェックを入れ シャットダウンモード を 最後のフォームが閉じるときを選んでみました。

    動作させると、以前と同様に終了してしまいました。
    これはご指摘の親子関係になっているのかも知れません。

    親子関係になっているためではなくShowDialogを使っているためでしょう。
    例えば、FormAからFormBをShowDialogで表示した場合、
    FormBは前面に表示され、FormAを触れられません。これはShowDialogが呼び出し元フォームに対して
    モーダルフォームだからです。この方法で表示を行う場合、FormBがあるのにFormAがないという状態は変ですね。

     CatSystem さんからの引用

    親子関係とならない様に、立ち上げのフォームから別のフォームを立ち上げるにはどの様にすればよいのでしょう。
    VB6の xxxx.Show 1 が変換されて xxxx.ShowDialog()となっています。
     

    先の例でいうところのFormAはFormBを表示したときにクローズしたいのであれば、
    ShowDialogで表示する意味がありませんので、Showで呼び出してはどうでしょうか。
    私の予想が正しければおそらくそれだけで改善はされると思います。

     CatSystem さんからの引用

    次に、クローズしない件ですが、特に条件判断の中ではなく
    順次に立ち上げた2番目のフォームを3番目のフォームロード
    でクローズさせようとした場合、無視される感じでクローズされない
    といった感じです。

    私の方でも試しましたが、ShowDialogであればおっしゃるようになりました。

    それはさておき、例のFormBからFormAはどのようにクローズしているのでしょうか?
    My.Forms.~を利用されているのでしょうか?
    #My.Formsを使っていない場合、今までのお話の内容からはFormBはFormAへの参照を持っていないように思えるので、
    #FormAをCloseする手段がありません。

    これで解決しない場合は、問題の起きる最小限のコードを提示してください。
    今までもエスパー的な勘を働かせているだけなので、コードなしで問題点を当てるのはなかなか難しいです。

    2007年3月4日 8:10
  • よねKENさんご指導ありがとうございます。

    シャットダウンモードの変更、及び xxxx.Show を使用する事で解決しました。

     

    尚、親子関係ですが、If 文中に xxxx.Show として文面上途中よりロードし、呼び出し元のフォームを

     xxxx.Close とすると終わってしまいます、これがご指摘の親子関係となるのでしょうか?

    文の最後に xxxx.Show を書けばOKですが。

     

    ご指導ありがとうございました、胸のつかえが取れた感じです、またのご指導よろしくお願い致します。

     

     

    2007年3月4日 14:13
  • よねKENさんへ 訂正

    If文中に xxxx.Show と書いた場合 終わってしまうと書きましたがこちらの勘違いでした。

    文の途中に書いてもOKでした、訂正いたします。

     

     

    2007年3月4日 15:03