mazimani1
Messages postés7Date d'inscriptiondimanche 26 septembre 2004StatutMembreDernière intervention16 avril 2007
-
7 avril 2006 à 22:45
mazimani1
Messages postés7Date d'inscriptiondimanche 26 septembre 2004StatutMembreDernière intervention16 avril 2007
-
16 avril 2007 à 09:14
Bonsoir à tou,
J'aurais besoin d'aide consernant le composant TTreeView. Je voudrais que mon appli scan un disque ou un dossiers et représente le résultat sous forme d'une arborescence. J'ai utilisé un exemple d'un tut utilisant une procedure récursive mais je n'arrive pas à intégrer correctement un TTreeView.
Merci pour votre aide.
cs_flagada
Messages postés60Date d'inscriptionjeudi 8 mai 2003StatutMembreDernière intervention18 février 2011 10 avril 2006 à 22:42
j'ai déjà fais un truc comme ça, c'est un peu bourrin mais ça marche :)
ça doit pouvoir s'optimiser...
//============================================================================//
{ Ajoute un répertoire (et ses sous-rep) à la treeview }
//----------------------------------------------------------------------------//
procedure TForm1.AjouteRep(const Rep: string);
var
t : String;
sr : TSearchRec;
i, r : Integer;
MyTreeNode1: TTreeNode;
begin
{ Lecture des sous-répertoires du répertoire Rep et ajout dans la Treeview }
{ On se limite à 4 sous-niveaux après le répertoire de base }
if DirectoryExists(Rep) then
begin
with TreeView1.Items do
begin
{ On Ajoute le répertoire de base à la TreeView }
MyTreeNode1 := Add(nil, Rep);
{ On indexe au dernier élément ajouté à la TreeView }
i := Count - 1;
while i < Count do
begin
{ On reconstruit le chemin du répertoire à partir de son niveau }
MyTreeNode1 := TreeView1.Items[i];
With MyTreeNode1 Do
begin
Case Level of
0: t := Text;
1: t := Format('%s%s\',[Parent.Text,Text]);
2: t := Format('%s%s\%s\',[Parent.Parent.Text,Parent.Text,Text]);
3: t := Format('%s%s\%s\%s\',[Parent.Parent.Parent.Text,Parent.Parent.Text,Parent.Text,Text]);
end;
end;
if MyTreeNode1.Level < 4 then
begin
{ Liste les sous-répertoires et les ajoute à la TreeView }
r := FindFirst(t + '*' , faDirectory, sr);
while r = 0 do
begin
if ((sr.Attr and faDirectory) <> 0) and (sr.Name <> '.') and (sr.Name <> '..') then
AddChild(MyTreeNode1, sr.Name);
r := FindNext(sr);
end;
FindClose(sr);
{ Si c'est un répertoire de base on l'expand }
if MyTreeNode1.Level = 0 then MyTreeNode1.Expand(False);
end;
{ On avance d'un cran dans la TreeView }
Inc(i);
end;
end;
end; // end if DirectoryExists(Rep)
end;
cs_flagada
Messages postés60Date d'inscriptionjeudi 8 mai 2003StatutMembreDernière intervention18 février 2011 14 janv. 2007 à 01:31
Salut
Au fait depuis le temps j'ai optimisé un peu tout ça, il n'y a plus de limitation de profondeur de répertoire et le code est plus... 'joli'
//============================================================================//
{ Ajoute un répertoire (et ses sous-rep) à la treeview }
//----------------------------------------------------------------------------//
procedure TForm1.AjouteRep(const Rep: string);
var
sr : TSearchRec;
i : Integer;
BaseTreeNode, MyTreeNode: TTreeNode;
begin
{ Lecture des sous-répertoires du répertoire Rep et ajout dans la Treeview }
with TreeView1.Items do begin
BaseTreeNode := Add(nil, Rep); // On Ajoute le répertoire de base à la TreeView
i := Count - 1; // On indexe au dernier élément ajouté à la TreeView
while i < Count do begin
MyTreeNode := TreeView1.Items[i];
With MyTreeNode Do begin
// Liste les sous-répertoires et les ajoute à la TreeView
if FindFirst(ReconstruitRep(MyTreeNode) + '*' , faAnyFile, sr) = 0 then begin
repeat
if ((sr.Attr and faDirectory) <> 0) and (sr.Name <> '.') and (sr.Name <> '..') then
AddChild(MyTreeNode, sr.Name);
until FindNext(sr) <> 0;
FindClose(sr);
end;
end;
Inc(i); // On avance d'un cran dans la TreeView
Application.ProcessMessages;
end;
end;
BaseTreeNode.AlphaSort(True); // Trie par ordre alphabetique
BaseTreeNode.Expand(False); // Expand le noeud de base
end;
//============================================================================//
{ Renvoie le chemin complet d'un répertoire de la liste }
//----------------------------------------------------------------------------//
function TForm1.ReconstruitRep(Node: TTreeNode): String;
var
t : string;
begin
t := ''; // initialisation du chemin
while Node.Level > 0 do begin // tant qu'on n'est pas au noeud racine
t := format('%s\%s', [Node.Text, t]); // on ajoute le nom du répertoire au chemin
Node := Node.Parent; // puis on remonte d'un cran dans l'arborescence
end;
t := format('%s%s', [Node.Text, t]); // on ajoute le nom du répertoire racine au chemin
ReconstruitRep := t; // on renvoie le chemin reconstruit
end;
mazimani1
Messages postés7Date d'inscriptiondimanche 26 septembre 2004StatutMembreDernière intervention16 avril 2007 13 avril 2006 à 15:59
Je n'ai pas pu attendre le week end, donc je l'ai testé et ça marche très bien. Maintenant la prochaine étape c'est de pouvoir afficher la liste des fichiers et de sauvegarder tout l'arbre dans un fichier pour l'exploiter par la suite (recherche par exemple ). à suivre.
Vous n’avez pas trouvé la réponse que vous recherchez ?
mazimani1
Messages postés7Date d'inscriptiondimanche 26 septembre 2004StatutMembreDernière intervention16 avril 2007 15 avril 2006 à 09:55
Salut,
En fait pour la sauvegarde, j'arriveà le faire mais ce que je voudrais maintenant c'est d'enlever la limitation de la profondeur à 4. je ne vois pas comment faire sans utiliser la récursivité. mais bon je peux pousser j'usqu'à 10 ( le code sera un peu sale mais ca marchera tout de meme)
mazimani1
Messages postés7Date d'inscriptiondimanche 26 septembre 2004StatutMembreDernière intervention16 avril 2007 16 avril 2007 à 08:48
Merci flagada pour ta réponse. Désolé pour le retard mais je n'avais plus regardé mon mail sur cette adresse depuis des lustres.
Je vais tester tout ça et je te ferais signe. mais en tout cas merci d'avoir pensé à moi .