Arborescence dans un Treeview [Résolu]

Utilisateur anonyme - 26 déc. 2006 à 22:03 - Dernière réponse : N_M_B 103 Messages postés mardi 9 mai 2006Date d'inscription 1 mars 2008 Dernière intervention
- 29 déc. 2006 à 12:00
Salut à tous,

Ca fait bien longtemps que j'ai demandé de l'aide mais là je seche.

J'ai un client FTp et je souhaite récupérer l'arborescende d'un serveur sur Un treeview. Je récupère l'ensemble des chemins complets dans un TStringList. Mais là ou je seche c'est pour créer l'arborescence dans un Treeview sans faire de doublon

J'ai bien pensé à utiliser un TStringList pour séparer les différents dossiers et fichier relatifs au chemin complet :

Var
ListFolder : TStringList;
IndexList,IndexStLt, IndexTv,Index : Cardinal;
AFile : String;
CNode : TTreeNode;
Begin
//Pour tout les fichiers faire
For IndexList:=0 to (Listbox1.Items.Count-1) do

Begin
//Première étape, on sépare les différentes parties du chemin
ListFolder:=TStringList.Create;
AFile:=Listbox1.Items.Strings[IndexList];
Repeat
If Pos('\',AFile)>0 then
Begin
ListFolder.Add(Copy(AFile,0,Pos('\',AFile)));
Delete(AFile,1,Pos('\',AFile));
End
Else
Begin
ListFolder.Add(Copy(AFile,1,length(AFile)));
Delete(AFile,1,length(AFile));
End;
Until AFile='';

Mais après le néant total.

Please Help me
Afficher la suite 

11 réponses

Répondre au sujet
WhiteHippo 1270 Messages postés samedi 14 août 2004Date d'inscription 5 avril 2012 Dernière intervention - 28 déc. 2006 à 03:45
+3
Utile
Hello
Est ce que cela pourrait correspondre à tes attentes ?

procedure AjoutRepertoire( TV : TTreeview ; const Repertoire : String ) ;
var
  Node        : TTreeNode ;
  ParentNode  : TTreeNode ;
  S           : String ;
  Drive       : String ;
  Dir         : String ;
  SubDir      : String ;
  FileName    : String ;
  Liste       : TStrings ;
  i,j         : integer ;
  AlreadyIn   : Boolean ;
begin
  Liste := TStringList.Create ;
  try
    Drive := ExtractFileDrive ( Repertoire ) ;
    FileName := ExtractFileName ( Repertoire ) ;
    Dir   := ExtractRelativePath ( Drive, Repertoire ) ;
    Delete( Dir, Pos( Filename, Dir )+1, length(FileName )  ) ;



    if ( Drive <>'' ) then Liste.Add( Drive ) ;
    repeat
      SubDir := copy( Dir, 1, Pos( PathDelim, Dir )-1 ) ;
      if ( SubDir<>'' ) then Liste.Add( SubDir ) ;
      Delete( Dir, Pos( SubDir, Dir ), length(SubDir)+1  ) ;
    until ( Length(SubDir)=0 ) ;
    if ( FileName<>'' ) then  Liste.Add( FileName ) ;



    ParentNode := TV.TopItem ;
    for i:=0 to Liste.Count-1 do
    begin
      S := Liste.Strings[i] ;



      AlreadyIn := false ;
      Node := ParentNode ;



      if ( i>0 ) then
      begin
        Node := Node.GetNext ;
      end ;



      while ( Node <> Nil ) do
      begin        AlreadyIn :AnsiCompareText( Node.Text, S ) 0 ;
        if ( AlreadyIn ) then
        begin
          ParentNode := Node ;
          Break ;
        end ;
        Node := Node.GetNextSibling ;
      end ;
      if ( not AlreadyIn ) then
      begin
        if ( i=0 ) then ParentNode := TV.Items.Add      (ParentNode, S )
                   else ParentNode := TV.Items.AddChild (ParentNode, S )
      end ;
    end ;
  finally
    Liste.Free ;
  end;
end ;


// Fonction utilisée pour les tests
procedure TForm1.Button1Click(Sender: TObject);
begin
  TreeView1.Items.Clear ;
  AjoutRepertoire( TreeView1, 'D:' ) ;
  AjoutRepertoire( TreeView1, 'C:\Jobs\CV.txt' ) ;
  AjoutRepertoire( TreeView1, 'E:\test\' ) ;
  AjoutRepertoire( TreeView1, 'C:\Jobs\LM.txt' ) ;
  AjoutRepertoire( TreeView1, 'C:\DelphiFr\Sources\MonSource.exe' ) ;
  AjoutRepertoire( TreeView1, 'E:\test' ) ;
end;



Cordialement.



<hr />




L'imbécile prétentieux est celui qui se croit plus intelligent que ceux qui sont aussi bêtes que lui.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de WhiteHippo
N_M_B 103 Messages postés mardi 9 mai 2006Date d'inscription 1 mars 2008 Dernière intervention - 29 déc. 2006 à 12:00
+3
Utile
ca c'est de la réponse hein ! ;)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de N_M_B
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 26 déc. 2006 à 22:20
0
Utile
il faudrait peut-être pouvoir trier avant..

cantador
Commenter la réponse de cs_cantador
Utilisateur anonyme - 26 déc. 2006 à 22:43
0
Utile
Salut Candator

Oui je veux bien trier mais les choses ne sont pas si simples : la preuve ca fait 15 jours que je cherche et envain.
Commenter la réponse de Utilisateur anonyme
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 27 déc. 2006 à 13:41
0
Utile
Tu sais en maths, pas de tri, point de salut..
même si le tri n'est pas ordonné logiquement, les doublons eux seront regroupés et c'est ce qui compte..


Tu dois bien pouvoir exécuter un tri quelque part (liste, fichier etc..) ?

cantador
Commenter la réponse de cs_cantador
Oniria 297 Messages postés dimanche 14 mars 2004Date d'inscription 18 décembre 2014 Dernière intervention - 27 déc. 2006 à 14:40
0
Utile
Bonjour,

Je pense que ta méthode de départ n'est pas correcte en effet, dans une arborescence, il peut y avoir plusieurs nom de dossiers identique mais n'ayant pas le même pére : exemple : c:\WINDOWS\TEMP\ et c:\TEMP, il y a bien deux dossiers TEMP mais pas au même endroit.
Je pense que tu devrais faire un tri pas sur des nom de dossiers distincts, mais sur le chemin complet par cette méthode (elle est peut-être pas optimisée mais elle devrait fonctionner) :
Au début, on classe les chemins de manière à avoir tous les dossiers parents ensemble, ensuite on tri de manière à avoir tous les fils identique ensemble, puis tous les petit fils et ainsi de suite. En gros, tu refais la même que celle sur le serveur pour obtenir toute l'arorescence. Je te donne un petit exemple :

Soit à classer : C:\TEMP\ACROREAD\,C:\WINDOWS\, C:\WINDOWS\TEMP\,C:\TEMP\, c:\WINDOWS\TEMP\GIMP\,c:\WINDOWS\TEMP\WORD\...

On effectue d'abord le classement sur le dossier parent donc sur TEMP ou WINDOWS  est on doit obtenir :
c:\TEMP\ACROREAD\
c:\TEMP\
c:\WINDOWS\
c:\WINDOWS\TEMP\
c:\WINDOWS\TEMP\GIMP\
c:\WINDOWS\TEMP\WORD\

ensuite, on travaille sur les fils : soit pour les deux première ligne ACROREAD et <null>, il faut les inverser de manière à avoir le chemin le plus cour possible classé le plus avant possible (important dans la création du TreeView).

Une fois tous classé comme ca, il suffit de créer les fils en fonction des nom de répertoire en effet au début, il faut créer un pére qui s'appelle TEMP, ensuite, ACROREAD est le fils de TEMP, puis un pere qui s'apelle WINDOWS, puis un fils TEMPS, puis un fils de TEMP qui s'appelle GIMP et ainsi de suite.
Ton TreeView va se remplir facilement...

J'espére que j'ai été assez clair...

Bon codage

Oniriabot
Commenter la réponse de Oniria
Utilisateur anonyme - 27 déc. 2006 à 14:40
0
Utile
tu as pas compris Candatar:

Je récupère l'arborescence d'un serveur FTP dans un TStringList. Je découpe en suite chaque Item dans un nouveau TStringList.

Exemple :

C:\Jobs\CV.txt
C:\Jobs\LM.txt
C:\DelphiFr\Sources\MonSource.exe

Devient pour le second Item
C:\
Jobs\
LM.txt

Je souhaite utiliser un treeview pour les sous répertoires et fichiers sans doublon. Si un simple trie reglait le probleme, je l'aurais deja fais je pense ;).

Merci
Commenter la réponse de Utilisateur anonyme
Oniria 297 Messages postés dimanche 14 mars 2004Date d'inscription 18 décembre 2014 Dernière intervention - 27 déc. 2006 à 16:23
0
Utile
Bonjour,

Mais je ne vois pas le probléme, pourquoi s'acharner à créer un stringlist par chemin car tu vas te retrouver avec des doublons de partout et pour les traiter, il faudra faire une fonction qui relis le TreeView entièrement à chaque ajout d'un chemin pour justement éviter les doublons et connaitre le pére du chemin en commun.
Par ma méthode, le principal avantage est que on trie une fois puis la récupération de l'arbre est très simple.

Mais bon, ton choix reste ton choix.

J'espére que tu as réussit au moins à remplir ton treeview même avec des doublons ?

J'espére que je t'ai ouvert les yeux.

Oniria
Commenter la réponse de Oniria
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 27 déc. 2006 à 17:45
0
Utile
Ouich, ben j'avais pas compris le problème.

Tu as certainement consulté le forum..
Il y a quelques sources à propos de recup FTP + FAQ
Mais peut-être as-tu déjà tout lu ?

cantador
Commenter la réponse de cs_cantador
Utilisateur anonyme - 27 déc. 2006 à 18:39
0
Utile
Lol Oniria : Comme les choses semblent si facile j'ai envie de te dire : "DEMONSTRATION POUR LE REMPLISSAGE DU TREEVIEW.

Pas de blem Candator : oui oui j'ai tout lu bien et tout ;).
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 29 déc. 2006 à 10:59
0
Utile
Chapeau l'artiste ;)

Merci bcp WhiteHippo
Commenter la réponse de Utilisateur anonyme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.