プロが教える店舗&オフィスのセキュリティ対策術

windows XP VC++.net 2003です。
よろしくお願いします。
症状は毎回コピーアンドペーストでプログラムを書くよりも
関数化してソースをきれいにしようと思い

BOOL ButtonNumber (int bNumber,HWND hWnd)
{
long z;
char sBuff[100];
char number[100];
wsprintf(number,"%d",bNumber);
z = GetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff,99);
if(z == 0){
SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),number);
return TRUE;
}
if(z == 10){
//桁数が多すぎる警告メッセージ
MessageBox(NULL,"桁数が多すぎます。","警告",MB_OK);
return TRUE;
}
z = atol(sBuff);
wsprintf(sBuff,"%d1",z);
SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff);
return TRUE;
}
という関数を作りました。
numberに1という数字が入っていてエディットボックスに1と表示されるはずなのですが12と表示されてしまいます。
ためしにnumberに12と入れてみると表示されるのが122
123と入力すると1232と表示されてしまいます。
SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),number);
どこも間違っていないように思いますが・・なんででしょう・・

関数化せずmainに直接書き込んでいけば正常に1と表示されます・
switch (LOWORD(wParam))
{
case IDC_BUTTON1:
ButtonNumber(1,hWnd);
case IDC_BUTTON2:
a = GetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff,99);
if(a == 0){
SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),"2");
return TRUE;
}
if(a == 10){
//桁数が多すぎる警告メッセージ
MessageBox(NULL,"桁数が多すぎます。","警告",MB_OK);
return TRUE;
}
a = atol(sBuff);
wsprintf(sBuff,"%d2",a);
SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff);
return TRUE;

この場合BUTTON1は12と意図しない表示をしますが
BUTTON2はちゃんと2と表示されます。
非常に困っていますよろしくお願いします。

A 回答 (3件)

見づらいですね。

。。
インデントを付けて貰えませんか?(全角空白を使うなどして

この回答への補足

インデントつけてたんですが投稿したときスペースが消えました汗。
次回は全角スペースでちゃんとつけます汗

補足日時:2008/05/09 03:17
    • good
    • 0

最後の方で、


>wsprintf(sBuff,"%d2",a);

この「2」ではないですか?
    • good
    • 0

No.2です。

ちょっと端折りすぎました。

原因はButtonNumber関数ではなく、
case IDC_BUTTON1のところでbreakしていないので、そのままBUTTON2の部分も実行されて、%d2の「2」が付加されているのでは、ということです。
流し読みなので未検証ですが・・・

何を意図して「%d1」や「%d2」としているのでしょうか?

(本題からそれますが、No.1さんの言うとおりインデントを付けて欲しかったです。また、aやzといった変数名は読みにくいのでやめましょう)
    • good
    • 0
この回答へのお礼

まさにそのとおりでした。汗
break入ってなかったです汗
電卓プログラムなので押したボタンを後ろにつけるということで%d1などと書いています。
ほかにもスマートな書き方があるようですが・・汗

お礼日時:2008/05/09 03:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!