[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?


  • Mod

    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 !!


Anmelden zum Antworten