none
windowsフォームアプリケーション関連について RRS feed

  • 質問

  • 重ね重ね質問させていただきます。

    現在VC++のwindowsフォームアプリケーションを使ってマウスのみで作業ができる環境を作ろうとしてます。

    以前ご回答いただいた方にサポートいただきリックボタン1を押せば外部アプリが起動し、クリックボタン2を押せば1で起動した外部アプリが終了するという形を作ることができました。

    これを応用し目標としている図1に示しているForm1の停止を押せば図2のForm2が発生しYesを押せば外部アプリを終了することができると思ったのですがうまくいきませんでした。(なおForm1とForm2のリンクはなんとかできています。)

    参考にさせていただき自分が書いたソースを載せますのでどこがおかしいのかご指摘いただけないでしょうか?

    お時間のある方よろしくお願いします。

    Form1のソース

     

    #pragma endregion

     public: System::Diagnostics::Process^ targetProcess; //保持しておくための変数

     private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

      if( targetProcess == nullptr)

      {

     targetProcess = System::Diagnostics::Process::Start("~\\.exe");

      }

     }

    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {

     Form2^ Form2child = gcnew Form2(); // 子フォーム生成する

    Form2child->ShowDialog(); // 子フォームを表示する

     }

     

    Form2のソース

     

    #pragma endregion

    public: System::Diagnostics::Process^ targetProcess; //保持しておくための変数

     

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

      if(targetProcess != nullptr)

     {

     targetProcess->Kill();

                                     targetProcess = nullptr;

     }

     }

    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {

     Close();

     }


     

     

     


    2011年12月18日 8:29

回答

  • とりあえず、闇雲にコードを書くのではなく、クラスとか、オブジェクトとかそういった概念を勉強してください。
    そして、別のオブジェクトに情報を渡す方法を調べてみてください。

    Form1 の targetProcess と、Form2 の targetProcess は別の変数(入れ物)ですから、Form1 の targetProcess に入れたものは、Form2 の targetProcess には入っていません。
    そのくらいが見当つくようになるぐらいには、基礎を学んでいただきたいとは思いますが…。
    (C++/CLI をやる以上、C++ はできないと今後大変です)

    あと、ブレークポイントを置くとその場所で実行を止めることができます。
    そうすれば、今何が起きているかを知るトリガーになりますよ。(デバッグの知識として)
    今であれば、Form2 の targetProcess が nullptr であることを見ることができます。

    # このぐらいであれば、MessageBox でよいんじゃと思わなくもない。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年12月18日 8:54
    モデレータ
  • 私もAzuleanさんの意見に賛成です。

    こうしたい時はこういうコードと言うようなパターンで覚えようとするのは危険です。
    やはり、使用言語の文法はきちんと抑えておく必要がありますし、
    言語を使うために必要な概念を理解しておく事は大事だと思います。

    文法の理解が足りない内はどう書いて良いのかわからないという状態におちいる事が少なからずあると思います。
    そういった状況におちいった時は一旦そのアプリの話からはなれて使用言語の文法が理解出来るまで文法書等を
    見直すことが必要だと思いますよ。

    早くアプリを動かしたいと言う気持ちもわからなくはないのですが、
    パターン学習だけで先に進んでしまうと結局文法が理解できていないがゆえに
    手戻りが発生したり、誤解したまま進んでしまう事がありえると思います。
    まずははやる気持ちを抑えて基礎的な部分にたち返る事が必要かと思います。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答の候補に設定 山本春海 2011年12月27日 8:36
    • 回答としてマーク 山本春海 2011年12月29日 8:29
    2011年12月19日 5:11

すべての返信

  • とりあえず、闇雲にコードを書くのではなく、クラスとか、オブジェクトとかそういった概念を勉強してください。
    そして、別のオブジェクトに情報を渡す方法を調べてみてください。

    Form1 の targetProcess と、Form2 の targetProcess は別の変数(入れ物)ですから、Form1 の targetProcess に入れたものは、Form2 の targetProcess には入っていません。
    そのくらいが見当つくようになるぐらいには、基礎を学んでいただきたいとは思いますが…。
    (C++/CLI をやる以上、C++ はできないと今後大変です)

    あと、ブレークポイントを置くとその場所で実行を止めることができます。
    そうすれば、今何が起きているかを知るトリガーになりますよ。(デバッグの知識として)
    今であれば、Form2 の targetProcess が nullptr であることを見ることができます。

    # このぐらいであれば、MessageBox でよいんじゃと思わなくもない。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年12月18日 8:54
    モデレータ
  • 私もAzuleanさんの意見に賛成です。

    こうしたい時はこういうコードと言うようなパターンで覚えようとするのは危険です。
    やはり、使用言語の文法はきちんと抑えておく必要がありますし、
    言語を使うために必要な概念を理解しておく事は大事だと思います。

    文法の理解が足りない内はどう書いて良いのかわからないという状態におちいる事が少なからずあると思います。
    そういった状況におちいった時は一旦そのアプリの話からはなれて使用言語の文法が理解出来るまで文法書等を
    見直すことが必要だと思いますよ。

    早くアプリを動かしたいと言う気持ちもわからなくはないのですが、
    パターン学習だけで先に進んでしまうと結局文法が理解できていないがゆえに
    手戻りが発生したり、誤解したまま進んでしまう事がありえると思います。
    まずははやる気持ちを抑えて基礎的な部分にたち返る事が必要かと思います。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答の候補に設定 山本春海 2011年12月27日 8:36
    • 回答としてマーク 山本春海 2011年12月29日 8:29
    2011年12月19日 5:11