Puedes probar con este procedimiento:
Código Delphi
[-]
procedure LocalTreeListing(const Folder: string; Nodes: TTreeNodes;
ParentNode: TTreeNode);
var
AFolder: TSearchRect;
NewNode: TTreeNode;
begin
if FindFirst(IncludeTrailingPathDelimiter(Folder) + '*.*', faDirectory, AFolder) = 0 then
repeat
if (AFolder.Name <> '.') and (AFolder.Name <> '..') then
begin
NewNode := Nodes.Add(ParentNode, AFolder.Name);
LocalTreeListing(AFolder.Name, Nodes, NewNode)
end
until
FindNext(AFolder) <> 0;
FindClose(AFolder)
end;
Si te fijas, cada que la búsqueda encuentra un directorio cuyo nombre no es
'.' o
'..', esta manda a llamar de nuevo al mismo procedimiento, enviando como parámetros el nombre del folder encontrado, la lista de nodos que estamos llenando y el nodo que se agregó, el cual será el padre de los nodos que se agreguen en la llamada recursiva.
Para llamar al procedimiento debes hacer:
Código Delphi
[-]
MiTreeView.Items.Clear;
LocalTreeListing('Windows', MiTreeView.Items, nil);
Ya por último te comento que no probé este código, así que probablemente haya uno que otro error.
Saludos...