型変換について – プログラミング – Home

通知
すべてクリア

[解決済] 型変換について


ふゆこ
 ふゆこ
(@ふゆこ)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

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


引用未解決
トピックタグ
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

MFCをお使いでしたら、DDEという技術を使って
エディットボックスの内容を直接、整数として取得することをお勧めします。

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


返信引用
ん
 ん
(@ん)
ゲスト
結合: 23年前
投稿: 106
 

long a = GetDlgItem(IDC_EDIT1)->GetDlgItemInt();
ってやり方もあります。


返信引用
ふゆこ
 ふゆこ
(@ふゆこ)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

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


返信引用
ん
 ん
(@ん)
ゲスト
結合: 23年前
投稿: 106
 

> long a = GetDlgItem(IDC_EDIT1)->GetDlgItemInt();
> ってやり方もあります。

失礼しました。

> long a = GetDlgItemInt(IDC_EDIT1);

これが正解でした。


返信引用
ふゆこ
 ふゆこ
(@ふゆこ)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

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


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

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

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

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


返信引用
ふゆこ
 ふゆこ
(@ふゆこ)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

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


返信引用
けん★
 けん★
(@けん★)
ゲスト
結合: 23年前
投稿: 28
 

CStringを数値に変換するのなら

CString csData;
int i;

csData = 12345;

i = atoi(csData);

これでできますよ。


返信引用
CdS
 CdS
(@CdS)
ゲスト
結合: 24年前
投稿: 176
 

>atolを用いても変換できないのですが・・・。
実際に試したのならどう書いたのかを書かないと。

long l = atol(LPCTSTR(csText));

でいいのでは。


返信引用
ふゆこ
 ふゆこ
(@ふゆこ)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

> 実際に試したのならどう書いたのかを書かないと。
>
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))));
としてもだめでした。


返信引用
けん★
 けん★
(@けん★)
ゲスト
結合: 23年前
投稿: 28
 

m_kingaku_ctrl.SetWindowText(CString (atol(LPCTSTR((a)) * atol(LPCTSTR(b))));

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

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


返信引用
ふゆこ
 ふゆこ
(@ふゆこ)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

みなさん、ありがとうございました。
以下の通りでできました。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました