あけましておめでとうございます。今年もよろしくお願いします。
エディットボックスに入力された文字(整数)をGetWindowTextでCString型変数aにセットし、
その値を用いて計算しようとしています。
計算するには型変換の必要があると思いますが、long(a)とすると
「class CStringからlongに変換できません。」とエラーになります。
そのままでも計算できません。どうすればよいのでしょうか?
ちなみにこの計算結果はスタティックテキストに表示させます。
MFCをお使いでしたら、DDEという技術を使って
エディットボックスの内容を直接、整数として取得することをお勧めします。
ちなみに、文字列を整数に直す場合は、atoi()やatol()という関数を使います。
まずはMSDNで調べてみてください。
long a = GetDlgItem(IDC_EDIT1)->GetDlgItemInt();
ってやり方もあります。
ご回答ありがとうございます。
sugarさんのDDEを用いて直接やりとりする方法とはUpdateDataを使うことでしょうか?
それではできましたが、以前こちらでコントロールメンバ関数を用い方うがいいというご意見を頂いて、
試しているところです。
またんさんの
long a = GetDlgItem(IDC_EDIT1)->GetDlgItemInt();
はこのままでは引数のエラーになったので、よくわからないまま
long a = GetDlgItem(IDC_EDIT1)->GetDlgItemInt(IDC_EDIT1);
としましたが、aには0しか入ってきませんでした。
CString a, b;
m_tanka_ctrl.GetWindowText(a);
m_suryo_ctrl.GetWindowText(b);
m_kingaku_ctrl.SetWindowText(CString (atol(a) * atol(b)));
こうするとエラーにはならないものの、正しい結果が表示されません。
a,bをCStringとしたのはGetWindowTextの引数がこの型だったからです。
m_tanka_ctrl、m_suryo_ctrlはエディットボックスのコントロールメンバ変数、
m_kingaku_ctrlはスタティックテキストのコントロールメンバ変数です。
どこがいけないのでしょうか?
C++の文法もあまりわからないので、いろいろ作りながら覚えていこうとしている最中です。
なのでコーディングもおかしいのでしょうが、よろしくお願いします。
> long a = GetDlgItem(IDC_EDIT1)->GetDlgItemInt();
> ってやり方もあります。
失礼しました。
> long a = GetDlgItemInt(IDC_EDIT1);
これが正解でした。
んさんの方法でエディットボックスの値を取得後、SetDlgItemIntを用いて計算結果をスタティックテキストに表示できました。
ただ、これってコントロールメンバ変数は使用してないんですよね・・・。
コントロールメンバ変数を用いるとどうすればいいんでしょうか?
a=m_tanka_ctrl.GetDlgItemInt(IDC_EDIT_TANKA);
としてみてもaには何も入ってきませんでした。
またGetDlgItemIntはヘルプを見るとint型を超えると0になるということですが、
longの数値でも正しく動作しました。
GetDlgItemInt()はCWndクラスのメソッドですが、
実際にはダイアログボックスクラスが呼び出すことが多いです。
m_tanka_ctrlは多分CEditなんですよね?
これをどうしても使ってやるということであれば、
m_tanka_ctrl.GetWindowText()になるんだと思います。
で、取得した文字列を整数に変換する手順ですね。
> sugarさんのDDEを用いて直接やりとりする方法とはUpdateDataを使うことでしょうか?
>
そのとおりです。
> それではできましたが、以前こちらでコントロールメンバ関数を用い方うがいいというご意見を頂いて、
> 試しているところです。
>
データ型をコントロールで宣言するにも、有益な場合とそうでない場合があります。
ただ単に値を取得したいということだけであれば、なにもCEdit等のコントロール型にせず、
UpdateData()を使うパターンで十分なのではないでしょうか。
> m_tanka_ctrl.GetWindowText()になるんだと思います。
> で、取得した文字列を整数に変換する手順ですね。
>
ありがとうございます。
取得した文字列(CString)を整数に変換する方法が分かりません。
atolを用いても変換できないのですが・・・。
この場合、GetDlgItemIntを用いた方が簡単ということは分かりましたが、
今後のためにCStringを数値に変換する方法を教えていただけないでしょうか?
CStringを数値に変換するのなら
CString csData;
int i;
csData = 12345;
i = atoi(csData);
これでできますよ。
>atolを用いても変換できないのですが・・・。
実際に試したのならどう書いたのかを書かないと。
long l = atol(LPCTSTR(csText));
でいいのでは。
> 実際に試したのならどう書いたのかを書かないと。
>
4件目の発言に書いたのですが・・・一言添えればよかったですね。
ちなみに
CString a, b;
m_tanka_ctrl.GetWindowText(a);
m_suryo_ctrl.GetWindowText(b);
m_kingaku_ctrl.SetWindowText(CString (atol(LPCTSTR((a)) * atol(LPCTSTR(b))));
としてもだめでした。
m_kingaku_ctrl.SetWindowText(CString (atol(LPCTSTR((a)) * atol(LPCTSTR(b))));
これはaとbをlong型に変換して掛け算をし、もう一度CStringに変換してSetWindowTextしようと
していると思うのですが、long型からCStringに変換するには _ltoa 関数を使用します。
CStringとlongではキャストできませんのでご注意ください。
みなさん、ありがとうございました。
以下の通りでできました。
CString a, b;
long c;
char d[15];
m_tanka_ctrl.GetWindowText(a);
m_suryo_ctrl.GetWindowText(b);
c=atol(a) * atol(b);
_ltoa(c,d,10);
m_kingaku_ctrl.SetWindowText(d);
長い道のりでした。
やはりGetDlgItemIntとSetDlgItemIntを用いた方がはるかに簡単でした。