ボタン等を削除するには?

解決


ト−シロ  2004-11-09 12:09:54  No: 55063

ダイアログベースに配置したエディットボックスやボタンを削除するとエラーが表示されてしまいます。プログラムの起動自体はできるのですが、その後プログラムを止めるとエラーが表示されてしまうのです。特にエディットボックスを削除すると、KERNEL32.DLLというエラーがでたり、Debug Library Failedというエラーがでてしまいます。エディットボックスにはメンバ変数を設定していたので、変数を消して削除したのですが…。ボタンやボックスを削除する際、削除の手順なんかはあるのでしょうか?またこのエラーを回避する方法を教えてもらえないでしょうか?お願いいたします。


PSB  2004-11-09 16:53:35  No: 55064

追加したときと逆の手順を踏めばいいだけです。
・リソースID
・メッセージハンドラ
あたりですかね。リソースエディタ上でコントロールを削除しても
IDは消えなかった(はず)なので、そのIDを使用して何か処理を
行おうとすると当然どっかで実行時エラーが発生します。


てつや  2004-11-09 20:21:37  No: 55065

クラスウィザードでメンバ変数を設定した場合、クラスウィザードから
それを削除しないと、なんかいろいろやっかいです。

void CXXDlg::DoDataExchange(CDataExchange* pDX)
{
  CDialog::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CXXDlg)
  DDX_Control(pDX, IDC_EDIT1, m_edit_ctrl);
  DDX_Text(pDX, IDC_EDIT1, m_str);
  //}}AFX_DATA_MAP
}
ここいらへんになんか残っていませんか。それらしいコントロールID等が
あれば、削除します。


トーシロ  2004-11-10 04:01:51  No: 55066

返信ありがとうございます。とりあえずcppファイルとhファイルをみたのですが、ボタンを削除する際に色々と削除するものが、エディットボックスを削除するときにはないのです。そういうものなのでしょうか?というかメンバ変数を消したときに自動的に消えるようなのですが…。あとリソースのhファイルにはそれらが
#define Edit1 ****
のような形でのこってました。これらを削除すればエラーは消えるのでしょうか?
よろしくお願いいたします。


PSB  2004-11-10 06:45:52  No: 55067

前も書きましたがウィザードに頼らずにコントロールを
消したければリソースIDとメンバ変数を直接消して、
コンパイルを通るように(私は)修正してます。
#あまりお奨めしませんが。

だからEdit1とやらを消してコンパイルを通るように
してやればいいはずです。


トーシロ  2004-11-11 21:44:39  No: 55068

返信ありがとうございます。resouse.hの中にあった#define Edit1 ****を消してみたのですがどうにもエラーが消えません。もともとコンパイル、ビルドは通り、プログラムは起動するのです。しかし、終了ボタンを押すと閉じた後、エラーの表示(KERNEL32.DLL)がでてくるのです。
void CXXDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CXXDlg)
    //}}AFX_DATA_MAP
}
ここの部分には何もなく、また他に探してもEditに関するものがみあたりません。
メンバ変数のm_* = 0; とかもしっかりと消えてますし…。イマイチ理由がわかりません。どうしたらよいのでしょうか?よろしくお願いいたします。


Ban  2004-11-11 22:25:08  No: 55069

> KERNEL32.DLLというエラーがでたり、
> Debug Library Failedというエラーがでてしまいます。

エラーの内容にヒントとなる情報があったりしませんか。

Debug Library Failed というのは多分 assertion を
さしていると思うのですが、このダイアログに表示される
具体的なメッセージはどんなものが出ていますか。
# 普通ここにエラー内容が書いてあるはずですけど.....。


トーシロ  2004-11-11 23:54:19  No: 55070

返信ありがとうございます。エラーの内容は
File  afx.inl 
line  122

"0x77e5b59d" の命令が"0xfffffff4"のメモリを参照しました。メモリが"written"になることができませんでした。

のような内容でした。afx.inlというファイルがいったいどこにあるのか分かりません。そのファイルの122行目に原因があるとは思うのですが…。Stdafx.hというファイルはありますが122行もありませんしどこに隠れているのでしょうか?それともほかに原因があるのでしょうか?お願いします。


Ban  2004-11-12 00:21:04  No: 55071

File  afx.inl 
line  122

どうもここのASSERT にかかってるみたいです。
# afx.inl はMFCのインクルードディレクトリにあるはずです。

********************************
// CString
_AFX_INLINE CStringData* CString::GetData() const
  { ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }
********************************

ということで、Edit を CString に関連付けたことがあって
それがちゃんと解消できていないとか、そんなところでしょうか。

# プリコンパイルファイルに古いファイルが残ってるとかは大丈夫ですか。
# 一度クリーンした方が安全かも。


トーシロ  2004-11-13 00:27:55  No: 55072

返信ありがとうございます。DEBUGファイルにあった更新されていないファイルを全て削除し、新たにコンパイル、ビルドしなおしたところエラーがでなくなりました。いったいなぜなのかはわかりませんが…。とりあえず解決したということなのでしょうか?


トーシロ  2004-11-26 02:17:56  No: 55073

とりあえず解決とさせていただきます。ありがとうございました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加