CTreeCtrl::GetNextSiblingItem(...) Problem



  • Hallo,

    mit folgender Funktion möchte ich die Texte der Elemente eines TreeControls anzeigen lassen:

    void CDirTreeCtrl::ShowText(CString strApp)
    { 
    // Pointer zu meinem tree control
    CDirTreeCtrl* pMyTreeCtrl = this;
    // Zugriffsnummer 
    HTREEITEM hRootItem;
    hRootItem = GetRootItem();
    
    CString strPath1,strPath2;
    
    if (pMyTreeCtrl->ItemHasChildren(hRootItem))
    { 
    HTREEITEM hItem= GetChildItem(hRootItem);
    strPath1 = GetItemText(hItem)+" ist da aber wo ist D??";
    
    hItem = GetNextSiblingItem(hRootItem);
    strPath2 = GetItemText(hItem);
    
    MyResult(strPath1,strPath2);//MyResult() --> Funktion zum Anzeigen der Zeichenketten
    }
    }
    

    Diese Funktion läuft ohne Fehlermeldung aber sie verarbeitet nur das erste Element "C:\" und, nicht "D:\" (für CD-ROM)

    Es gibt nur zwei Laufwerke auf meinem Laptop und diese sollte auch das zweite Element angeben.
    (Außerdem läuft dieses TreeControl innerhalb des ganzen MFC-Projekts wie erwartet und die Funktion
    namens ShowText ist nur eine von mir erstellte Funktion, die ich zum Testen verwenden möchte)
    Es scheint mir dass hier die Funktion GetNextSiblingItem(hRootItem) nicht richtig funktioniert aber ich bin nicht ganz sicher.

    Ich warte auf Ihre Vorschläge...

    Vielen Dank.

    Zusatzliche information:
    Andere Attribute wie z.B. CTreeCtrl::GetCount() funktioniert ganz genau z.B.

    Innerhalb dieselber Funktion ShowText()

    ....
    char ch[2]; int i;
    UINT t = pMyTreeCtrl->GetCount();
    i = (int) t;
    itoa (i, ch,10);
    strPath2 = CString(ch);

    funktioniert wie erwartet.

    strPath2 ist hier "5" weil es insgesamt fünf Elemente im TreeControl gibt. (eins für RootItem, zwei für C:\, und zwei für D:\; die zweiten Elemente sind die Dummy- Items (CTreeCtrl::InsertItem(DUMMY,hTempItem)) unter den Laufwerken



  • Hi,
    ups, gelöscht, hab die frage nicht richtig verstanden, willst du alle einträge anzeigen lassen??

    lg
    pixel



  • Könnte das so funktionieren:
    du mußt auf alle Fälle auch noch das nächste RootSibling holen

    void CDirTreeCtrl::ShowText(CString strApp)
    {
        // Pointer zu meinem tree control
        CDirTreeCtrl* pMyTreeCtrl = this;
        // Zugriffsnummer
        HTREEITEM hRootItem;
        hRootItem = GetRootItem();
    
        CString strPath1,strPath2;
        while(hRootItem != NULL) // solante das hRootItem nicht NULL, meint es hat noch weitere...
        {
            if (pMyTreeCtrl->ItemHasChildren(hRootItem))
            {
                HTREEITEM hItem= GetChildItem(hRootItem);
                while(hItem != NULL)
                {
                    strPath1 = GetItemText(hItem)+" ist da aber wo ist D??";
    
                    hItem = GetNextSiblingItem(hItem);
                    strPath2 = GetItemText(hItem);
    
                    MyResult(strPath1,strPath2);//MyResult() --> Funktion zum 
                }
            }
            // hier das nächste Laufwerk holen!
            hRootItem = pMyTreeCtrl->GetNextSiblingItem(hRootItem);
            // oder 
            //hRootItem = pMyTreeCtrl->GetNexItem(hRootItem, TVGN_NEXT);
        }
    }
    

    müßtest noch bißchen anpassen... 🙄
    hab zwar ein Tree in meinem Dlg nur ohne Laufwerke halt...



  • Hallo,

    Ich habe Deinen Vorschlag probiert aber der Einsatz von Struktur

    while(hRootItem != NULL)
    {....
    hRootItem = pMyTreeCtrl->GetNextSiblingItem(hRootItem);
    }
    

    resultiert nur in "My Computer", und nicht in D:\ 😞

    Hier ist meine Directory-Struktur.

    ------My Computer
    |
    +---C:\
    |
    +---D:\

    Mein Projekt basiert auf eine Directory Browser-Demo deren source code unter
    http://www.codeguru.com/cpp/controls/treeview/directorybrowsers/print.php/c737/ zu finden ist.

    Mein Ziel ist es, einen vorbestimmten Pfad in dieses TreeControl zu geben, damit das TreeContol am Anfang einfach den
    "Anwendung-Pfad" zeigt. (Wie es für die Directory-Browser-Dialogs gewöhnlich ist.)
    (Mittlerweile, "Anwendung-Pfad" ist App.Path in Visual Basic, aber was in MFC?)
    Deswegen möchte ich die Funktion ShowText() einsetzen um auf die einzelnen Laufwerke zuzugreifen.
    Später möchte ich weitere Routinen schreiben, die dem Anwendung-Pfad entsprechenden Knoten expandiert.
    Diese möchte ich mit der Funktion CTreeCtrl::InsertItem() machen.
    Aber ich soll dazu erstens auf die Laufwerke zugreifen und deshalb habe ich diese (schon erwähnte) Struktur engesetzt:

    if (pMyTreeCtrl->ItemHasChildren(hRootItem)) 
    { 
    HTREEITEM hItem= GetChildItem(hRootItem); 
    
    strPath1 = GetItemText(hItem)+" ist da aber wo ist D??"; // C:\ ist einfach gefunden aber D:\\ nicht.
    
    hItem = GetNextSiblingItem(hRootItem); // Auch mehrere GetNextSiblingItem()s geben nichts aus.
    }
    

    Ich habe keine Ahnung, warum GetNextSiblingItem(hRootItem) den Laufwerk D:\ nicht finden kann...

    //-----------Weitere Funktionen---------------------------------
    
    //Die Funktion MyResult lautet
    
    void CDirTreeCtrl::MyResult(CString str1, CString str2)
    {
    	m_strPath1= str1;m_strPath2= str2; //m_StrPath1,m_StrPath2 sind global
    	HWND hParentWnd =::GetParent(this -> m_hWnd);
    	WPARAM wParam = (WPARAM)((LPCTSTR)(m_strPath1));
    	LPARAM lParam = (LPARAM)((LPCTSTR)(m_strPath2));
    	::PostMessage(hParentWnd,m_nMyMessage, wParam,lParam);
    	//wo m_nMyMessage WM_USER+6 ist
    }
    
    //sendet die Nachricht zu einer Funktion in der CView: 
    
    LRESULT CDirExplrView::OnResult(WPARAM wParam,LPARAM lParam)
    {
    LPTSTR szTemp1 = (LPTSTR)wParam;
    LPTSTR szTemp2 = (LPTSTR)lParam;
    
    CString strResult1 = szTemp1;
    CString strResult2 = szTemp2;
    
    GetDlgItem(IDC_Result1)->SetWindowText(strResult1);  // IDC_Result1 und  IDC_Result2 sind die ID's von Static Labels
    GetDlgItem(IDC_Result2)->SetWindowText(strResult2);
    
    return TRUE;
    }
    
    //-----------Weitere Funktionen END----------------------------
    


  • muß ich ehrlich sagen ich kann es auch nicht verstehen, es scheint doch so einfach!
    😕

    HTREEITEM hRoot = pTree->GetRootItem();
    	while(hRoot != NULL)
    	{
    		TRACE(L"Root: %s\n", pTree->GetItemText(hRoot));
    		if(pTree->ItemHasChildren(hRoot))
    		{
    			HTREEITEM hChild = pTree->GetChildItem(hRoot);
    
    			while(hChild != NULL)
    			{
    				TRACE(L"\t\tChild: %s\n", pTree->GetItemText(hChild));
    				hChild = pTree->GetNextSiblingItem(hChild);
    			}
    
    		}
    		//hRoot = pTree->GetNextSiblingItem(hRoot);
    		hRoot = pTree->GetNextItem(hRoot, TVGN_NEXT);
    	}
    
    // versuch mal das zu ändern in deinem code:
    // von:
        hItem = pTree.GetNextSiblingItem(hRootItem);
    // auf:
        hItem = pTree.GetNextSiblingItem(hItem); // diese zeile verwenden!!!
    

    ich hab das mit dem beispiel probiert, aber der GetNextSiblingItem funktioniert

    lg
    pixel



  • Hallo,

    Endlich habe ich gefunden wo der Fehler liegt: Ich habe in der GetNextSiblingItem das "Root Item" (hRootItem) benutzt,
    statt das "Current Item" (hItem)

    Und das habe ich bemerkt dank Deiner letzten Bemerkung:
    (das geschah mit ein wenig Mühe doch, weil ich keine Erfahrung mit den TreeControls habe)

    // versuch mal das zu ändern in deinem code: 
    // von: 
        hItem = pTree.GetNextSiblingItem(hRootItem); 
    // auf: 
        hItem = pTree.GetNextSiblingItem(hItem); // diese zeile verwenden!!!
    

    Jetzt ist alles klar und die GetNextSiblingItem() funktioniert ganz genau.

    Danke!!!


Anmelden zum Antworten