こんにちは。
リストコントロールの使用方法についてご教授願います。
以下のソース内容にて実行すると、関数を抜ける際にエラーメッセージが
表示されます。
−エラーメッセージ内容−
「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
m_ListCtrlが作成されていないのではないかと
InsertItem
ASSERT(::IsWindow(m_hWnd));
で、出力されたエラーメッセージです。
静的に作成されているのでしたら、Viewがまだ作成されていない
動的に作成されているのでしたら、作成前に上記関数を読んでいる
のどちらかではないかと思われます。
かけだし さん、レスありがとうございます。
>静的に作成されているのでしたら、Viewがまだ作成されていない
クラスウィザードにて CListCtrlの変数 m_ListCtrlを定義しました。
それを使用して前回は行なっていたのですが、
今回は、試しに
関数内で
CListCtrl *w_lctrl = new CListCtrl;
w_lctrl = &m_ListCtrl;
・・・・
w_lctrl->InsertItem(〜);
w_lctrl->SedtItemText(〜);
delete w_lctrl;
と記述してみましたが、結果は同じでした。
かけだしさん、レスありがとうございます。
先ほど、コード内容を変更してみましたが、以下の内容でも同じエラーが表示されてしまいます。
//***** 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;
}
すいません、17:09分に返信した内容は、間違って「送信」ボタンを押下して
しまいました。その内容は、気にされないで下さい。
>CListCtrl *m_lctrl;
追加されてもいいんですけど、
ダイアログなら、エディタでリストコントロール追加したほうが
いいのではないかと
>m_lctrl = &m_ListCtrl
この値確認してみました?
変数としてあっても、実体がないと、どのように変更されても
エラーは変わりないですよ
かけだしさん、再びレスあろがとうございます。
>>m_lctrl = &m_ListCtrl
>追加されてもいいんですけど、
>ダイアログなら、エディタでリストコントロール追加したほうが
>いいのではないかと
はい、もちろんエディタ上にリストコントロールは存在します。
(そこまで、、初心者では・・・ないと思います^^;)
>>m_lctrl = &m_ListCtrl
>この値確認してみました?
>変数としてあっても、実体がないと、どのように変更されても
>エラーは変わりないですよ
m_ListCtrl={CListCtrl=0x001107b4}
m_lctrl=0x0012fe90{ClistCtrl hWnd=0x001107b4}
の値が入っていますが。。
これは、実体が存在するということではないでしょうか?
LVS_OWNERDATAのリストコントロールにSetItemTextしちゃだめだよ
ってことです。
ダイアログ上のリストコントロールの
プロパティ→その他のスタイル→オーナーデータのチェックをはずしてください
たくさん、レスありがとうございます。
>LVS_OWNERDATAのリストコントロールにSetItemTextしちゃだめだよ
>ってことです。
↑は、例のエラー内容から読みとったのでしょうか?
それとも、MSDNからですか?
なかなか、そのような制約を見つけることが出来なかったです。。
>ダイアログ上のリストコントロールの
>プロパティ→その他のスタイル→オーナーデータのチェックをはずしてください
なるほど。。確かに「オーナーデータ」のチェックを外すとエラーが出なくなりました。
プラスαで、関数の最後に行なっているDelete文も外しました(これもエラーの1つだったようです)
↑なぜ、Delete文もエラーの原因になるのか理解が・・・(^^;
メンバ変数をdeleteしようとしてる・・・
ツイート | ![]() |