none
コンソールアプリケーション起動時のコマンドライン引数を『Form1.h』に渡すには? RRS feed

  • 質問

  • VC++ 2005 EE を先月より始めた初心者です。
    標題の件、どうやったらいいのか、2週間近く模索しています。
    コンソールアプリケーションを作成し、ソリューションにフォームを追加、
    Form1.hが作成され、デザインを行い、ビルドして基本動作(以下の動作2)
    まで辿り着きました。
    if文で動作の場合分けを行おうとしたのですが…
    ・引数はmain関数の
    int main(array<System:Tongue Tiedtring ^> ^args)
    で取得。
    ・ところがフォームの実動作記述は『Form1.h』内で行う。
    で、『Form1.h』への引き渡し方が分からない。
    ・グローバル変数?=>極力使うなと教わった。
    ・Form1.hをForm2.hにコピーして別動作のモノとして記述?=>冗長ですね~。

     

    やりたいことはForm1.hで設定された内容を

    動作1:
    (1)OKボタン押し=>Console::WriteLineで標準出力へ出力、エラーコード『0(ゼロ)』で終了
    (2)CANCELボタン押し=>エラーコード『1』で終了

    動作2:
    (1)OKボタン押し=>Console::WriteLineで標準出力へ出力、
    label2->Text=String::Format("Selected Mode is {0}", ft);
    で選択モードの番号(変数ftの内容)をラベル2に出力。(終了しない)
    (2)CANCELボタン押し=>エラーコード『1』で終了

    というだけのものです。

    現在main関数側のコードは以下の通りです。
    よろしくお願い致します。

    プログラム環境など:
    Visual C++ 2005 Express Edition
    OS:Windows 2000 5.00.2195 SP4


    ============================================================
    // g_fmt_sel3.cpp : メイン プロジェクト ファイルです。

    #include <stdio.h>
    #include "stdafx.h"
    #include "Form1.h"

    using namespace g_fmt_sel;

    #using <mscorlib.dll>
    #using <System.dll>
    #using <System.Windows.Forms.dll>
    #using <System.Drawing.dll>

    using namespace System;
    using namespace System::IO;
    using namespace System::Windows::Forms;
    using namespace System:Big Smilerawing;

    int main(array<System:Tongue Tiedtring ^> ^args)
    {
     Console::WriteLine(args[0]); //<====まあ、試しに書いてみました。
     Console::WriteLine(args[1]); //<====同上
     Console::WriteLine(args[2]); //<====同上
     Application::Run(gcnew Form1());
        Console::WriteLine(L"Hello World");
        return 0;
    }

    ===========================================================

    2008年9月4日 4:26

回答

  • まず、勉強したいのはC++/CLI(CLR)でのアプリケーションの組み方、C++言語のどちらなんでしょう?

    ExpressEditionはMFCを使ったアプリケーションが作成できないのでこれで勉強するならどちらかに

    なると思います。コンソールで勉強しようとしているみたいなのでC++言語なんじゃないかなぁと思ったんですが。

     

    で、わざわざコンソールアプリで始めているのになぜわざわざフォームを追加するのかなと。

    最初からウインドウを出すつもりならCLRのWindows フォームアプリケーションでやった方が良いと思います。

    ちなみにC++/CLI(CLR)はC++言語とは別の言語になりますのでC++言語の勉強をしたいなら

    やっている事が違う事になります。

    あと、この辺はちゃんと本を使って勉強した方が良いですよ。

    闇雲にやってもなかなか成果が出ないと思いますので。

     

    C++言語の勉強をするならWin32のWin32 コンソールアプリかWin32プロジェクトかどちらかになると思います。

    手元にExpressEditionが無いのでこの辺の正確な名前がわかりませんけれど。

     

    2008年9月4日 5:06
  • PATIOさん、早々のお返事、ありがとうございます。
    勉強したいというか、やりたいことは
    『コマンドプロンプト上で動かすバッチから、一部のパラメータ設定にGUIを使いたい』
    というところからきています。
    正直に言いますが、わたしは元々
    UNIX から ANSI-C, gcc, X11-MOTIF
    と来ていて、元来がハードウェア専門の為、暫くソフトはお休みしてました。
    時代が Windows 一色になり、改めてやろうと言うときに、自分なりに色々
    調べたりしているうち、知人の強い勧め(教科書なんかがいっぱいあるから)で
    VC++ を使い始めました。複雑なプログラミングをする訳じゃあないしと思ったのです。
    はC++/CLI とC++ が別物であることも、知ったのはつい数日前です。
    今までひとしきり付属の概要、チュートリアル、サンプルプログラムなどを読み、
    日経から出ている
    『マイクロソフト公式解説書 ひと目でわかるVisual C++ 2008アプリケーション開発入門』
    という本を買って、これも読みました。
    この程度やれば…と思いましたが…。
    ま、仕事で使う簡易ツールで、古いソフトでバッチからしか動かせないので、出来なければ
    諦めて他の方法を考えます。

    Form1.h 側で class 宣言の中で

    public:
      int cm;

    と変数 cm を宣言し、main 関数側のコードで

    Form1->cm

    で共通で使えないかとかとか模索してみたのですが…。

    どうもお世話様でした。m(__)m

    2008年9月4日 7:38
  • int型の値型であれば下記のような形で値を見ることはできます。

     

    main関数に戻ってくる時点でForm1はデストラクタ、つまりはDispose(true)が実行された後です。

    クラスのような参照型はこの時点で見に行くことは避けるべきでしょう。(自分で理解して作っているなら支障はないのかもしれませんが。。。)

     

    Code Snippet

    int main(array<System::String ^> ^args)
    {
     Form1^ frm = gcnew Form1();
     Application::Run(frm);
     Console::WriteLine(frm->cm.ToString());
     return 0;
    }

     

     

    2008年9月4日 15:02
    モデレータ
  • 発想を逆にしてみた方が簡単かもしれません。

    つまり唯一のWindowsアプリから複数のコンソールアプリケーションを

    任意のオプションで起動するという方法です。

    もっとも、これができる「アプリケーションランチャー」系フリーウェアが

    多数存在しますので、使えるものを探したほうが早いのかもしれませんが(vvWink

    2008年9月5日 2:45

すべての返信

  • まず、勉強したいのはC++/CLI(CLR)でのアプリケーションの組み方、C++言語のどちらなんでしょう?

    ExpressEditionはMFCを使ったアプリケーションが作成できないのでこれで勉強するならどちらかに

    なると思います。コンソールで勉強しようとしているみたいなのでC++言語なんじゃないかなぁと思ったんですが。

     

    で、わざわざコンソールアプリで始めているのになぜわざわざフォームを追加するのかなと。

    最初からウインドウを出すつもりならCLRのWindows フォームアプリケーションでやった方が良いと思います。

    ちなみにC++/CLI(CLR)はC++言語とは別の言語になりますのでC++言語の勉強をしたいなら

    やっている事が違う事になります。

    あと、この辺はちゃんと本を使って勉強した方が良いですよ。

    闇雲にやってもなかなか成果が出ないと思いますので。

     

    C++言語の勉強をするならWin32のWin32 コンソールアプリかWin32プロジェクトかどちらかになると思います。

    手元にExpressEditionが無いのでこの辺の正確な名前がわかりませんけれど。

     

    2008年9月4日 5:06
  • PATIOさん、早々のお返事、ありがとうございます。
    勉強したいというか、やりたいことは
    『コマンドプロンプト上で動かすバッチから、一部のパラメータ設定にGUIを使いたい』
    というところからきています。
    正直に言いますが、わたしは元々
    UNIX から ANSI-C, gcc, X11-MOTIF
    と来ていて、元来がハードウェア専門の為、暫くソフトはお休みしてました。
    時代が Windows 一色になり、改めてやろうと言うときに、自分なりに色々
    調べたりしているうち、知人の強い勧め(教科書なんかがいっぱいあるから)で
    VC++ を使い始めました。複雑なプログラミングをする訳じゃあないしと思ったのです。
    はC++/CLI とC++ が別物であることも、知ったのはつい数日前です。
    今までひとしきり付属の概要、チュートリアル、サンプルプログラムなどを読み、
    日経から出ている
    『マイクロソフト公式解説書 ひと目でわかるVisual C++ 2008アプリケーション開発入門』
    という本を買って、これも読みました。
    この程度やれば…と思いましたが…。
    ま、仕事で使う簡易ツールで、古いソフトでバッチからしか動かせないので、出来なければ
    諦めて他の方法を考えます。

    Form1.h 側で class 宣言の中で

    public:
      int cm;

    と変数 cm を宣言し、main 関数側のコードで

    Form1->cm

    で共通で使えないかとかとか模索してみたのですが…。

    どうもお世話様でした。m(__)m

    2008年9月4日 7:38
  • int型の値型であれば下記のような形で値を見ることはできます。

     

    main関数に戻ってくる時点でForm1はデストラクタ、つまりはDispose(true)が実行された後です。

    クラスのような参照型はこの時点で見に行くことは避けるべきでしょう。(自分で理解して作っているなら支障はないのかもしれませんが。。。)

     

    Code Snippet

    int main(array<System::String ^> ^args)
    {
     Form1^ frm = gcnew Form1();
     Application::Run(frm);
     Console::WriteLine(frm->cm.ToString());
     return 0;
    }

     

     

    2008年9月4日 15:02
    モデレータ
  • 発想を逆にしてみた方が簡単かもしれません。

    つまり唯一のWindowsアプリから複数のコンソールアプリケーションを

    任意のオプションで起動するという方法です。

    もっとも、これができる「アプリケーションランチャー」系フリーウェアが

    多数存在しますので、使えるものを探したほうが早いのかもしれませんが(vvWink

    2008年9月5日 2:45
  • こんにちは。中川俊輔 です。

     

    皆様、回答ありがとうございます。

     

    孔悦さん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?

    有用な情報と思われる回答へ回答済みチェックをつけさせていただきました。

    追加の質問等ありましたら、是非投稿してみてください!

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    孔悦さんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

    2008年9月18日 5:57
  • ご回答頂いた皆様、中川様、どうもお世話様です。

    実は投稿の後、急な病気にかかってしまい、緊急入院、その後も自宅療養を余儀なくされ、

    先週末くらいからやっと職場復帰しました。

    帯状疱疹という病気で、本当は発病から3日以内の治療が理想らしいのですが、

    1週間以上我慢してしまい、入院時には『重症』と言われる程でした。

    右首筋から右耳、後頭部に至るまで疱疹が出てしまい、そのままでは脳まで

    いかれるとの診断で緊急入院となりました。

    (これは子供の頃にかかった水疱瘡のウイルスが、神経節というところに潜伏

    していて、偶然免疫力が落ちた時などに発症、ウイルスが神経を食い荒らしながら

    進んでいくというものです。視神経をやられて失明する人もいるとか…)

    大人の場合、発症は7人に1人との医師の話でしたので、みなさまもお気を付け

    下さいますよう…。

     

    さらに休職中にPC環境も変わってしまい、Win2k->WinXPとなり、VC++も

    2008を本日インストールしました。

    そんなわけで徐々に復帰、プログラムもゆっくりトライしてみようと思います。

    どうもありがとうございました。m(__)m

    2008年11月5日 6:31