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

質問
-
VC++ 2005 EE を先月より始めた初心者です。
標題の件、どうやったらいいのか、2週間近く模索しています。
コンソールアプリケーションを作成し、ソリューションにフォームを追加、
Form1.hが作成され、デザインを行い、ビルドして基本動作(以下の動作2)
まで辿り着きました。
if文で動作の場合分けを行おうとしたのですが…
・引数はmain関数の
int main(array<System:tring ^> ^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:rawing;
int main(array<System:
tring ^> ^args)
{
Console::WriteLine(args[0]); //<====まあ、試しに書いてみました。
Console::WriteLine(args[1]); //<====同上
Console::WriteLine(args[2]); //<====同上
Application::Run(gcnew Form1());
Console::WriteLine(L"Hello World");
return 0;
}===========================================================
回答
-
まず、勉強したいのはC++/CLI(CLR)でのアプリケーションの組み方、C++言語のどちらなんでしょう?
ExpressEditionはMFCを使ったアプリケーションが作成できないのでこれで勉強するならどちらかに
なると思います。コンソールで勉強しようとしているみたいなのでC++言語なんじゃないかなぁと思ったんですが。
で、わざわざコンソールアプリで始めているのになぜわざわざフォームを追加するのかなと。
最初からウインドウを出すつもりならCLRのWindows フォームアプリケーションでやった方が良いと思います。
ちなみにC++/CLI(CLR)はC++言語とは別の言語になりますのでC++言語の勉強をしたいなら
やっている事が違う事になります。
あと、この辺はちゃんと本を使って勉強した方が良いですよ。
闇雲にやってもなかなか成果が出ないと思いますので。
C++言語の勉強をするならWin32のWin32 コンソールアプリかWin32プロジェクトかどちらかになると思います。
手元にExpressEditionが無いのでこの辺の正確な名前がわかりませんけれど。
-
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
-
int型の値型であれば下記のような形で値を見ることはできます。
main関数に戻ってくる時点でForm1はデストラクタ、つまりはDispose(true)が実行された後です。
クラスのような参照型はこの時点で見に行くことは避けるべきでしょう。(自分で理解して作っているなら支障はないのかもしれませんが。。。)
Code Snippetint main(array<System::String ^> ^args)
{
Form1^ frm = gcnew Form1();
Application::Run(frm);
Console::WriteLine(frm->cm.ToString());
return 0;
}
すべての返信
-
まず、勉強したいのはC++/CLI(CLR)でのアプリケーションの組み方、C++言語のどちらなんでしょう?
ExpressEditionはMFCを使ったアプリケーションが作成できないのでこれで勉強するならどちらかに
なると思います。コンソールで勉強しようとしているみたいなのでC++言語なんじゃないかなぁと思ったんですが。
で、わざわざコンソールアプリで始めているのになぜわざわざフォームを追加するのかなと。
最初からウインドウを出すつもりならCLRのWindows フォームアプリケーションでやった方が良いと思います。
ちなみにC++/CLI(CLR)はC++言語とは別の言語になりますのでC++言語の勉強をしたいなら
やっている事が違う事になります。
あと、この辺はちゃんと本を使って勉強した方が良いですよ。
闇雲にやってもなかなか成果が出ないと思いますので。
C++言語の勉強をするならWin32のWin32 コンソールアプリかWin32プロジェクトかどちらかになると思います。
手元にExpressEditionが無いのでこの辺の正確な名前がわかりませんけれど。
-
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
-
int型の値型であれば下記のような形で値を見ることはできます。
main関数に戻ってくる時点でForm1はデストラクタ、つまりはDispose(true)が実行された後です。
クラスのような参照型はこの時点で見に行くことは避けるべきでしょう。(自分で理解して作っているなら支障はないのかもしれませんが。。。)
Code Snippetint main(array<System::String ^> ^args)
{
Form1^ frm = gcnew Form1();
Application::Run(frm);
Console::WriteLine(frm->cm.ToString());
return 0;
} -
-
ご回答頂いた皆様、中川様、どうもお世話様です。
実は投稿の後、急な病気にかかってしまい、緊急入院、その後も自宅療養を余儀なくされ、
先週末くらいからやっと職場復帰しました。
帯状疱疹という病気で、本当は発病から3日以内の治療が理想らしいのですが、
1週間以上我慢してしまい、入院時には『重症』と言われる程でした。
右首筋から右耳、後頭部に至るまで疱疹が出てしまい、そのままでは脳まで
いかれるとの診断で緊急入院となりました。
(これは子供の頃にかかった水疱瘡のウイルスが、神経節というところに潜伏
していて、偶然免疫力が落ちた時などに発症、ウイルスが神経を食い荒らしながら
進んでいくというものです。視神経をやられて失明する人もいるとか…)
大人の場合、発症は7人に1人との医師の話でしたので、みなさまもお気を付け
下さいますよう…。
さらに休職中にPC環境も変わってしまい、Win2k->WinXPとなり、VC++も
2008を本日インストールしました。
そんなわけで徐々に復帰、プログラムもゆっくりトライしてみようと思います。
どうもありがとうございました。m(__)m