Je construis un programme qui doit le Form_Create
, remplir un TListView
appelé FileList
, le répertoire que je veux remplir est l'endroit où le programme compilé est + \Files
, comme je l'ai jamais utilisé un TListView
Je veux savoir comment faire ça?Liste des fichiers sur un répertoire sur un TListView
Répondre
Il y a plusieurs parties à ta question. Je vais vous donner un aperçu ici. Si vous avez besoin d'aide pour une étape particulière, veuillez poster une question de suivi plus spécifique.
Déterminez à quoi correspond "où se trouve le programme compilé".
Pour obtenir le chemin d'accès complet du fichier EXE, appelez le
ParamStr(0)
. Pour supprimer le nom de fichier EXE de cette chaîne, de sorte que vous avez juste la partie de répertoire, appelezExtractFilePath
. Assurez-vous qu'il se termine par une barre oblique inverse (IncludeTrailingPathDelimiter
), puis ajoutez votre répertoire "Fichiers".Obtenez une liste de fichiers. Utilisez
FindFirst
etFindNext
pour créer une boucle qui examine tous les fichiers. Les noms comprendront le "." et ".." noms de répertoires relatifs, vous pouvez donc souhaiter les exclure. Méfiez-vous que les fichiers ne sont pas énumérés dans un ordre particulier. Si vous avez besoin d'eux triés par ordre alphabétique, par exemple, vous devrez le faire vous-même. (Ils peuvent semblent être dans l'ordre alphabétique dans vos tests, mais cela ne sera pas toujours vrai.)var Rec: TSearchRec; begin if FindFirst(path + '\*', faAnyFile, Rec) = 0 then try repeat if (Rec.Name = '.') or (Rec.Name = '..') then continue; if (Rec.Attr and faVolumeID) = faVolumeID then continue; // nothing useful to do with volume IDs if (Rec.Attr and faHidden) = faHidden then continue; // honor the OS "hidden" setting if (Rec.Attr and faDirectory) = faDirectory then ; // This is a directory. Might want to do something special. DoSomethingWithFile(Rec.Name); until FindNext(Rec) <> 0; finally SysUtils.FindClose(Rec); end; end;
Ajouter des nœuds au contrôle pour représenter les fichiers.
Vous voudrez peut-être le faire dans la fonction hypothétique
DoSomethingWithFile
que j'ai mentionnée ci-dessus. Utilisez la propriétéItems
de la vue de liste pour faire des choses avec les éléments, comme en ajouter de nouveaux.var Item: TListItem; begin Item := ListView.Items.Add; Item.Caption := FileName; end;
TListItem
a des propriétés supplémentaires; consultez la documentation pour plus de détails. La propriétéSubItems
est utile si vous affichez la vue de liste en mode "rapport", où il peut y avoir plusieurs colonnes pour un seul noeud.Associer des images aux éléments.
Les images de nœuds dans une vue de liste proviennent des listes d'images associées,
LargeImages
etSmallImages
. Ils se réfèrent à un ou plusieurs composantsTImageList
sur votre formulaire. Placez vos images d'icône ici, puis affectez les propriétésImageIndex
des éléments aux numéros correspondants.
Selon la façon dont vous voulez que votre programme élaboré pour être, vous pouvez utiliser le contrôle de Delphi TShellListView
au lieu de faire tout le travail ci-dessus vous.
Vous devez afficher les images lors du dessin des lignes.
Cela devrait vous donner une idée: http://www.delphidabbler.com/articles?article=16 http://delphi.about.com/od/delphitips2008/qt/lv_checkbox_bmp.htm
La seule différence est que vous allez dessiner une icône/image. Ici, vous apprendrez à le faire dans une grille: http://delphi.about.com/library/weekly/aa032205a.htm Donc, à partir des deux vous pouvez avoir l'idée.
Si vous déposez un TImagelist sur le formulaire avec deux images dans (un fichier avant et un pour les répertoires), puis affectez le TImagelist à la propriété TListviews LargeImages, vous pouvez utiliser le code ci-dessous.
procedure TForm2.Button1Click(Sender: TObject);
var li:TListItem;
SR: TSearchRec;
begin
FileList.Items.BeginUpdate;
try
FileList.Items.Clear;
FindFirst(ExtractFilePath(Application.ExeName) +'*.*', faAnyFile, SR);
try
repeat
li := FileList.Items.Add;
li.Caption := SR.Name;
if ((SR.Attr and faDirectory) <> 0) then li.ImageIndex := 1
else li.ImageIndex := 0;
until (FindNext(SR) <> 0);
finally
FindClose(SR);
end;
finally
FileList.Items.EndUpdate;
end;
end;
Vous pouvez ensuite construire sur ce en ajoutant des images différentes à la TImageList pour différents types de fichiers, et en utilisant ExtractFileExt (SR.Name) pour obtenir l'extension des fichiers
if ((SR.Attr and faDirectory) <> 0) then li.ImageIndex := 1
else if lowercase(ExtractFileExt(SR.Name)) = '.png' then li.ImageIndex := 2
else if lowercase(ExtractFileExt(SR.Name)) = '.pdf' then li.ImageIndex := 3
else li.ImageIndex := 0;
+1 Très belle réponse, Rob! – jpfollenius
Super exemple de dépassement de pile en action. Vraiment bonne réponse Rob. – robsoft