Pfad im CTreeCtrl expandiert anzeigen



  • Hallo.

    Ich lasse in einem CTreeCtrl den Verzeichnisbaum eines Laufwerkes anzeigen.
    Jetzt wollte ich auf Tastendruck einen bestimmten Pfad expandiert anzeigen.

    Wie kann man das einfach realisieren?

    Bin für jeden Hinweis oder Tipp dankbar.

    Cu
    Oli



  • Unter Annahme, dass das Laufwerk aus dem Pfad extrahiert wurde und das TreeItem für das Laufwerk expandiert ist, lässt sich folgende simple Routine erstellen:

    bool ExpandPath( CTreeCtrl& tree, HTREEITEM htiParent, LPTSTR pszPath)
    {
      LPTSTR pszTemp = _tcsdup( pszPath);  // kann weggelassen werden, wenn Änderung von pszPath nicht stört
      LPCTSTR pszStart = pszTemp;
      for( LPCTSTR pszPos = _tcschr( pszTemp, _T('\\'); pszPos; pszPos = _tcschr( pszStart, _T('\\'))
      {
        *pszPos = _T('\0');
        bool bFound = false;
        for( HTREEITEM htiChild = tree.GetChildItem( htiParent); htiChild; htiChild = tree.GetNextSiblingItem( htiChild))
          if( tree.GetItemText( htiChild) == pszStart)
          {
            tree.Expand( htiChild, TVE_EXPAND);
            htiParent = htiChild;
            bFound = true;
            break;
          }
        if( !bFound)
          break;
        pszStart = pszPos + 1;
      }
      free( pszTemp);  // siehe Kommentar zu pszTemp
      return pszPos == NULL;
    }
    

    ( Rechtschreibfehler behoben )

    [ Dieser Beitrag wurde am 10.01.2003 um 10:52 Uhr von RenéG editiert. ]



  • Hallo.

    Danke für Deine Antwort.

    Deine Annhamen hatte ich so nicht erfüllt, werde sie aber erfüllen, bis ich Deine Funktion aufrufe.

    Ich komme aber mit dieser Zeile nicht klar: *pszPos = _T('\0');
    Da bekomme ich immer die Fehlermeldung, L-Wert gibt ein konstantes Objekt an.

    Woran kann das liegen?

    u
    Oli



  • Ersetze

    for( LPCTSTR pszPos = _tcschr( pszTemp, _T('\\'); pszPos; pszPos = _tcschr( pszStart, _T('\\'))
    

    durch

    for( LPTSTR pszPos = _tcschr( pszTemp, _T('\\'); pszPos; pszPos = _tcschr( pszStart, _T('\\'))
    


  • Oder noch besser:

    bool ExpandPath( CTreeCtrl& tree, HTREEITEM htiParent, LPTSTR pszPath)
    {
      LPTSTR pszTemp = _tcsdup( pszPath);  // kann weggelassen werden, wenn Änderung von pszPath nicht stört
      LPCTSTR pszStart = pszTemp;
      LPTSTR pszPos;
      while( pszPos = _tcschr( pszStart, _T('\\'))
      {
        *pszPos = _T('\0');
        bool bFound = false;
        for( HTREEITEM htiChild = tree.GetChildItem( htiParent); htiChild; htiChild = tree.GetNextSiblingItem( htiChild))
          if( tree.GetItemText( htiChild) == pszStart)
          {
            tree.Expand( htiChild, TVE_EXPAND);
            htiParent = htiChild;
            bFound = true;
            break;
          }
        if( !bFound)
          break;
        pszStart = pszPos + 1;
      }
      free( pszTemp);  // siehe Kommentar zu pszTemp
      return pszPos == NULL;
    }
    

    [ Dieser Beitrag wurde am 10.01.2003 um 11:17 Uhr von RenéG editiert. ]



  • Habe es jetzt noch nicht ausprobiert.

    Muß man eigentlich viel umstellen, wenn man dvon ausgeht, daß das Laufwerk nicht extrahiert wurde und auch das Luafwerk nicht expandiert ist?

    Eine kleine Anmerkung zu Deinem Code habe ich aber, Du vergißt gerne Klammern.
    Diese Kritik ist nicht böse gemeint.

    Cu
    Oli



  • Um die Funktion ExpandPath nun visuell zu optimieren, solltest Du vor dem Aufruf
    tree.SetRedraw( FALSE); und danach tree.SetRedraw( TRUE) aufrufen.



  • Eine kleine Anmerkung zu Deinem Code habe ich aber, Du vergißt gerne Klammern.

    Wo denn? *dummfrag*



  • Deine For-Schleife

    for( LPTSTR pszPos = _tcschr( pszTemp, _T('\\'); pszPos; pszPos = _tcschr( pszStart, _T('\\'))
    

    Meine for-Schleife

    for( LPTSTR pszPos = _tcschr( pszTemp, _T('\\')); pszPos; pszPos = _tcschr( pszStart, _T('\\')))
    


  • Muß man eigentlich viel umstellen, wenn man dvon ausgeht, daß das Laufwerk nicht extrahiert wurde und auch das Luafwerk nicht expandiert ist?

    Nein, wahrscheinlich nicht. Dann kannst Du den Parameter htiParent weglassen, und dafür TVI_ROOT setzen.



  • Ich schreib halt nicht gern Code in dieses Edit-Feld 😉



  • Mal eine persönlich Frage, Wie lange brauch man um so gut zu sein wie Du?

    Habe die Funktion jetzt mal geteste. Es passiert leider nichts.

    Cu
    Oli



  • Der Code der inder for-Schleife steht, wird nicht einmal ausgeführt

    for(HTREEITEM htiChild = tree.GetChildItem( TVI_ROOT ); htiChild; htiChild = tree.GetNextSiblingItem( htiChild))  
     if( tree.GetItemText( htiChild) == pszStart)
     {
        tree.Expand( htiChild, TVE_EXPAND);
        bFound = true;
        break;
     }
    

    Ist dort irgend ein Fehler?

    Cu
    Oli



  • Mal eine persönlich Frage, Wie lange brauch man um so gut zu sein wie Du?

    Weiss net, hab nebenbei noch was anderes zutun 😉

    Der Code der inder for-Schleife steht, wird nicht einmal ausgeführt

    Naja, anpassen an die Struktur Deines TreeCtrls musst Du es schon noch! Möglicherweise mal bissel debuggen!



  • Könnest Du mir trotsdem die Bedingung der While - Schleife kurz erklären?

    while( pszPos == _tcschr( pszStart, _T('\\')))
    

    In meinem Pfad steht z.B. "C:\\Temp"

    Beim debuggen ist mir aufgefallen, das die while-Schleife nie durchlaufen wird.

    Cu
    Oli

    [ Dieser Beitrag wurde am 10.01.2003 um 12:22 Uhr von Oli_1977 editiert. ]



  • Könnest Du mir trotsdem die Bedingung der While - Schleife kurz erklären?

    while( pszPos == _tcschr( pszStart, _T('\')))

    Soviel ich mich erinnere, habe ich

    while( pszPos = _tcschr( pszStart, _T('\')))

    geschrieben !!!

    Siehst Du den Unterschied?



  • Da hst Du wieder erstmal recht.

    Jetzt bleibt er bloß noch an der if-Schleife hängen. Die wird nie erfüllt.

    Weil in Start \\Temp drin steht und mein Pfad aber C:\\Temp heißt.

    Cu
    Oli



  • Als 1. steht in pszStart "C:" drin, danach steht Temp drin, weiss net, was Du noch falsch abgeschrieben hast.



  • Morgen.

    Also, meine Funktion sieht so aus:

    bool CDateiWaehlen::ExpandPath(CTreeCtrl& tree, CString pszPath)
    {
        LPCTSTR pszStart = pszPath;
        LPTSTR pszPos;
        while( pszPos = _tcschr( pszStart, _T('\\'))) 
        {
            *pszPos = _T('\0');
            bool bFound = false;
    
            for(HTREEITEM htiChild = tree.GetChildItem( TVI_ROOT ); htiChild; htiChild = tree.GetNextSiblingItem( htiChild))  
                if( tree.GetItemText( htiChild) == pszStart)
                {
                    tree.Expand( htiChild, TVE_EXPAND);
                    bFound = true;
                    break;
                }
            if( !bFound)
            break;
            pszStart = pszPos + 1;
        }
    
        return pszPos == NULL;
    
    }
    

    Bei der Übergabe ist pszPath = "C:\\Temp" und
    tree = m_Baumstruktur //Variable meine CTreeCtrl

    Dürft eigentlich nichts weiter falsch sein.

    Cu
    Oli



  • Der Übergabeparameter pszStart sollte C:\\Temp\\ sein, so weiss die Funktion, dass Temp ein Verzeichnis ist !



  • Ich habe den Pfad jetzt so geändert, wie Du es vorgeschlagen hast.
    Zudem habe ich in die For-Schleife noch eine MessageBox mit eingefügt um mir immer den Item-Text anzeigen zu lassen.

    for(HTREEITEM htiChild = tree.GetChildItem( TVI_ROOT ); htiChild; htiChild = tree.GetNextSiblingItem( htiChild))  
            {   MessageBox(tree.GetItemText(htiChild));
                if( tree.GetItemText( htiChild) == pszStart)
                {
                    tree.Expand( htiChild, TVE_EXPAND);
                    bFound = true;
                    break;
                }
            }
    

    Die MessageBox kommt nur einaml mit C:\

    Also es funktioniert nicht.

    Cu
    Oli


Anmelden zum Antworten