2010-01-07 6 views

Répondre

15

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.

  1. 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, appelez ExtractFilePath. Assurez-vous qu'il se termine par une barre oblique inverse (IncludeTrailingPathDelimiter), puis ajoutez votre répertoire "Fichiers".

  2. Obtenez une liste de fichiers. Utilisez FindFirst et FindNext 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; 
    
  3. 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.

  4. Associer des images aux éléments.

    Les images de nœuds dans une vue de liste proviennent des listes d'images associées, LargeImages et SmallImages. Ils se réfèrent à un ou plusieurs composants TImageList sur votre formulaire. Placez vos images d'icône ici, puis affectez les propriétés ImageIndex 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.

+1

+1 Très belle réponse, Rob! – jpfollenius

+1

Super exemple de dépassement de pile en action. Vraiment bonne réponse Rob. – robsoft

2

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; 
Questions connexes