TTreeView [Résolu]

Signaler
Messages postés
7
Date d'inscription
dimanche 26 septembre 2004
Statut
Membre
Dernière intervention
16 avril 2007
-
Messages postés
7
Date d'inscription
dimanche 26 septembre 2004
Statut
Membre
Dernière intervention
16 avril 2007
-
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.

8 réponses

Messages postés
60
Date d'inscription
jeudi 8 mai 2003
Statut
Membre
Dernière intervention
18 février 2011

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;
Messages postés
60
Date d'inscription
jeudi 8 mai 2003
Statut
Membre
Dernière intervention
18 février 2011

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;
Messages postés
7
Date d'inscription
dimanche 26 septembre 2004
Statut
Membre
Dernière intervention
16 avril 2007

Ok, merci flagada pour ta réponse, je vais m'y coller ce week end. Je t'informerai de mon test; EN TOUT CAS MERCI;
Messages postés
7
Date d'inscription
dimanche 26 septembre 2004
Statut
Membre
Dernière intervention
16 avril 2007

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.
Messages postés
60
Date d'inscription
jeudi 8 mai 2003
Statut
Membre
Dernière intervention
18 février 2011

pour sauvegarder tout l'arbre tu as une fonction TreeView1.SaveToFile('nom du fichier') qui fait tout toute seule
Messages postés
7
Date d'inscription
dimanche 26 septembre 2004
Statut
Membre
Dernière intervention
16 avril 2007

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)


A+
Messages postés
7
Date d'inscription
dimanche 26 septembre 2004
Statut
Membre
Dernière intervention
16 avril 2007

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 .
Messages postés
7
Date d'inscription
dimanche 26 septembre 2004
Statut
Membre
Dernière intervention
16 avril 2007

Ok ça marche très bien. Il y a eu un moment une boucle infini mais je n'ai pas réussi à comprendre la cause. Sans ça ça marche bien. Merci Flagada.