• 締切済み

デバッグについて教えてください

よろしくお願いします。 サンプルのソースを参考にして、『メモ帳』を作成しています。 プログラムの記述間違いや、コンパイル時のエラーは無いのですが、 出来上がった『メモ帳』に何かを書くと、いきなり 『文書保存の確認部分のメッセージ』が表示され、 ×ボタンで閉じようとすると、こんどは『上書き保存の部分のメッセージ』が表示されます。 こちらも閉じようとして、×ボタンを押すと再び、『上書き保存の部分』の表示となり、いつまでも繰り返します。 そこで、 { char szBuf[256]; wsprintf(szBuf, "x = %d, x"); MessageBox(hWnd, szBuf, "Debug", MB_OK); } と言うメッセージボックスを、『新規作成、ファイルを開く、文書保存の確認、上書き保存などの、各、関数部分に』挿入してデバッグしたのですが、何の変化もありません。 デバッグの方法に間違いがあると思うのですが不慣れなため気づきません。 詳しい方、アドバイスをお願いします。

みんなの回答

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

> wsprintf(szBuf, "x = %d, x"); とりあえず、この文はまずいです。 ダブルクォーテーションの位置を見直してください。

noname#220054
質問者

お礼

//ファイルの読み込みと表示 lpszBuf[dwAccBytes] = '\0'; Edit_SetText(hEdit, lpszBuf); wsprintf(szTitle, szTitle_org, szFileTitle, dwSize); hMain = GetParent(hEdit); SetWindowText(hMain, szTitle); CloseHandle(hFile); GlobalUnlock(hMem); GlobalFree(hMem); //デバッグ return 0; } //名前をつけて保存 int MySaveAs(HWND hEdit) { HWND hWnd; //デバッグ用 OPENFILENAME ofn; HANDLE hFile; DWORD dwAccBytes; char *lpszBuf; int nLen; HGLOBAL hMem; nLen = GetWindowTextLength(hEdit); hMem = GlobalAlloc(GHND, sizeof(char) * nLen + 1); lpszBuf = (char *)GlobalLock(hMem); GetWindowText(hEdit, lpszBuf, nLen + 1); memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hEdit; ofn.lpstrFilter = "text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"; ofn.lpstrFile = szFile; ofn.lpstrFileTitle = szFileTitle; ofn.nFilterIndex = 1; ofn.nMaxFileTitle = MAX_PATH; ofn.nMaxFileTitle = MAX_PATH; ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY; ofn.lpstrDefExt = "txt"; ofn.lpstrTitle = "名前をつけて保存"; if(GetSaveFileName(&ofn) == 0) return -1; hFile = CreateFile(szFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(hFile, lpszBuf, (DWORD)strlen(lpszBuf), &dwAccBytes, NULL); wsprintf(szTitle, szTitle_org, szFileTitle, nLen); SetWindowText(GetParent(hEdit), szTitle); if(CloseHandle(hFile) == 0) MessageBox(hEdit, "Error CloseHandle", "Error", MB_OK); SendMessage(hEdit, EM_SETMODIFY, FALSE, 0); GlobalUnlock(hMem); GlobalFree(hMem); //デバッグ return 0; } まだ、『上書き保存』と『文書保存の確認』の部分が残っているのですが、書き込めませんでした。

noname#220054
質問者

補足

アドバイス有難うございます。 そして、すみませんでした。『redfox63』さんへの補足を書いてしまいました。 早速ですが、アドバイスいただいた > wsprintf(szBuf, "x = %d, x"); の、部分をもう一度確認して、もう一度デバッグしてみます。 結果報告をしたかったのですが、本当に申し訳ありません。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

# 開発環境や実行環境の情報も投稿しましょう WndProcのメッセージ処理のWM_COMMAND部分を投稿してみましょう switch文で分岐しているなら『break』または『return』が適切な位置に記述されているのか確認しましょう

noname#220054
質問者

お礼

//ファイルの読み込みと表示 lpszBuf[dwAccBytes] = '\0'; Edit_SetText(hEdit, lpszBuf); wsprintf(szTitle, szTitle_org, szFileTitle, dwSize); hMain = GetParent(hEdit); SetWindowText(hMain, szTitle); CloseHandle(hFile); GlobalUnlock(hMem); GlobalFree(hMem); //デバッグ return 0; } //名前をつけて保存 int MySaveAs(HWND hEdit) { HWND hWnd; //デバッグ用 OPENFILENAME ofn; HANDLE hFile; DWORD dwAccBytes; char *lpszBuf; int nLen; HGLOBAL hMem; nLen = GetWindowTextLength(hEdit); hMem = GlobalAlloc(GHND, sizeof(char) * nLen + 1); lpszBuf = (char *)GlobalLock(hMem); GetWindowText(hEdit, lpszBuf, nLen + 1); memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hEdit; ofn.lpstrFilter = "text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"; ofn.lpstrFile = szFile; ofn.lpstrFileTitle = szFileTitle; ofn.nFilterIndex = 1; ofn.nMaxFileTitle = MAX_PATH; ofn.nMaxFileTitle = MAX_PATH; ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY; ofn.lpstrDefExt = "txt"; ofn.lpstrTitle = "名前をつけて保存"; if(GetSaveFileName(&ofn) == 0) return -1; hFile = CreateFile(szFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(hFile, lpszBuf, (DWORD)strlen(lpszBuf), &dwAccBytes, NULL); wsprintf(szTitle, szTitle_org, szFileTitle, nLen); SetWindowText(GetParent(hEdit), szTitle); if(CloseHandle(hFile) == 0) MessageBox(hEdit, "Error CloseHandle", "Error", MB_OK); SendMessage(hEdit, EM_SETMODIFY, FALSE, 0); GlobalUnlock(hMem); GlobalFree(hMem); //デバッグ return 0; } まだ、『上書き保存』と『文書保存の確認』の部分が残っているのですが、書き込めませんでした。

noname#220054
質問者

補足

アドバイス有難うございます。 開発環境として 1、BorlandC++5.5 2, VC++2005 の両方を使ってみましたが結果は同じでした。 こちらが、WndProcの部分です、アドバイスを参考に確認したいと思います、 また、お気づきの所がありましたら、再度アドバイスいただけると助かります。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id; static HWND hEdit; switch (msg){ case WM_CREATE: //エディトコントロールの作成 hEdit = CreateWindow("EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | WS_HSCROLL, 0, 0, 0, 0, hWnd, (HMENU)ID_EDIT, hInst, NULL); strcat(szTitle, "「無題」"); SetWindowText(hWnd, szTitle); Edit_LimitText(hEdit, 0); break; case WM_SIZE: //ウィンドウサイズの調整 MoveWindow(hEdit, 0, 0, LOWORD(lp), HIWORD(lp), TRUE); break; case WM_COMMAND: switch (LOWORD(wp)){ case IDM_NEW: MyNew(hEdit); break; case IDM_OPEN: MyOpen(hEdit); break; case IDM_END: SendMessage(hWnd, WM_CLOSE, 0, 0); break; case IDM_SAVE: MySave(hEdit); break; case IDM_SAVEAS: MySaveAs(hEdit); break; } break; case WM_SETFOCUS: SetFocus(hEdit); break; case WM_CLOSE: id = MyConfirm(hEdit); if(id == IDCANCEL) break; id = MessageBox(hWnd, "終了してもいいですか", "確認", MB_YESNO | MB_ICONQUESTION); if(id == IDYES){ DestroyWindow(hEdit); //エディットコントロールの破棄 DestroyWindow(hWnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } //新規作成 int MyNew(HWND hEdit) { HWND hWnd; //デバッグ用 int id; id = MyConfirm(hEdit); if(id == IDCANCEL){ return -1; } Edit_SetText(hEdit, ""); SetWindowText(GetParent(hEdit), "メモ帳もどき[無題]"); strcpy(szFile, ""); { //デバッグ char szBuf[256]; wsprintf(szBuf, "x = %d, x"); MessageBox(hWnd, szBuf, "Debug", MB_OK); } return 0; } //ファイルを開く int MyOpen(HWND hEdit) { HWND hWnd; //デバッグ用 int id; HWND hMain; DWORD dwSize = 0L; OPENFILENAME ofn; HANDLE hFile; DWORD dwAccBytes; char *lpszBuf; HGLOBAL hMem; id = MyConfirm(hEdit); if(id == IDCANCEL) return -1; memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hEdit; ofn.lpstrFilter = "text(*.text)\0*.txt\0ALL files(*.*)\0*.*\0\0"; ofn.lpstrFile = szFile; ofn.lpstrFileTitle = szFileTitle; ofn.nMaxFile = MAX_PATH; ofn.nMaxFileTitle = MAX_PATH; ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; ofn.lpstrDefExt = "txt"; ofn.lpstrTitle = "ファイルオープン"; if(GetOpenFileName(&ofn) == 0) return -1; hFile = CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); dwSize = GetFileSize(hFile, NULL); hMem = GlobalAlloc(GHND, sizeof(char) * dwSize + 1); if(hMem == NULL){ MessageBox(hEdit, "メモリを確保できません", "メモ帳もどき", MB_ICONEXCLAMATION | MB_OK); return -1; } lpszBuf = (char *)GlobalLock(hMem); ReadFile(hFile, lpszBuf, dwSize, &dwAccBytes, NULL);

関連するQ&A

専門家に質問してみよう