Verzeichnisbaum auslesen



  • Habe auf die schnelle bei codeguru.com nicht das richtige gefunden.

    Bin aber schon ein kleines Stück weiter gekommen.
    Habe jetzt die Funktion OnItemexpandingVerzBaum genutzt und kann auch den Path ermitteln.

    Dummerweise, werden bei mir alle Verzeichnise und Dateien doppelt angezeigt. 😕 Das ? bekomme ich auch nicht gelöscht. Der Code von FindFolder, GetPath und HasASubDir ist biher unverändert geblieben.

    Die genau Funktion von OnItemexpandingVerzBaum sieht bei mir so aus:

    void CDateiWaehlen::OnItemexpandingVerzBaum(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
        // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    
        HTREEITEM parent = pNMTreeView->itemNew.hItem;
        CString path = GetPath(m_Baumstruktur,parent);
        FindFolder(path,m_Baumstruktur,parent);
    
        *pResult = 0;
    }
    

    Wäre nett, wenn mir jemand weiter helfen könnte.

    Cu
    Oli



  • @ RenèG
    Mein aktueller Code

    bool CDateiWaehlen::HasASubDir(LPCTSTR Path)
    {
        CFileFind ff;
    
        BOOL cont = ff.FindFile(CString(Path) + "\\*");
        while(cont)
        {
            cont = ff.FindNextFile();
            if(ff.IsDirectory() && !ff.IsDots())
                return true;
        }
        return false;
    }
    
    CString CDateiWaehlen::GetPath(CTreeCtrl &tree,HTREEITEM hitem)
    {
        CString path;
    
        do
        {
            path = tree.GetItemText(hitem) + "\\" + path;
            hitem = tree.GetParentItem(hitem);
        } while(hitem);
        return path;
    }
    
    void CDateiWaehlen::FindFolder(LPCTSTR Path,CTreeCtrl& list,HTREEITEM parent)
    {
        CFileFind ff;
    
        BOOL cont = ff.FindFile(CString(Path) + "*");
        while(cont)
        {
            cont = ff.FindNextFile();
            if(ff.IsDirectory() && !ff.IsDots())
            {
                HTREEITEM hitem = list.InsertItem(ff.GetFileName(),parent,TVI_SORT);
                if(HasASubDir(ff.GetFilePath()))
                {   
    
                    list.InsertItem("",hitem);
    
                }
            }       
        }
    }
    
    void CDateiWaehlen::OnItemexpandingVerzBaum(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
        // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    
        HTREEITEM parent = pNMTreeView->itemNew.hItem;
        m_Baumstruktur.DeleteItem(pNMTreeView->itemOld.hItem);
        CString path = GetPath(m_Baumstruktur,parent);
        FindFolder(path,m_Baumstruktur,parent);
    
        *pResult = 0;
    }
    

    Ich habe Deinen Post mit Intresse verfolgt. Konnte aberleider bis auf die Funktion TVN_ITEMEXPANDING nichts davon relisieren.
    Im Moment werden bei mir alle Ordner doppelt angezeigt und die Anzeige des ? verschwindet auch nicht.

    Wäre echt super, wenn Du mir nochmal helfen könntest.

    Cu
    Oli



  • Deine TVN_ITEMEXPANDING-Funktion kann so nicht gehen.
    Diese Message wird doch gesendet, sobalb das aktuelle Item expandiert wird. Dieses besitzt 1 'leeres' ChildItem. Dieses musst Du löschen, indem Du es Dir mit GetChildItem besorgst. Das Parentitem muss bestehen bleiben !!!
    Der Rest müsste stimmen.

    // Also, die Zeile
    m_Baumstruktur.DeleteItem(pNMTreeView->itemOld.hItem);
    // muss durch
    m_Baumstruktur.DeleteItem( m_Baumstruktur.GetChildItem( pNMTreeView->itemOld.hItem));
    // ersetzt werden.
    


  • Hallo.
    Danke für die Antwort.

    Habe es probiert. Zuerst steht bei mir bloß das Laufwerk im CTreeCtrl. Will ich dann expandieren, wird die Anzeige des Laufwerkes gelöscht und somit kann ich nichts mehr auswählen.

    Cu
    Oli



  • versteh ich nicht ... hast Du 'n Testprojekt zum zuschicken ?



  • Nee leider nicht.



  • Es kann ja nicht so schwer sein.
    Ich lasse im Moment bei mir über eine Auswahlbox ein Laufwerk auswählen.
    Es sollen nach öffnen des Knoten alle Unterverzeichnisse angezeigt werden und bestimmte Dateien eingelsen werden. Aus den bestimmten Dateien lasse ich die erste Zeile auslesen.

    Klingt alles ja nicht schwer, sitze aber schon den ganzen sch... Tag dran.

    Cu
    Oli



  • Ist auch nicht schwer, hab das auch schon vor Jahren mal gemacht, konnte mich aber nur noch dunkel daran erinnern.
    'tschuldig, dass ich in meinem 1. Code itemOld.hItem verwendet habe, es muss natürlich itemNew.hItem heissen.

    Deinen Code habe ich mal vervollständigt:

    void CFolderTreeDlg::OnItemExpanding(NMHDR *pNMHDR, LRESULT *pResult)
    {
      LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
      HTREEITEM hItem = pNMTreeView->itemNew.hItem;
      // erst alle SubItems löschen
      HTREEITEM hChild = m_Tree.GetChildItem( hItem);
      while( hChild)
      {
        HTREEITEM hTemp = tree.GetNextSiblingItem( hChild);
        tree.DeleteItem( hChild);
        hChild = hTemp;
      }
      // jetzt Aktion ausführen
      if( pNMTreeView->action == TVE_EXPAND)
        FindFolder( GetPath( m_Tree, hItem), m_Tree, hItem);
      else if( pNMTreeView->action == TVE_COLLAPSE)
        m_Tree.InsertItem( "", hItem);
      *pResult = 0;
    }
    

    [ Dieser Beitrag wurde am 09.01.2003 um 08:55 Uhr von RenéG editiert. ]



  • Hallo.

    Danke, funktioniert wunderbar. 😃 😃

    Ziehe meinen nicht vorhandenen Hut vor Dir.

    Cu
    Oli



  • Lass ihn lieber auf, is nämlich saukalt draussen 😉



  • @ Oli_1977

    Mit OnItemExpanding das hatte ich damals auch gepostet.
    Hast aber übersehen wie mir scheint...



  • @Nemesyzz

    Habe ich wirklich nicht gesehen.
    Habe auch nicht brauchbares zu OnItemExpanding über suchen gefunden.

    Nehme es aber als Anregung, meine Suche vorher zu verbesseren. 🙂
    Cu
    Oli



  • Hallo.

    Ich habe noch ei Problem zu idesem Thema.

    Unter dem Betriebessystem WIN NT und WIN 2000 funktioniert das anzeigen der Untrverzeichnisse, nicht aber unter WIN ME und WIN 98.
    Es wird mir nur das Laufwerk angezeigt und wenn ich den Konten öffne wird immer nur das Laufwerk ohne Verzeichnisse angezeigt.
    Der Fehler liegt aber bloß in der Anzeige, habe mir beim durchsuchen mal alle gefundenen Verzeichnisse in eine Datei schreiben lasse.
    Sie werden gefunden, aber nicht angezeigt.

    Woran kann das liegen, da das Problem ja nur bei bestimmten Betriebssystemen auftaucht?

    Cu
    Oli



  • An der beschissenen Umsetzung von Microsoft, gleiche Controls auf verschiedenen Systemen mit dem gleichen Verhalten zu versehen 😉



  • Kann man also nichts dran ändern bzw was muß man machen, damit es auch unter dem anderen Btriebssystem läuft?

    Hoffe, man muß keine großen Änderungen vornhemen?

    Cu
    Oli


Anmelden zum Antworten