CString

[戻る]
2008/10/22(水) 19:25:06
環境:VC6.0  MFC  XP

こんにちは。薫と申します。
早速質問させていただきます。

エディットボックスに入力した日付を、
年、月、日、それぞれへ分割する作業がしたいです。

日付は、"2008.10.22"のように
入力されるので、ドットを判別して格納しようとしています。



pTxt = ( CEdit* )GetDlgItem(IDC_DATE);
pTxt->GetWindowText(eTxt.GetBuffer(0),DATE_MAX + 1);
date = eTxt;

   while(pos != -1){
  pos = date.Find('.');
  front = date.Left(pos);
  date = date.Mid(pos+1);
   if(pos == -1){        //ドットが見つかったらループを抜ける
    break;
   }
   count++;
   if(count == 1){
    year = (atoi(front));    //ドットより前をYearにセットする。
   }else if(count == 2){
    month = (atoi(front));    //ドットより前をMonthにセットする。
    day = (atoi(date));        //ドットより後をdayにセットする。
   }
  }

このようにした場合、Findが'.'を見つけてくれません。
なぜか、シングルクォーテーションをダブルに変えて
pos = date.Find(".")にすると、'.'を見つけてくれるのですが
次の、LeftやMidが働いてくれません。


pTxt = ( CEdit* )GetDlgItem(IDC_DATE);
pTxt->GetWindowText(eTxt.GetBuffer(0),DATE_MAX + 1);
date = eTxt;

の部分を

CString date = "2008.10.22"と指定すると、
上手くプログラムは動いてくれ、
年、月、日へと分割することができます。


GetWindowText()で文字列を取得した値と
CStringで取得した値では何か違いがあるのでしょうか?

GetWindowText()で文字列をとってきた場合、
CString型が動作しないのでしょうか?

カラー 2008/10/22(水) 20:13:00
>このようにした場合、Findが'.'を見つけてくれません。
>なぜか、シングルクォーテーションをダブルに変えて
>pos = date.Find(".")にすると、'.'を見つけてくれるのですが

C言語の基礎は勉強されたのですか

"." '.' 終端があるのとないのとの違いです
終端がなかったらどこまでだかわからいではありませんか

これぐらいコードを書くんだったら変数の宣言もちゃんと書けばいかが?

一歩一歩しらべていけば解決できます
たとえば dateにはちゃんと たとえば"2008.10.22"がはいているんですか

 

Blue 2008/10/22(水) 23:16:05
単純に
CWnd::GetWindowText(LPTSTR, int)
ではなく、CString用の
CWnd::GetWindowText(CString&)
のほうを使えばよいのでは?
http://msdn.microsoft.com/ja-jp/library/db50wx7h.aspx

また
>pTxt->GetWindowText(eTxt.GetBuffer(0),DATE_MAX + 1);
DATA_MAX + 1となっているのであるならばGetBufferの引数が0なのはまずいのでは?
それと、ReleaseBufferも呼ばないと。

Eriko 2008/10/23(木) 08:59:57
>pTxt = ( CEdit* )GetDlgItem(IDC_DATE);
pTxtに関する宣言がないので
CEdit* pTxt = ( CEdit* )GetDlgItem(IDC_DATE);
と仮定してみます
>pTxt->GetWindowText(eTxt.GetBuffer(0),DATE_MAX + 1);
CString date;を宣言して
pTxt->GetWindowText(date);
でOK
>while(pos != -1){での囲い
項目が三つしかないのでwhile使わないで次のようになさった方がよいのでは?
CString year="",month="",day="",disp;
int pos,tosi,tuki,niti;

pos = date.Find(".");
if(pos>=0){year=date.Left(pos); date=date.Mid(pos+1);}
pos = date.Find(".");
if(pos>=0){month=date.Left(pos); day=date.Mid(pos+1);}

tosi = atoi(LPCTSTR(year));
tuki = atoi(LPCTSTR(month));
niti = atoi(LPCTSTR(day));
disp.Format("%d年%d月%d日",tosi,tuki,niti);
AfxMessageBox(disp);
でもOKだと思います おためしになってください
あとホームページを参考にして勉強されるのも良いのですが、
言語の入門書とかも用意された方が良いと思います
その方が時間も労力も助かります

2008/10/23(木) 20:52:48
カラーさん、Blueさん、Erikoさん
ありがとうございました。

CWnd::GetWindowText(CString&)
を使えば、無事に解決できました。

皆様のご指摘のおかげで上記のソースが
酷いプログラムだったことがわかりました。
皆様のご意見を反映させたおかげで
問題の解決だけではなく、ずいぶんと
わかりやすいソースへと変わりました。

GetBufferの件など、今回の良くないと指摘された点が
他の関数でも、使われていたので
その点も修正することができました。

>あとホームページを参考にして勉強されるのも良いのですが、
>言語の入門書とかも用意された方が良いと思います
アドバイスありがとうございます。
言語について、もっとしっかり勉強していきます。

2008/10/24(金) 08:41:50
[[解決]]
済のチェックつけるの忘れてました・・・!
申し訳ないです。

Россия [E-Mail] [HomePage] 2008/10/27(月) 10:15:37
Хы =)

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