• ベストアンサー

Editボックスから値を取り出す方法

toysmithの回答

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.5

取り出しについてはhyde-laさんのおっしゃる方法で。 変換ですが、値のエラーチェックを必要とするのならstrtod()、必要としないならatof()で良いでしょう。 atof()は入力文字列に変換不能文字が含まれていてもそれを報告しません。 strtod()は変換不能文字のアドレスを報告します。 例えば "ABC"→結果=0.0、変換不能文字→'A' "0.B"→結果=0.0、変換不能文字→'B' "0.0"→結果=0.0、変換不能文字→'\0' 結果として上の2つは入力エラーだとわかります。 ユーザインターフェースはタイプミスなどのケアレスミスに対応する必要があります。 自前でエラーチェックしてatof()やatoi()、sscanf()などを使うよりstrtod()やstrtof()を使うほうが効率的です。

ninja908
質問者

お礼

分かりやすく、適切な回答ありがとうございました。 あと、私の質問に答えてくださった他の皆様にも深く感謝いたします。 みなさんありがとうございました。

関連するQ&A

  • エディットボックスをEnableWindowを使って無効にしたい

    エディットボックスをEnableWindowを使って無効にしたいときにボックスのメンバ変数のカテゴリを値にしてタイプをdouble のままで、使う方法はないのでしょうか?コントロール、Ceditなら使えるのですが・・・ 教えてください。よろしくお願いします。

  • visualC++での文法

    VisualC++を勉強しているのですがどうしても分からないので教えてください。例えばダイアログベースでのMFCプロジェクト test を作り、コントロールにプッシュボタンとエディットボックスを配置し、プッシュボタンのイベントハンドラに void CtestDlg::OnBnClickedButton1() { CEdit* Settext =(CEdit*)GetDlgItem(IDC_EDIT1); Settext -> SetWindowText("OKWEB"); } とすれば、プッシュボタンを押したときにエディットボックスにOKWEBと表示されますよね。 この場合のCEdit* Settext =(CEdit*)GetDlgItem(IDC_EDIT1); の(CEdit*)は何なのでしょうか?最初のCEdit* はSettextがCEdit*クラスを示すポインタになるのは理解できるのですが、(CEdit*)はオブジェクトでそれがGetDlgItemを使っているのでしょうか。それならば、(CEdit*).GetDlgItem(IDC_EDIT1) じゃないのでしょうか?それとも(CEdit*)はキャストか何かなのでしょうか? C++の勉強が足りないのは分かってるのですが、VisualC++の勉強と同時進行なのでどうも混乱しています。詳しい方どうかお願いします。

  • コントロールへのイベント定義の仕方

    VS2005のVC++で組んでいます。 メンバ変数として定義した CEdit m_edit の OnChange イベントを記述するやりかたを教えていただけますか? m_edit は OnInitialUpdate() で create しています。 よろしくお願いします。

  • GetDlgItemInt( ) c++

    現在MFCでウィンドウプログラムを作成しています。 現在、エディットボックス(IDC_EDIT1)が1つあり その変数に CEdit m_ed1; と、もう1つ double d_ed1; があります。 どちらもIDC_EDIT1に対する変数です。 IDC_EDIT1で入力された値(2.56)をd_ed1に代入したいのです。 d_ed1 = GetDlgItemInt(IDC_EDIT1); としたらもちろん d_ed1には [2]しか入らないわけなのですが、 これを解消するにはどうしたらよいのでしょうか。 ご教授の程お願いいたします。

  • エディットボックスでテキストの最後に入力したい?

    エディットボックスで最後の位置に ( が入力されたときに閉じ括弧の ) を出力して () としたいのです が、下のコードだと ( が入ったときに )( となってしまいます。いろいろ試していますが () と出力 できないので、わかる方よろしくお願いします。 int nStartChar, nEndChar; CEdit *edit1 = (CEdit *) GetDlgItem(IDC_EDIT1); if(pMsg->message == WM_CHAR) if(pMsg->wParam == '(') { edit1->GetSel(nStartChar, nEndChar); edit1->SetSel(nStartChar, nEndChar); edit1->ReplaceSel(")"); }

  • VC++でダイアログ(Editボックス)を不可視にしたい

     この質問を見てくださって有難う御座います。 私がお聞きしたいのは、Editボックスの値が空の時、そのEditボックスを非表示にする方法です。  VBの場合ならば、 If テキストボックス = "" Then    テキストボックス.Visible = False End If と書くだけの簡単な事なのですが、VC++だと何を使ったら良いのか、なかなか分かりません。 多分探し方が悪いだけだと思いますが、何冊も本で調べてみたのですが、結局分かりませんでした。 MSDNで調べていたらなんとなく『Show』を使えば出来そうなのですが、この関数の使い方自体が分かりませんでした。  どうかご教授頂けないでしょうか? よろしくお願いします。

  • 複数のコンボボックスをforなどで扱う方法

    VIsualC++6.0 SDI でプログラムの勉強をしています。 コンボボックス1 コンボボックス2 コンボボックス3   ・   ・ のようなダイアログボックスがあり、 コンボボックスについては、一個一個メンバ変数を割り当て、初期化をしています。 m_combo1.SetCurSel(0); m_combo2.SetCurSel(1); m_combo3.SetCurSel(2); これを、for(int i=0; i < n; i++){ のような繰り返し文を使って書にはどうやったらよいのでしょうか? また他に方法があったり、考え方が根本的に違っているようならご指摘ください。 一先ず、初期化は一個一個書いて終わらせたのですが、 実際の処理では、複数あるコンボボックスのデータを順々に送信する。 送信し終ったらまたコンボボックス1のデータを送信・・・。 と、ストップボタンを押してスレッドを抜けるまで送信し続けると言う処理をさせたいのですが、 初期化のように出来ないため、質問させて頂きました。 よろしくお願いします。

  • ダイアログの上のテキストボックスの、初期値を設定する方法が分かりません・・・・

    VSC++2005です、 ダイアログの上のテキストボックスの初期値を設定する 方法が分かりません、 ダイアログが表示されたとき、 ダイアログに貼り付けてあるテキストボックスの初期値を 入力しておきたいのですが、うまくゆきません 下のようにしました、 ボタンをクリックして、ダイアログを表示させ ダイアログ上の エディットコントロールに、値を表示させるつもりですが、 void CXXXView::OnBnClickedButton2() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 Cfailsettei cf;  //ダイアログのクラスのインスタンス作成 cf.edit1.SetWindowTextA("yyy");   cf.edit2.SetWindowTextA("xxx"); //edit1、edit2は、エディットコントロールです cf.DoModal(); } エラーが起こってしまいます、 何故でしょうか? よろしくお願いします。

  • エディットボックスの内容をテキストファイルに書き込み・読み込みしたい

    プログラム初心者です。 VS2005を使用してWindowsアプリケーションの実装を行っているのですが、数個あるエディットボックスの内容を1つのテキストファイルに書き込み、そして後々に読み込みを行いたいと考えています。私の場合、エディットボックスに入力するのは数値のみなので、数値の書き込み・読み込みを行いたいのですがうまくいきません。 そこで質問なんですが、数個のエディットボックスのデータを格納する方法として、それぞれに変数を用いていいのでしょうか。 ex) edit0 = GetDlgItemInt(hDlg, IDC_EDIT1, NULL, TRUE); edit1 = GetDlgItemInt(hDlg, IDC_EDIT2, NULL, TRUE); それとも、1つの変数を配列として用いたほうがいいのでしょうか。 ex) edit[0] = GetDlgItemInt(hDlg, IDC_EDIT1, NULL, TRUE); edit[1] = GetDlgItemInt(hDlg, IDC_EDIT2, NULL, TRUE); もし前者として、その場合はWriteFileで書き込む(読み込む)場合どのようにしたら良いのでしょう。WriteFileを連続で書くとなると、上書きになるのか後ろから追加されるのかイメージがついていない状態です。 わかりずらい説明で申し訳ありません。 ご教授お願いいたします。

  • 閉じてしまったダイアログのエディットボックスへの書き込み禁止方法

    VC++ 6.0 MFC ダイアログベースです。 メインダイアログ画面で、ボタンを押下した時に、別ダイアログ(子ダイアログ)が呼び出されて、 その子ダイアログ内では、ワーカースレッドを使用して処理を行い、 処理結果をエディットボックスに表示させています。 子ダイアログを閉じる時に、WaitForSingleObject を使って、スレッドを完全に終了させてからダイアログを閉じるように しているのですが、スレッドの処理が、エディットボックスに書き込む時に閉じてしまうと、 スレッドがそこで止まってしまいスレッドが終了しません。 このような場合どうしたら良いのでしょうか? ・閉じるボタンが押されたら、エディットボックスに書き込まないようにすれば良いと思い、 (フラグを立てて試したのですが、フラグチェック後に閉じるが押されることがあり失敗) // スレッドの開始 m_Thread = AfxBeginThread(ThreadFunc, this);    // この時、子ダイアログを閉じてしまうと // INFINITEなので、ずっと止まってしまいます。 CString data = "処理結果"; case 0: m_M0edit.SetWindowText(data); break; case 1: m_M1edit.SetWindowText(data); break; case 2: m_M2edit.SetWindowText(data); break; ・ ・ ・ ・ // 子ダイアログを閉じる時に呼び出されます。 // スレッドでの処理が完全に終わるのを待ちます。 afx_msg void CSelecting_Dlg::OnClose() {   DWORD dwRet   dwRet = WaitForSingleObject(m_Thread->m_hThread, INFINITE);   EndDialog(0); } /***************/ 失敗談 /***************/ // スレッドの開始 m_Thread = AfxBeginThread(ThreadFunc, this);    // この時、子ダイアログを閉じてしまうと // INFINITEなので、ずっと止まってしまいます。 CString data = "処理結果"; if (m_openFlag == 1){ //フラグを見て書き込みするかチェックする。   switch (t){      case 0: m_M0edit.SetWindowText(data); break;      case 1: m_M1edit.SetWindowText(data); break;      case 2: m_M2edit.SetWindowText(data); break; ・ ・ ・ ・   } } // 子ダイアログを閉じる時に呼び出されます。 // スレッドでの処理が完全に終わるのを待ちます。 afx_msg void CSelecting_Dlg::OnClose() {   DWORD dwRet   m_openFlag = false; //閉じるボタンが押されたら フラグを降ろす。   dwRet = WaitForSingleObject(m_Thread->m_hThread, INFINITE);   EndDialog(0); }