| |
|
|
- Seite 1 - |
|
Nico Madysa |
$H Windows.ph
$H Messages.ph
$I controls.prf
3 + 4 + 8
proc Add_Dir
parameters pfad$ , rang% , p&
declare i%[14] , nextdir$
if (rang% < 0)
p& = TV_AddItem(tv&,0,2,2,Laufwerk + pfad$ + \,i#[t%])
inc rang%
inc t%
endif
ClearList
ClearList lb&[rang%]
AddFiles pfad$ + \*
whileloop 0 , %GetCount
Match$(^~[.+~]$,ListBoxItem$(&loop))
if %MatchPos >= 0
AddString(lb&[rang%],$Match)
endif
EndWhile
DeleteString(lb&[rang%],SelectString(lb&[rang%],(-1),[.]))
DeleteString(lb&[rang%],SelectString(lb&[rang%],(-1),[..]))
ClearList
MoveHandleToList(lb&[rang%])
clear i%[rang%]
while i%[rang%] < (GetCount(lb&[rang%]))
nextdir$ = GetString$(lb&[rang%],i%[rang%])
nextdir$ = Mid$(nextdir$,2,len(nextdir$) - 2)
TV_AddItem(tv&,p&,0,1,nextdir$,i#[t%])
inc t%
if rang% < 14
Add_Dir (pfad$ + \ + nextdir$) , (rang% + 1) , i#[t% - 1].hItem&
endif
i%[rang%] = i%[rang%] + 1
wend
endproc
proc beenden
FreeDLL shl&
il#.Destroy()
Dispose il#
Dispose i#[]
end
endproc
declare il# , tv& , tx& , shl& , i#[1999] , lb&[14] , t%
Dim i#[] , TV_Item
shl& = UseDll(SHELL32)
cls SysColor(15)
WindowTitle Bitte warten, erstelle Verzeichnisbaum...
whileloop 15
lb&[&loop - 1] = Create(ListBox,%hWnd,1,0,0,0,0)
EndWhile
il# = New(ImageList)
il#.AddImage($SysPath + \Shell32.dll,3)
il#.AddImage($SysPath + \Shell32.dll,4)
il#.AddImage($SysPath + \Shell32.dll,8)
tv& = Create(Treeview,%hWnd,il#.hList&,5,5,200,400)
Add_Dir C: , (-1) , 0 <-- hier den Laufwerksbuchstaben/Anfangspfad eingeben; am Ende darf kein Backslash stehen
TV_Expand tv& , i#[0].hItem&
SetText %hWnd , str$(t%) + Einträge im Treeview
whilenot IsKey(27)
waitinput
wend
Beenden
end
Mit diesem Code wird ein Treeview erzeugt und durch Rekursion (bin ich stolz, dass ich das hinbekommen habe! ) mit allen Verzeichnissen eines Laufwerkes gefüllt. Leider ist das sehr umständlich und dauert ziemlich lange. Daher habe ich zwei Fragen: 1.) Wie viele Einträge enthält das Treeview bei euch maximal? (Steht nach dem Laden in der Titelleiste) Mir geht es darum, zu wissen, ob die Handles reichen. 2.) Gibt es nicht irgendeinen einfacheren Weg? In der Win32.hlp habe ich nichts gefunden und mit Assembler kenne ich mich sonderlich aus. Könnte man das so beschleunigen? |
|
|
| |
|
|
|
| |
|
- Seite 2 - |
|
GDL |
|
|
| |
|
|
|
| Leg einfach Laufwerke an Horst!
Start → Ausführen → %comspec% [enter] subst /? [enter] |
|
|
| |
|
|
|
Jörg Sellmeyer | Hallo Horst, Du kannst das ja selber mit beliebig vielen Laufwerken einrichten. Einfach unter Start -> Ausführen so oft Subst M: C:Windows eingeben bis Du entweder genügend hast oder das Limit von 26 erreicht ist. Natürlich muß der Laufwerksbuchstabe immer ein anderer und ein freies Laufwerk sein. Du kannst auch andere Ordner als virtuelles Laufwerk nehmen aber das muß nicht sein.
Ok, iF war schneller |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 26.04.2007 ▲ |
|
|
|
|
| @ iF + Jörg OK - und wie bekomme ich die Laufwerke wieder weg ? |
|
|
| |
|
|
|
Jörg Sellmeyer | Subst /D M: Nach einem Neustart sind aber sowieso alle wieder weg. |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 26.04.2007 ▲ |
|
|
|
|
| Danke Funktioniert Siehe Bild |
|
|
| |
|
|
|
Nico Madysa | OK, erstmal danke für die vielen Antworten. Den Tip mit dem Laden der Ordner wenn es nötig ist, werde ich auf jeden Fall umsetzen (da mir schon so viele Leute dazu geraten haben ) AddFiles.dll und die Message werde ich mir auf jeden Fall auch ansehen.
Der Fehler Das Element gibt es nicht. ist einfach zu erklären: Der Code füllt die Element-Handles des Treeviews in ein Array, das ich vorläufig auf 2000 Handles begrenzt habe, aber das ist ja noch erweiterbar. Der zweite Fehler ist mir nicht erklärbar; durch das Abfangen von rang% sollte die maximale Rekursionstiefe eigentlich nicht überschritten werden. Aber wenn ich die Ordner erst zur Laufzeit lade, hätte sich das Problem sowieso erledigt.
@Frank: Wie komme ich an das Handle der System-Imagelist? Ohne dem komm ich eher schlecht an die Liste heran. |
|
|
| |
|
|
|
| So wie ich das beim Überfliegen gesehen habe könnte rang% nicht immer den gewünschten Zweck erfüllen. Besser bei solchen Rekursionsgeschichten könnte folgendes sein: KompilierenMarkierenSeparieren so kannst Du z.B. sicherstellen das eine Rekursion nicht überschritten wird.
Nachteil: eine Globale.
Selbiges Verhalten ohne Globale lässt sich jedoch auch dank %pcount nachstellen. |
|
|
| |
|
|
| |
|
- Seite 3 - |
|
|
Nico Madysa | Ich habe mit einer globalen Variablen keine Probleme, ist schließlich mein eigener Code. |
|
|
| |
|
|
|
| @Nico
@Frank: Wie komme ich an das Handle der System-Imagelist? Ohne dem komm ich eher schlecht an die Liste heran.
Frank ist anscheinend nicht da - geb ich Dir halt Auskunft: Guck doch mal in der LISTVIEW-Hilfe unter CreateImageList(F,B) nach - da steht alles weitere |
|
|
| |
|
|
|
Frank Abbing | Nico wills doch ohne Dll machen...
Geht über die API SHGetFileInfo(), Nico. Da bekommst du einen Pointer auf eine Kopie der SystemImageList. Ein Pointer auf das Original geht auch, aber nur über zwei undokumentierte APIs aus der SHELL32. Das lass bleiben. Die Kopie enthält auch fast alle Icons. |
|
|
| |
|
|
|
Nico Madysa | Alles klar, danke. Ich hab jetzt übrigens noch ne neue Idee, die Wahl nicht an den ChooseDir- sondern an den LoadFile-Dialog anzulehnen, sprich, eijn Listview, statt einem Treeview erstellen. Dann dauert auch das Laden nicht so lang. |
|
|
| |
|
|