Treeview problem (leere Items)



  • hi

    ich habe eine kleine Klasse zur Benutzung von TreeViews geschrieben.
    Nur hab ich ein Problem:

    und zwar, wenn ich einen Item einfüge und irgenwann mal wieder entferne - dann
    sind alle darauffolgende neu hinzugefügte Einträge leer. Man kann sie aber anwählen.
    Sie sind einfach leer:

    hier ist der fehlerhafte Code

    HTREEITEM hTest = (DebugDialogHandler->m_Tree->AddItem(NULL,TVI_ROOT,"test",NULL));
    DebugDialogHandler->m_Tree->DeleteItem(hTest);
    DebugDialogHandler->m_Tree->AddItem(NULL,TVI_ROOT,"test",NULL);
    

    ---
    und hier ist der Code der funktioniert:

    HTREEITEM hTest = (DebugDialogHandler->m_Tree->AddItem(NULL,TVI_ROOT,"test1",NULL));
    >>>einziger Unterschied : 
    DebugDialogHandler->m_Tree->AddItem(NULL,TVI_ROOT,"test2",NULL);
    DebugDialogHandler->m_Tree->DeleteItem(hTest);
    DebugDialogHandler->m_Tree->AddItem(NULL,TVI_FIRST,"test3",NULL);
    

    Wie man sieht funkz es nur, wenn zwischen dem ersten AddItem und dem DeleteItem ein weiteres AddItem drinsteht. Änderungen an TVI_FIRST oder TVI_ROOT bringen nix.

    ich hab zuerst TEXT_CALLBACK verwendet, aber das funkz genausowenig. Habe die ganze WM_NOTIFY Routine ausgeschaltet!

    Es funkz übrigens auch dann nicht, wenn man zwischen AddItem und DeleteItem viel Zeit vergehen lässt. Also die Routinen per Button aktiviert:

    if (wParam == IDC_BUTTON1)
    {
    HTREEITEM hTest = (DebugDialogHandler->m_Tree->AddItem(NULL,TVI_ROOT,"test1",NULL));
    //TreeView_SelectItem(DebugDialogHandler->m_Tree->m_hTreeView,hTest);
    }
    else
    if (wParam == IDC_BUTTON2)
    {
    HTREEITEM h = DebugDialogHandler->m_Tree->GetSelectedItem();
    DebugDialogHandler->m_Tree->DeleteItem(h);
    }
    

    Es funkz nur wenn man zweimal den BUTTON1 drückt.

    Also hat jemand Ahnung warum es nicht funkz?

    (nutze MS DEV 7)
    THX

    Hier ist der Quelltext der Toolsfunktionen.

    *********************

    HTREEITEM VTreeView::AddItem(HTREEITEM hParent,HTREEITEM hInsertAfter, VString sText, void* lpData)
    {
    TVINSERTSTRUCT istruct;
    memset(&istruct,0,sizeof(istruct));
    
    //TVITEM &iItem = istruct.item;
    //memset(&iItem,0,sizeof(iItem));
    //iItem.mask = TVIF_STATE | TVIF_TEXT | TVIF_PARAM;
    istruct.item.mask = TVIF_TEXT | TVIF_PARAM;
    istruct.item.state = 0;
    
    LPTreeItem Data = new TreeItem;
    Data->pParent = this;
    Data->sText = sText;
    Data->pData = lpData;
    
    istruct.item.lParam = (LPARAM)Data;
    //iItem.lParam = 0;
    
    //istruct.item.pszText = LPSTR_TEXTCALLBACK;
    istruct.item.pszText = "123";
    //(LPTSTR)sText.c_str();
    /*iItem.pszText = new char[_VLen(sText)+1];
    memset(iItem.pszText,0,_VLen(sText)+1);
    
    strncpy(iItem.pszText,sText,_VLen(sText));*/
    //iItem.cchTextMax = 50000 ;
    //iItem.cchTextMax = 3;
    
    istruct.hParent = hParent;
    istruct.hInsertAfter = hInsertAfter;
    //istruct.item = iItem;
    
    HTREEITEM res = TreeView_InsertItem(m_hTreeView,&istruct);
    int err = GetLastError();
    return res;
    }
    
    ***************
    bool VTreeView::DeleteItem(HTREEITEM hitem)
    {
    if (hitem != NULL)
    {
    bool b = (bool)TreeView_DeleteItem(this->m_hTreeView,hitem);
    int i = GetLastError();
    return b;
    }
    else
    return false;
    }
    

    Crosspost:
    http://spotlight.de/nzforen/cpp/m/cpp-1105819960-28443.html



  • Tja wer hätt's gedacht!

    Da hab ich doch soviele Infos gegeben, aber die Windows Styles hab ich glatt vergessen.

    Das Problem liegt darin, dass der Style
    TVS_NOSCROLL
    gesetzt wurde.

    In MSDEV ist "Bildlauf" auf false gesetzt.

    Wenn das Flag nicht vorhanden ist, also der Bildlauf eingeschaltet ist,
    dann funkz es!!

    Der Witz ist: Es funkz auch mit dem Flag!

    Wenn man das Flag entfernt und dann wieder setzt, funkz es danach wunderbar (zumindest bei mir)

    /*
    doHardFix 
    entfernt das TVS_NOSCROLL Flag 
    ansonsten wird es einfach entfernt und wieder gesetzt.
    */
    void VTreeView::SolveDeleteLastItemProblem(bool doHardFix)
    {
    	if (doHardFix)
    	{
    		LONG oldstyle = GetWindowLong(m_hTreeView, GWL_STYLE);
    
    		if (oldstyle & TVS_NOSCROLL)
    			oldstyle ^= TVS_NOSCROLL; //XOR removes bit (10.0000.0000.0000) 
    		::SetWindowLong(m_hTreeView, GWL_STYLE, oldstyle);
    	}
    	else
    	{
    		//this works fine for me
    		SetTVProperty(TVS_NOSCROLL );
    		SetTVPropertyOff(TVS_NOSCROLL);
    	}
    	//retrieves the invisible items
    	RECT rect;
    	GetClientRect(m_hTreeView,&rect);
    	InvalidateRect(m_hTreeView,&rect,TRUE);
    
    /*	CONTROL         "",IDC_TREE1,"SysTreeView32",TVS_NOTOOLTIPS | 
                        TVS_NOSCROLL | WS_GROUP | WS_TABSTOP,7,22,233,103,
    
    					TVS_NOSCROLL  prevents item to be shown
    
    					*/
    }
    


  • Ist das nicht was für The Daily WTF? 😃

    http://www.thedailywtf.com



  • the daily... schrieb:

    Ist das nicht was für The Daily WTF? 😃

    http://www.thedailywtf.com

    na, wenn du das für so lustig hälst - dann könntest du das dort ja mal posten 😃

    Ich fands leider net so komisch, weil ich 4h für das Problem benötigt habe, wobei es sich dabei nur um ein Schönheitsfehler handelt.
    Es war schon Zufall, dass ich den Fehler überhaupt fand.


Anmelden zum Antworten