• ベストアンサー

Parseという関数を使うとエラーが出る。

今Microsoft VC++ 2010 Expressを勉強しているのですが、 textbox1に入れた文字列を textbox2に入れたいと思い、コマンドボタンを押したら入るようにしたのですが、エラーが出ます。 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { char iVal = char::Parse(textbox1->Text); this->textBox2->Text = iVal; }

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

  • ベストアンサー
  • sygh
  • ベストアンサー率76% (42/55)
回答No.5

No.3 の補足に対する回答です。 補足にあるような、ある文字列から特定の長さ分だけ部分抽出する処理には、 System::SByte::Parse() などではなく、System::String::Substring() を使ったほうが楽です。 String^ hSrcStr = textBox1->Text; //String^ hSrcStr = L":100000004466FFFFFFFFFFFFFFFFFFFFFFFFFFFF54"; String^ hDstStr = L":"; for (int i = 1; i < hSrcStr->Length && i + 1 < hSrcStr->Length; i += 2) { hDstStr += hSrcStr->Substring(i, 2); hDstStr += L" "; } textBox2->Text = hDstStr; 質問される場合は、「最終的に何がしたいのか」をはっきりさせておいたほうがよいです。 重要な事前条件や事後条件が抜けていると、適切に回答するのはラプラスの悪魔でもないかぎり不可能です。 なお、繰り返しますが、VC 2010ではC++/CLIのインテリセンスが効かないので、VC 2008を使うか、C#を使ったほうが無難です。

techhouse
質問者

お礼

回答頂きありがとうございました! このようなやり方をすればよいのですね! 助かります。

その他の回答 (4)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

すみません。charの件、確認しました。 C++/CLIでは char = System::Sbyte のようです。 訂正いたします。

  • sygh
  • ベストアンサー率76% (42/55)
回答No.3

System::SByte::Parse(System::String^ s) は、数値を表すマネージ文字列を、8bit 符号付き整数値に変換するものです。 よって、 char val1 = char::Parse("121"); char val2 = char::Parse("-50"); などは正しく変換されますが、 char val3 = char::Parse("a"); char val4 = char::Parse("xyz"); などはフォーマット エラーになり、 char val5 = char::Parse("128"); char val6 = char::Parse("-129"); などはオーバーフローエラーになります。 テキスト文字列を単純にコピーしたいだけならば、他の回答者さんがおっしゃるとおり、Textプロパティをそのままコピー代入するだけで事足ります。 なお、C++/CLI では char が System::SByte 値クラス(value class)へのエイリアスになるので、char::Parse() という構文は間違いではありませんが、System::SByte::Parse() と書いたほうがベターではあります。 ついでに言うと、VC 2010 では C++/CLI のインテリセンスが一切効かないので、C++/CLI を勉強したいのであれば VC 2008 を使うか、VC 2012 以降でインテリセンスが改善されるのを待ったほうが良いかと。

techhouse
質問者

お礼

回答頂きありがとうございます。VC++初心者で、これからいろいろやりたいと考えているんですが、今目標として、textBox1->Textに ”:100000004466FFFFFFFFFFFFFFFFFFFFFFFFFFFF54”というデータをいれて、 このデータを加工して : 10 00 00 00 44 66 FF FF FF FF FF FF FF FF FF FF FF FF FF FF 54 このように2つの文字の後ろに1個スペースを空けて、いきその結果を textBox2->Textの中に入れたいと考えているんですが、このようなことがParseというものでできるのかなと思っているのですが・・・

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

どーでもいいんですが、もともとの目的を考えるなら単純に textBox2->Text = textBox1->Text; でよかありませんか?

techhouse
質問者

お礼

回答頂きありがとうございます。VC++初心者なもんで、これからいろいろやりたいと考えているんですが、今目標として、textBox1->Textに ”:100000004466FFFFFFFFFFFFFFFFFFFFFFFFFFFF54”というデータをいれて、 このデータを加工して : 10 00 00 00 44 66 FF FF FF FF FF FF FF FF FF FF FF FF FF FF 54 このように2つの文字の後ろに1個スペースを空けて、いきその結果を textBox2->Textの中に入れたいと考えているんですが、このようなことがParseというものでできるのかなと思っているのですが・・・

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

マニュアルはよく読みましょう。 エラーメッセージもよく読みましょう。 C++のchar型にはParseなんてメソッドはありません。 そもそもクラスではありません。 http://msdn.microsoft.com/ja-jp/library/system.char.parse%28v=vs.80%29.aspx ここを解決しても、textbox1が1文字だけしか入れないようになっているのかわかりませんが。

関連するQ&A

  • イベントハンドラ関数について

    現在VC++/CLR 2005 でプログラミングをしています。 基本的な事柄かもしれませんが、質問させてください  以下の2つのボタンのイベントハンドラ関数があった場合 //ボタン1のイベントハンドラ関数 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) String^ str = textBox1->Text } //ボタン2のイベントハンドラ関数 private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { } ボタン2をクリックしたときの動作とボタン1の動作を同じにしたいと思っています。 その場合は private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) String^ str = textBox1->Text } //ボタン2のイベントハンドラ関数 private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { String^ str = textBox1->Text } のようにボタン2のイベントハンドラ関数をボタン1と同じように書けばいいのですが イベントハンドラ関数の処理が膨大になった場合を考えて省略する 書き方は無いのでしょうか?(以下の場合ですとエラーが起こってしまいます。) private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { button1_Click(); } 宜しくお願いします

  • Sleep(0)について

    VS2010C++でWindowsフォームアプリケーションをつくろうとしています。 ループさせたいイベント(button1)中に、button2のイベントを行いたいのでSleep(0)を使って以下のようにしました。 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { while(1){ Sleep(0); // ループさせたいイベント ・・・・・・・・・・・・・・・・・・・・ } } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {    ・・・・・・・・・・・・・・・・・・・・ } アプリケーション起動後button1をクリックすると、Sleep(0)が無いときと同じようにボタンを受け付けなくなります。 Sleep(0)の使い方が間違っているのでしょうか。

  • VC++で文字列を数値に変換する方法

    VC++にて、button1をクリックしたら、textBox1に入力された数字の文字列(10進数)を数値に変換して、x等の変数に16進数で格納したく。 下の { } の部分にどのように書けばいいのでしょうか?  初心者につき、できるだけ噛み砕いて、説明を加えて、回答お願いします。 また、textBox1に数字以外が入力されたら、エラー検出が可能であれば、その方法も教えて下さい。 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { }

  • C#でテキストボックスをクリック→フォームが開く→フォームで設定した値

    C#でテキストボックスをクリック→フォームが開く→フォームで設定した値を元のテキストボックスに入力 こんな感じのことをC#でやりたいのですがよくわからないので教えてください。 1. 親をForm1、子をForm2とします 2. Form1のTextBox1をクリックするとForm2が開いきます 3. Form2で設定した値をForm2の「入力」ボタンを押すとForm2が閉じてTextBox1に値が入力されます というものです。 ここで、textBoxは「クリックしたコントロール名を取得してForm2に渡したい」のです。 テキストボックスがたくさんあるので、textBox1とか決まった名前ではありません。 この部分がわからないのです。 ------------------------------------------------------- Form1: private void textBox1_Click(object sender, EventArgs e) {  Form2 fromItem = new Form2(sender);  DialogResult deRet = fromItem.ShowDialog(); } Form2: public Form2(object sender) {  InitializeComponent();  object pSender = sender; } private void button_input_Click(object sender, EventArgs e) {  ((System.Windows.Forms.TextBox)pSender).text = "hoge"; } ------------------------------------------------------- この程度しかわかりません。 正しい方法を教えてください。よろしくお願いいたします。

  • C#でオブジェクトの有無を取得する

    オブジェクトが作られている時と作られていない時で処理をわけたいのですがうまくいきません。 この書き方の何がまずいのでしょうか? namespace オブジェクト検索 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Control c = Controls["form2"]; if (c != null) { ((TextBox)c).Text += "*"; } } private void button2_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Show(); Application.DoEvents(); } } } ボタン2を押した時に新しいフォームが立ち上がり、そのフォームがあるときは*が出るようにしたいです。

  • PeekMessage()について

    Windowsフォームアプリケーションです。 ループさせたいイベント(button1)中に、button2のイベントを行いたいのでPeekMessage()を使って以下のようにしました。 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { while(1){ PeekMessage(&msg, NULL, 0, 0, PM_REMOVE); TranslateMessage(&msg); DispatchMessage(&msg); // ループさせたいイベント ・・・・・・・・・・・・・・・・・・・・ } } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {    ・・・・・・・・・・・・・・・・・・・・ } アプリケーション起動後、button1をクリックし、後にbutton2をクリックしようとすると代わりにbutton1がクリックされてしまいます。 PeekMessage()の使い方が間違っているのでしょうか。

  • VC++ 2008

    VC++2008(Express Edition)であるボタンを押したときの動作についてですが private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { richTextBox1->Text = "測定開始\n"; func(); // ある測定の関数です richTextBox1->Text += "測定終了"; } 上記のようなプログラムが実行されたとき、button1_Click()を抜けるまでテキストボックスに 測定開始 測定終了 の表示がされませんが何故でしょう? func()自体の処理に1分程かかるため、ボタンを押してから1分程経たないとテキストボックスには何も表示されない状態です。 リアルタイムで表示することは可能でしょうか?

  • vc++6.0とVisual C++ 2010

    遊び程度ですが、VC++をいじったことがあります。 もう何年も触っていませんが。 lVisual C++ 2010 Expressについて調べていたら、    private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {            label1->Text=L"はじめてのC++";         } というコードがありました。 vc++6.0に ”label1->Text=~”こんな1行で文字が表示できる方法ってありましたっけ。 次のサイトのような書き方だったと思いますが、コードの書き方が変わったのでしょうか? http://t-recipe.com/vc/string.html お分かりの方、教えてください。お願いします。

  • コンボボックスの削除の仕方

    コンボボックスのリストの削除はどうしたらよいでしょうか。 private: System::Void comboBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) { index = comboBox1->SelectedIndex; cout << "index=" << index << "\n"; } private: System::Void button2_Click_1(System::Object^ sender, System::EventArgs^ e) { //comboBoxからデータ削除 comboBox1->Items->RemoveAt(index); このようなコードを書いてみましたがうまくいいきません。

  • VC#2008の動作について

    VC#2008について、下記の場合、button1をクリックし、 その次に、button2をクリックしても全く反応しません。 どのように改良すれば反応しますか? 処理が重く止まったと感じた時、メッセージを表示した後、 アプリケーションを終了したいと思っています。 どなたかご存知の方、教えていただけないでしょうか? 宜しくお願い致します。 namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1(){ InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { System.Threading.Thread.Sleep(10000000); } private void button2_Click(object sender, EventArgs e) { MessageBox.Show("close"); System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName("myapp"); foreach (System.Diagnostics.Process k in p) { k.Kill(); } } } }

専門家に質問してみよう