Comment faire pour afficher une arborescence simple dans un mémo ???

Résolu
Signaler
-
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
-
Salut à tous

Je pensais que l'on pouvait faire apparaitre une arborescence avec un DirectoryOutline. mais les fichiers n'apparaissent pas. Donc je me demandais si il y avait moyen de faire apparaitre une arborescence (dossiers+fichiers) simple (enfin du meme style qu'un
DirectoryOutline) dans un mémo. Il faudrait aussi qu'en cliquant sur un fichier son nom complet apparaisse dasn un Edit.

Merci

18 réponses

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
38
deja je n'utiliserais pas un memo (editeur de texte) mais soit comme l'on dit les autres un TTreeView ou une ListBox.



de la avec l'evenement OnClick de la ListBox tu recupere l'ItemIndex et tu affiche le texte de l'item dans le TEdit.



en gros :



edit1.text := listbox1.items[listbox1.ItemIndex];



le probleme du memo c'est qu'il n'y a pas la propriétée ItemIndex.

on devrait donc tricher avec le "memo1.CaretPos.Y" pour

savoir qu'elle ligne est selectionnée et ensuite affichée la ligne comme suis sur l'evenement OnClick du tmemo :



edit1.text := memo1.lines[memo1.CaretPos.Y];



mais je maintiens, un memo pour ça c'est pas vraiment adapté.



en plus la ListBox a un evenement bien pratique le OnDrawItem qui permet de personnaliser l'affichage des Items.

chose que TMemo n'a pas ...

et ce n'est pas pour rien que les TreeView et autre du style sont basé sur TListBox.



en gros, reflechis mieux au methode a appliquer et choisis mieux tes composants pour ce faire.

je ne connais pas le but de ton application, mais partis comme c'est la tu risque de rencontrer

beaucoup de problemes et tu seras obliger de réecrire tout de A a Z plusieur fois.



et un dernier conseil, ne reinvente pas la roue, tu y perdras trop de temps pour pas grand chose

au final.

En fait je cherche une arborescence complete mais pas dynamique (sélection d'un dossier puis d'un sous dossier puis d'un fichier) mais que l'on voye directement dans le mémo sans la moindre manipulation un truc du genre

Si on clique sur Setup.exe, le nom complet de ce fichier apparait dans l'Edit
Messages postés
198
Date d'inscription
mardi 6 août 2002
Statut
Membre
Dernière intervention
29 octobre 2008

Afin de voir une arborescence j'utiliserais une TTreeView

vaughan

C'est quoi ce délire : l'image c pas la mienne grrrrr (merci aux admins de l'enlever).

Voila je cherche à avoir une arborescence complete de ce type :

Tous les fichiers et répertoires apparaissent sans être obligés de le faire en cliquant sur le C:\ puis sur le dossier puis sur le sous dossier ect ect. En fait on a le listing complet des fichiers avec les sous dossiers qui apparait dans le mémo (ou autre si obligation d'utiliser des barres de défilement pour voir l'ensemble du listing)
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
salut vas voir la source:

Utiliser FindFirst en récursif pour scruter les sous-répertoires.

elle compte le nombre de fichier dans un repertoire et ses sous
repertoires en les affichant temporairement dans un label. Il te sera
facile de remplacer le label par un memo.
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
au fait quand tu ecris:

"En fait on a le listing complet des fichiers avec les sous dossiers qui
apparait dans le mémo (ou autre si obligation d'utiliser des barres de
défilement pour voir l'ensemble du listing)"

il me parait difficile que tu puisses afficher l'ensemble du
listing du lecteur c: sur un écran sans faire défiler la fenetre : en
effet ce lecteur contient plusieurs milliers de fichiers qui te
donneront plusieurs milliers de lignes et je doute que ton ecran puisse
contenir la totalité des informations

Les deux méthodes proposées m'interessent pour deux traitements différents, mais :

*TTreeView : je ne vois pas les fichiers mais que les dossiers et sous-dossiers: comment faire pour voir les fichiers ???

*Méthode récursive : la méthode de Nono40 est interessante. Cependant il n'y a pas de listings de fichiers mais une substitution des chemins dans l'Edit.

Merci
Messages postés
198
Date d'inscription
mardi 6 août 2002
Statut
Membre
Dernière intervention
29 octobre 2008

Le TTreeview ne sert que d'affichage. Tu peux y mettre répertoire et fichier comme l'explorer Windows.


Voici un bout de code permettant de rechercher dans un répertoire des fichiers, à toi de la rendre récursive ... les fichiers trouvé sont mis dans une liste à toi de les mettre dans ta Treeview.


Var
vSearchRec: TSearchRec;
begin
If FindFirst(Val,FAttrib,vSearchRec) = 0 Then
Begin
pLst.Add(vSearchRec.Name);
While FindNext(vSearchRec) = 0 Do
pLst.Add(vSearchRec.Name)
End
Else
Raise Exception.Create('Search File Error: '+ Val);


FindClose(vSearchRec);

vaughan

vaughan : tu va pas me faire croire qu'il n'y a pas une ptite option dans l'inspecteur de la treeview pour faire apparaitre les fichiers ????
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
rien ne t'empeche de modifier le code de NONO40 pour afficher les dossiers et fichiers dans un liste ou un memo

Je dis pas que ton idée est pas bonne, jlen100, mais c 'est pas trop mon genre de prendre un basuka pour tuer une mouche . Par contre pour une autre partie de mon application j'en aurais besoin .

Je ne sais pas si tu as compiler la source de Nono40 mais je le rappelle tu n'as pas un listing des fichiers :

c:\
c:\mesdocuments
c:\ mesdocuments\projet.exe

mais une substitution :
c:\ s'efface dans l'edit pour C:\mesdocuments qui s'efface pour c:\ mesdocuments\projet.exe

Merci quand même
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
je ne te dis pas que la source de NONO40 dans sa version actuelle fait
une liste mais qu'il est facile de faire une liste à partir de cette
source par exemple si tu remplaces l'Edit par un memo et que tu fais
Form1.Memo1.Append(chemin) tu as la liste des chemins; maintenant si tu
utilises le code de vaugan en relation avec celui de NONO40 tu auras
bien la liste des fichiers du repertoire racine et des sous-repertoires.
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
38
une petite methode qui t'aideras surrement, a toi de la modifier selon
tes besoins. (hs : Je veux une fonction Editer sur le forum!)







interface



type
DynArrayOfStr : array of string;



implementation



function FilesSearch(path : string) : DynArrayOfStr;

var

sr : TSearchRec;

fn : string;

begin

FindFirst(path+'\*.*',faAnyFile,sr);

while FindNext(sr) = 0 do begin

SetLength(result, length(result)+1);

result[length(result)-1] := path+'\'+sr.Name;

end;

FindClose(sr);

end;

Mon anniv c'est le 23 janvier pour ceux qu'ils veulent m'offrir une paire de rames

merci quand meme

Je vais recentrer ma question : je souhaite faire apparaitre une arborescence simple de fichiers avec les repertoires et sous repertoires dans un composant de type Edit, Mémo ou AUTRE (C'est pour toi FOXI) et de facon simple.

Bon voila j'ai mis au point une petite source pour rechercher les répertoires de la racine

procedure TForm1.Button1Click(Sender: TObject);
var
D: TSearchRec;
begin
FindFirst('C:\*.*', faDirectory, D);
if FindFirst('C:\*.*', faDirectory, D) = 0 then
repeat
ListBox1.Items.Add(D.FindData.cFileName) ;
FindNext(D);
until FindNext(D) <> 0;
FindClose(D);


end;


end.

Manque de bol, j'ai une liste (dans une listebox) cependant je n'ai pas tout les répertoires de la racine et des fichiers .com .exe et .bat sont listés. Ou est l'erreur dans ma source ????

J'ai trouvé mon erreur, j'ai modifié mon code :

Pour les répertoires :

Procedure TForm1.Button1Click(Sender: TObject);
var
D: TSearchRec;
F: TSearchRec;
begin
FindFirst('C:\*.*', faDirectory, D);
if FindFirst('C:\*.*', faDirectory, D) = 0 then
repeat
If (D.Attr And faDirectory)<>0
Then ListBox1.Items.Add(D.FindData.cFileName)
--------
Pour les fichiers

Procedure TForm1.Button1Click(Sender: TObject);
var
D: TSearchRec;
F: TSearchRec;
begin
FindFirst('C:\*.*', faDirectory, D);
if FindFirst('C:\*.*', faDirectory, D) = 0 then
repeat
If (D.Attr And faDirectory)=0
Then ListBox1.Items.Add(D.FindData.cFileName)

Il reste plus qu'à faire une boucle pour lister de façon non "ordonnée" (au sens alphabetique) tout les répertoires, sous répertoires et fichiers.Si quelqu'un à une idée ???
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
38
salut,



utilise la fonction que je t'ai fournis.



- n'utilise pas une boucle Repeat et conditionnée mais une boucle While

- n'utilise pas la fonction ADD des TStringList celle ci diminue trop les performances du programme,

utilise donc APPEND dans les TStringList, comme elle ne necessite pas de valeur de retour comme ADD

elle s'execute plus rapidement.

- ensuite pas besoin de deux variable TSearchRec une seule suffit.

- pour ordonner une liste par ordre alphabetique utilise la propriete "sort" a "true" des tlistbox.

- pour les variables du meme type, declare les sur une seule ligne : var F,D : TSearchRec;



voila pour les conseils.

voici une version de ma fonction adaptée pour les type TStringList.



procedure FilesSearch(var list : tstringlist; path : string; attr : integer);
var
sr : TSearchRec;
fn : string;
begin
FindFirst( path+'\*.*', attr, sr);
while FindNext( sr ) = 0 do begin
list.append( path+'\'+sr.Name );
end;
FindClose(sr);
end;



utilisation de la fonction :



procedure TForm1.Button1Click(Sender : TObject);

begin

FilesSearch (listbox2.items, 'c:\program files', faAnyFiles);

end;





utilise les attributs de fichiers pour determiner le type des elements fichier ou repertoire.

"sr.attr" si je ne m'abuse.