Pb index d?un répertoire dans un composant Outline

jlmcom Messages postés 57 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 3 décembre 2004 - 24 août 2004 à 14:31
jlmcom Messages postés 57 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 3 décembre 2004 - 27 août 2004 à 16:30
Je souhaiterai déterminer l'index d'un sous-répertoires de travail créé par l'utilisateur d'un logiciel que je suis entrain d'écrire. Je n'y arrive pas. Le composant Outline le permet t-il ?

En entrée, j'ai le répertoire de mon appli. :
Un_Rep = C:\program files\jlmcom\...\fichiers
1. Comment déterminer la position du sous répertoire \fichiers dans le composant OutLine ?

2. J'ai essayé avec une boucle, mais ça ne marche pas, car il ne parcours que les répertoires de 1er niveau. Il de compte pas les sous-répertoires :

MaxRep:=DirectoryOutline.ItemCount;
For i:=1 to MaxRep do
if DirectoryOutline.Items[i].Text = Un_Rep
then begin DirectoryOutline.SelectedItem:=i;exit ;end ;

3. j'ai essayé également avec :

Mem_Idx_Rep := FindFirst(Un_Rep, faDirectory, sr);

Il me renvoie également 0 ;

Ce sujet vous inspire t-il? Merci pour votre aide.

jlmcom :)

4 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
25 août 2004 à 00:31
La solution est souvent plus simple quand on n'a pas le nez dans le problème (lol)
Voici le code qui recherche le texte saisi dans l'arborescence d'un composant TOutline et affiche le résultat dasn un contrôle TLabel:
procedure TForm1.btnSearchTreeClick(Sender: TObject);
var
  Index: integer;
  ParentNode: TOutlineNode;
begin
  Index := Outline1.GetTextItem(Edit1.Text);
  if Index <> 0 then
  begin
    //informer
    Label1.Caption := 'FullPath : ' + Outline1[Index].FullPath;
    Label2.Caption := Format('Index is %d for %s', [Index, Edit1.Text]);
    //Rechercher le premier noeud replié
    ParentNode := Outline1[Index].Parent;
    while ParentNode <> nil do
    begin
      //On s'arrête au premier noeud déplié
      if ParentNode.Expanded then
        Break;
      //on recherche l'ancêtre
      ParentNode := ParentNode.Parent;
    end;
    //Déplie les noeuds enfants
    ParentNode.FullExpand;
    //sélectionner le noeud recherché
    Outline1.SelectedItem := Index;
  end
  else
    Label2.Caption := Format('%s not found in tree', [Edit1.Text]);
end;


S'il s'agit de rechercher l'index suite à un clic de souris, alors on peut utiliser ceci :
procedure TForm1.Outline1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Label1.Caption := 'FullPath : ' + Outline1.Items[Outline1.GetItem(X, Y)].FullPath;
  Label2.Caption := Format('Index : %d', [Outline1.GetItem(X, Y)]);
end;


En espérant que l'inspiration a été la bonne ;)
May Delphi be with you
0
jlmcom Messages postés 57 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 3 décembre 2004 2
25 août 2004 à 09:25
Merci Delphiprog, vous êtes un vrai delphiprog!

La solution semble séduisante, je vous tiens au courant, car autre tâche m'appelle ce matin, mais je n'avais pas envie de laisser passer l'occasion d'aller satisfaire ma delphi mania!

J'avais finalement laisser tomber Outline et trouver une solution avec DirectoryListbox. Je ne pense pas qu'elle soit à la hauteur de votre solution. J'avais décidé de la mettre sur le forum pour des débutants comme moi.

Bon je teste tout ça et vous tient au courant!

Merci.

Que delphi soit avec-vous!

jlmcom
:)
0
jlmcom Messages postés 57 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 3 décembre 2004 2
25 août 2004 à 23:11
:question)
Ben c'est pas gagné!
Le code est riche, et il me servira ultérieurement et dans pas longtemps. mais pour l'heure?!!?
Ce qui paraît être simple me résiste encore.
1. En effet, si je possède deux répertoires de même nom dans des n'uds différents, il s'arrêtera à la première occurrence.
2. Il me faut donc fournir par programme et non en saisie (Edit1.Text). Donc pas ce clic, ce qui serait plus facile! Il faut qu'il aille chercher des infos sur des répertoires de travail créés par l'utilisateur, avant de pouvoir travailler.
3. Le programme doit trouver un chemin dont je suis sûr qu'il trouvera le sous-répertoire (parent) dans lequel il cherchera les autres sous-répertoires créés.
Si le répertoire recherché ne s'y trouve pas, la ligne :

Index := Outline1.GetTextItem(Edit1.Text); renvoie 0 et le déploiement ne peut avoir lieu.

4. J'ai donc créé une fonction qui me retourne le nom du sous-répertoire, d'indice de profondeur variable.
Par exemple : C:\program files\jlmcom\fichiers\Util1?Utiln
La fonction créée FIndexSousRep(Chemin,profondeur) donne avec profondeur = 1, le nom du sous-répertoire : program files.

NomRep:= FIndexSousRep(Chemin,1);
Index := Outline1.GetTextItem(NomRep); renvoie 35. Et le Outline se positionne sur ce répertoire.
Mais si je fais, après :

NomRep:= FIndexSousRep(Chemin,2);
Index := Outline1.GetTextItem(NomRep); renvoie 0 à nouveau. Il a perdu le fil.

5. Or je ne sais comment dire au Outline, le chemin qu'il doit prendre pour déployer les sous-répertoires à un Niveau X dans l'arborescence.

Je trouve deux fonctions en rapport avec la profondeur des n'uds dans l'arborecence. Malheureusement, pas d'exemple. Et je ne m?en sort pas! Connaissez-vous l'emploi de ces fonctions?

J'essaye
{pour initialiser ParentNode, mais il est nil au départ puisque pas de parent, le problème est peut-être là!}
ParentNode := Outline1.[Index].Parent;

{pour aller sur le sous-rep ?fichiers?, Nbniv = 3. La boucle est nécessaire car apparemment il ne se
déplace que d'un niveau à la fois}
For i:= 1 to NbNiv do Parentnode.ChangeLevelBy(NbNiv);

Ça plante! Affectation de niveau incorrect

Je suis perdu à nouveau. Delphiman, éclairez ma lanterne! Merci.

jlmcom :blush)
0
jlmcom Messages postés 57 Date d'inscription mercredi 4 août 2004 Statut Membre Dernière intervention 3 décembre 2004 2
27 août 2004 à 16:30
1. Bon, je me répond à moi-même, car je pense que ça peut intéresser des delphiman et delphimen's.

2. j'espère ne pas avoir vexé delphiprog, en lui disant que sa solution ne répond pas tout à fait à mon besoin! elle me servira par ailleurs! En tout cas, je dévore de nombreuses réponses qui sont faites aux nombreuses questions.

Je donnerai le fruit de mon travail progressivement, il faut me laisser un peu de temps! je dois m'habituer à faire de la présentation, alors que je ne m'intéressai auparavant qu'aux équations...

3. BoN Comme mes neurones sont un peu fatigués, j'ai abandonné le Outline momentanément, c'est dommage, car j'aimai bien son graphisme!

Voici donc une solution avec un autre composant : directorylistBox:

var IdxRep ,Cpt_SRepUtil : Integer;
SRec : TSearchRec;
ChemSRep : String;
begin
Cpt_SRepUtil:=0;
FileList := TStringList.Create;
IdxRep := FindFirst(Folder + '*.*' , faDirectory , SRec);
if IdxRep = 0 then
begin
while FindNext(SRec) = 0 do
{Seuls les sous répertoires sont retenus}
if (SRec.Name <> '..') and (SRec.Attr = faDirectory) then
begin
Inc(Cpt_SRepUtil);
ChemSRep := Folder+SRec.Name;
{IRU = variable tableau où sont stockés les chemins des différents répertoires}
IRU[Cpt_SRepUtil]:=NomSRep;
FileList.Add(Folder + SRec.Name + '\');
end;
Sysutils.FindClose(SRec);
end;
end;

4. Reste à améliorer le tableau de mémorisation des chemins en gérant un tableau dynamique.

5. Pour en revenir au composant OutLine qui est sympa, les fonctions à utiliser sont probablement

Getnextchild pour se déplacer dans l'arborescence et trouver les enfants du noeuds parent!

mais j'sais pas faire encore...

Avis aux amateurs ou aux profs! rappel, pas de clic souris, ça doit se faire par programme!

Que Delphi soit avec-vous !

jlmcom :)
0
Rejoignez-nous