Verzeichnisbaum auslesen
-
Hallo.
Ich will in meiner Anwendung den Verzeichnisbaum auslesen und in einem CTreeCtrl anzeigen.
Mein Code bisher sieht so aus:Drive //gewähltes Laufwerk Drive.MakeUpper(); FindFolder(Drive,m_Baumstruktur,m_Baumstruktur.InsertItem(Drive)); 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())) { CString Path = GetPath(m_Baumstruktur,hitem); FindFolder(Path,m_Baumstruktur,hitem); //list.InsertItem("?",hitem); } } } }
Im Moment ist es leider so, das er gleich alle Unterverzeichnise mit ausliest. Es soll aber so sein, das die Unterverzeichnise erst ausgelesen werden, wenn der Konten in der Ansicht expandiert wird.
Kann mir dan jemand weiter helfen??
Steh echt auf dem Schlau.Cu
Oli
-
Erstelle ein TreeView-Item mit Verzeichnisnamen (TopLevel), frage hab, ob es Unterverzeichnisse hat, wenn ja, füge ein leeres TV_ITEM (also eines mit LPSTR_TEXTCALLBACK als Text-Parameter) ein, damit ein + davor erscheint, fange TVN_ITEMEXPANDING ab, extrahiere das Verzeichnis des expandierenden Items, lösche das leere Item und füge alle SubDirs ein. Wenn sich das Item zusammenklappt, kannst du diese wieder löschen und das leere Item einfügen, da sonst das TreeView zu viele Items bekommt und das Löschen Ewigkeiten dauert.
-
Hallo.
Danke für Deine Antwort.
Ich war schon mal so weit, das ich, wenn die Unterverzeichnise erkannt wurden ein ? eingeblendet wurde.Ich komme mit TVN_ITEMEXPANDING nicht klar. Wie kann ich bei den gelieferten Parameter der Funktion den aktuelle Pfad bestimmen.
Die Variabelen sind ja :NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
.
Cu
Oli
-
hm, schau mal bei codeguru.com.
Im Prosise steht glaub ich auch ein Bespiel dazu...Devil
-
Hallo.
Werde ich mal machen, dachte es ist bloß noch eine Kleinigkeit.Cu
Oli
-
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 Codebool 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