型変換について

[戻る]
ふゆこ 2002/01/07(月) 13:35:46
あけましておめでとうございます。今年もよろしくお願いします。
エディットボックスに入力された文字(整数)をGetWindowTextでCString型変数aにセットし、
その値を用いて計算しようとしています。
計算するには型変換の必要があると思いますが、long(a)とすると
「class CStringからlongに変換できません。」とエラーになります。
そのままでも計算できません。どうすればよいのでしょうか?
ちなみにこの計算結果はスタティックテキストに表示させます。

sugar 2002/01/07(月) 13:55:11
MFCをお使いでしたら、DDEという技術を使って
エディットボックスの内容を直接、整数として取得することをお勧めします。

ちなみに、文字列を整数に直す場合は、atoi()やatol()という関数を使います。
まずはMSDNで調べてみてください。

2002/01/07(月) 14:55:55
long a = GetDlgItem(IDC_EDIT1)->GetDlgItemInt();
ってやり方もあります。

ふゆこ 2002/01/07(月) 15:43:16
ご回答ありがとうございます。
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++の文法もあまりわからないので、いろいろ作りながら覚えていこうとしている最中です。
なのでコーディングもおかしいのでしょうが、よろしくお願いします。

2002/01/07(月) 16:03:39
> long a = GetDlgItem(IDC_EDIT1)->GetDlgItemInt();
> ってやり方もあります。

失礼しました。

> long a = GetDlgItemInt(IDC_EDIT1);

これが正解でした。

ふゆこ 2002/01/07(月) 16:37:31
んさんの方法でエディットボックスの値を取得後、SetDlgItemIntを用いて計算結果をスタティックテキストに表示できました。
ただ、これってコントロールメンバ変数は使用してないんですよね・・・。
コントロールメンバ変数を用いるとどうすればいいんでしょうか?
   a=m_tanka_ctrl.GetDlgItemInt(IDC_EDIT_TANKA);
としてみてもaには何も入ってきませんでした。
またGetDlgItemIntはヘルプを見るとint型を超えると0になるということですが、
longの数値でも正しく動作しました。

sugar 2002/01/07(月) 17:08:48
GetDlgItemInt()はCWndクラスのメソッドですが、
実際にはダイアログボックスクラスが呼び出すことが多いです。
m_tanka_ctrlは多分CEditなんですよね?
これをどうしても使ってやるということであれば、
m_tanka_ctrl.GetWindowText()になるんだと思います。
で、取得した文字列を整数に変換する手順ですね。

> sugarさんのDDEを用いて直接やりとりする方法とはUpdateDataを使うことでしょうか?
>
そのとおりです。

> それではできましたが、以前こちらでコントロールメンバ関数を用い方うがいいというご意見を頂いて、
> 試しているところです。
>
データ型をコントロールで宣言するにも、有益な場合とそうでない場合があります。
ただ単に値を取得したいということだけであれば、なにもCEdit等のコントロール型にせず、
UpdateData()を使うパターンで十分なのではないでしょうか。

ふゆこ 2002/01/08(火) 09:51:35
> m_tanka_ctrl.GetWindowText()になるんだと思います。
> で、取得した文字列を整数に変換する手順ですね。
> 
ありがとうございます。
取得した文字列(CString)を整数に変換する方法が分かりません。
atolを用いても変換できないのですが・・・。
この場合、GetDlgItemIntを用いた方が簡単ということは分かりましたが、
今後のためにCStringを数値に変換する方法を教えていただけないでしょうか?

けん★ 2002/01/08(火) 10:25:23
CStringを数値に変換するのなら

CString  csData;
int      i;

csData = "12345";

i = atoi(csData);

これでできますよ。

CdS 2002/01/08(火) 10:25:27
>atolを用いても変換できないのですが・・・。
実際に試したのならどう書いたのかを書かないと。

    long l = atol(LPCTSTR(csText));

でいいのでは。

ふゆこ 2002/01/08(火) 11:35:23
> 実際に試したのならどう書いたのかを書かないと。
>
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))));
としてもだめでした。

けん★ 2002/01/08(火) 11:45:50
    m_kingaku_ctrl.SetWindowText(CString (atol(LPCTSTR((a)) * atol(LPCTSTR(b))));

    これはaとbをlong型に変換して掛け算をし、もう一度CStringに変換してSetWindowTextしようと
  していると思うのですが、long型からCStringに変換するには _ltoa 関数を使用します。

  CStringとlongではキャストできませんのでご注意ください。

ふゆこ 2002/01/08(火) 13:07:56
[[解決]]
みなさん、ありがとうございました。
以下の通りでできました。

    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を用いた方がはるかに簡単でした。

古いスレッドには追加発言できません。