リストコントロール描画時のエラーを回避するには?


町山健太  2005-02-10 00:57:28  No: 56345

こんにちは。
リストコントロールの使用方法についてご教授願います。
以下のソース内容にて実行すると、関数を抜ける際にエラーメッセージが
表示されます。

−エラーメッセージ内容−
「Debug Assertion Failed!
  Program: 実行Exe名
  File:winctrl2.cpp
  Line:494

  For infomation on how your ptogram can cause an seertion failure,
  see the VisualC++ documentation asserts.」

/*--------------------------------------
 |  基本クラス:AObject
 |  派生クラス:ADatabase
 |  分      類:UI描画
 |  関      数:xView
 |--------------------------------------*/
bool ADatabase::xView(char *ssql)
{
    // ①  oo4oによるDB接続
    // ②  レコードセットの取得
    // ③  リストコントロールへの表示
       while (!orec.IsEOF())
       {
           // レコード内容の取得
           orec.GetFieldValue("取得項目1",変数1, sizeof(変数1));
           orec.GetFieldValue("取得項目2", 変数2, sizeof(変数2));
           orec.GetFieldValue("取得項目3", 変数3, sizeof(変数3));

           // リストコントロールへ表示(m_ListCtrl)  ←これ以降の3行でエラーが発生
           n = m_ListCtrl.InsertItem( 0, 変数1 );
           m_ListCtrl.SetItemText( n, 1, 変数2 );
           m_ListCtrl.SetItemText( n, 2, 変数3 );

           orec.MoveNext();
       }
    // ④  各オブジェクトの解放処理
}

ちなみに、InsertItemやSetItemをしている個所を
CString msg;
msg.Format("%s %s %s", 変数1, 変数2, 変数3 );
AfxMessageBox( msg );
とすると、正常にメッセージダイアログ上に1行ずつ表示されることを確認しました。
ですので、リストコントロールへの指示方法が悪いのかなと当たりをつけているのですが・・・。

−開発環境−
Windows2000, VisualC++6.0


かけだし  2005-02-10 01:54:45  No: 56346

m_ListCtrlが作成されていないのではないかと
InsertItem
ASSERT(::IsWindow(m_hWnd));
で、出力されたエラーメッセージです。

静的に作成されているのでしたら、Viewがまだ作成されていない
動的に作成されているのでしたら、作成前に上記関数を読んでいる
のどちらかではないかと思われます。


町山健太  2005-02-10 02:09:19  No: 56347

かけだし さん、レスありがとうございます。

>静的に作成されているのでしたら、Viewがまだ作成されていない
クラスウィザードにて CListCtrlの変数 m_ListCtrlを定義しました。
それを使用して前回は行なっていたのですが、
今回は、試しに

関数内で
CListCtrl *w_lctrl = new CListCtrl;
w_lctrl = &m_ListCtrl;

・・・・
w_lctrl->InsertItem(〜);
w_lctrl->SedtItemText(〜);

delete w_lctrl;

と記述してみましたが、結果は同じでした。


町山健太  2005-02-10 02:21:56  No: 56348

かけだしさん、レスありがとうございます。

先ほど、コード内容を変更してみましたが、以下の内容でも同じエラーが表示されてしまいます。

//***** sampleDlg.h *****

CsampleDlg::CObject{
    private:
        CListCtrl    *m_lctrl;  //←追加
}

//***** sampleDlg.cpp *****
BOOL CsampleDlg::OnInitDialog()
{
    ・・・・・
    // TODO: 特別な初期化を行う時はこの場所に追加してください。
    m_lctrl = &m_ListCtrl; //←m_ListCtrl・・・クラスウィザードで宣言した変数
    
}
void CsampleDlg::OnOK() 
{
  // ①  oo4oによるDB接続
  // ②  レコードセットの取得
  // ③  リストコントロールへの表示
     while (!orec.IsEOF())
     {
         memset( w_bf1, 0x00, sizeof( w_bf1 ) );
         memset( w_bf2, 0x00, sizeof( w_bf2 ) );
         memset( w_bf3, 0x00, sizeof( w_bf3 ) );
         // レコード内容の取得
         orec.GetFieldValue("USERID",w_bf1, sizeof(w_bf1));
         orec.GetFieldValue("USERPW",w_bf2, sizeof(w_bf2));
         orec.GetFieldValue("USERNM",w_bf3, sizeof(w_bf3));

         // リストコントロールへ表示(*m_lctrl)
         n = m_lctrl->InsertItem( 0, w_bf1 );
         m_lctrl->SetItemText( n, 1, w_bf2 );
         m_lctrl->SetItemText( n, 2, w_bf3 );

         orec.MoveNext();
       }
    // ④  各オブジェクトの解放処理
    delete m_lctrl;
}


町山健太  2005-02-10 02:23:56  No: 56349

すいません、17:09分に返信した内容は、間違って「送信」ボタンを押下して
しまいました。その内容は、気にされないで下さい。


かけだし  2005-02-10 02:43:29  No: 56350

>CListCtrl    *m_lctrl;
追加されてもいいんですけど、
ダイアログなら、エディタでリストコントロール追加したほうが
いいのではないかと

>m_lctrl = &m_ListCtrl
この値確認してみました?
変数としてあっても、実体がないと、どのように変更されても
エラーは変わりないですよ


町山健太  2005-02-10 02:54:46  No: 56351

かけだしさん、再びレスあろがとうございます。

>>m_lctrl = &m_ListCtrl
>追加されてもいいんですけど、
>ダイアログなら、エディタでリストコントロール追加したほうが
>いいのではないかと
はい、もちろんエディタ上にリストコントロールは存在します。
(そこまで、、初心者では・・・ないと思います^^;)

>>m_lctrl = &m_ListCtrl
>この値確認してみました?
>変数としてあっても、実体がないと、どのように変更されても
>エラーは変わりないですよ

m_ListCtrl={CListCtrl=0x001107b4}
m_lctrl=0x0012fe90{ClistCtrl hWnd=0x001107b4}
の値が入っていますが。。
これは、実体が存在するということではないでしょうか?


たく  2005-02-10 03:12:47  No: 56352

LVS_OWNERDATAのリストコントロールにSetItemTextしちゃだめだよ
ってことです。


たく  2005-02-10 03:14:42  No: 56353

ダイアログ上のリストコントロールの
プロパティ→その他のスタイル→オーナーデータのチェックをはずしてください


町山健太  2005-02-10 03:34:21  No: 56354

たくさん、レスありがとうございます。

>LVS_OWNERDATAのリストコントロールにSetItemTextしちゃだめだよ
>ってことです。

↑は、例のエラー内容から読みとったのでしょうか?
それとも、MSDNからですか?
なかなか、そのような制約を見つけることが出来なかったです。。

>ダイアログ上のリストコントロールの
>プロパティ→その他のスタイル→オーナーデータのチェックをはずしてください

なるほど。。確かに「オーナーデータ」のチェックを外すとエラーが出なくなりました。
プラスαで、関数の最後に行なっているDelete文も外しました(これもエラーの1つだったようです)

↑なぜ、Delete文もエラーの原因になるのか理解が・・・(^^;


たく  2005-02-10 19:09:04  No: 56355

メンバ変数をdeleteしようとしてる・・・


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

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






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