[CListCtrl]Debug-Assert in OnInitDialog bei Init. von CListCtrl
-
Hi,
habe mal wieder ein Problem mit dem Listcontrol. Will in OnInitDialog das Ctrl initialisieren (also InsertColumn, InsertItem, SetItem...), nur kriege ich da ne Debug-Assert, wenn ich in OnInitDialog meine Methode zum initialisieren des Ctrl aufrufe !
TestDlg.cpp
BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog(); ... InitList(); return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten }void CTestDlg::InitList() { CRect rectListCtrl; list.EnableToolTips(TRUE); list.SetRedraw(FALSE); list.GetClientRect(&rectListCtrl); int nColInterval = rectListCtrl.Width()/2; list.InsertColumn(0, "Column 1", LVCFMT_LEFT, nColInterval); list.InsertColumn(1, "Column 2", LVCFMT_LEFT, nColInterval); LVITEM lvi; CString strItem; for (int i = 0; i < 2; i++) { lvi.mask = LVIF_TEXT; lvi.iItem = i; lvi.iSubItem = 0; strItem.Format("Item (%d, %d)", i, 0); lvi.pszText = (LPTSTR)(LPCTSTR)(strItem); list.InsertItem(&lvi); strItem = "This is the " + strItem; // list.SetItemToolTipText(i, 0, strItem); lvi.iSubItem = 1; strItem.Format("Item (%d, %d)", i, 1); lvi.pszText = (LPTSTR)(LPCTSTR)(strItem); list.SetItem(&lvi); strItem = "This is the " + strItem; // m_ctrMyListCtrl.SetItemToolTipText(i, 1, strItem); lvi.iSubItem = 2; strItem.Format("Item (%d, %d)", i, 2); lvi.pszText = (LPTSTR)(LPCTSTR)(strItem); list.SetItem(&lvi); strItem = "This is the " + strItem; // list.SetItemToolTipText(i, 2, strItem); } list.SetRedraw(TRUE); list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP | LVS_EX_GRIDLINES); }Verstehe das nicht, es wird doch vorher der Dialog erstellt und am Ende der Funktion ruf ich meine auf.
Und was da: http://www.c-plusplus.net/forum/viewtopic-var-t-is-146799-and-highlight-is-insertcolumn.html steht, habe ich doch genauso !?
Was ist denn bei mir falsch ??
Schonmal Danke für die Hilfe !
-
Was für eine Assertion denn? Wo stehst du im Callstack?
-
Ah ja, vergessen zu erwähnen !
stehe dann im Callstack bei InsertColumn, die Stelle sieht so aus:
AFXCMN_INLINE int CListCtrl::InsertColumn(int nCol, const LVCOLUMN* pColumn) { ASSERT(::IsWindow(m_hWnd)); return (int) ::SendMessage(m_hWnd, LVM_INSERTCOLUMN, nCol, (LPARAM)pColumn); } // <-wenn er eben auf diese Stelle in InitList() trifft:
list.InsertColumn(0, "Column 1", LVCFMT_LEFT, nColInterval);ist die erste Anweisung, mit der ich das ListCtrl verändere, wenn die erste z.B.
list.SetRedraw(FALSE);wäre, dann passiert das Gleiche ! Das Control (Window) existiert da doch schon, oder ??
PS: das Ctrl ist im Report-Style
-
Es sollte jedenfalls existieren, wenn CDialog::OnInitDialog aufgerufen wurde und das Create nicht irgendwie fehlgeschlagen ist. Hmm, der Eintrag in DoDataExchange für deine Control-Variable ist vorhanden?
-
Wie _matze schon schrieb:
Vermultich wurde DDXControl für die Variable list nicht aufgerufen...
Dadurch ist diese nicht gebundenund es existiert daher kein gültiges Handle.
-
ja, CDialog::OnInitDialog() wird ja gleich am Anfang der Funktion aufgerufen
jetzt funktioniert es, habe die Ctrl-Variable nochmal neu erstellt !
Hatte da wohl doch einen Fehler in DoDataExchange !Vielen Dank für eure Hilfe !!