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)
THXHier 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?

-
the daily... schrieb:
Ist das nicht was für The Daily WTF?

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.