Bonjour,

Depuis la méthode ci-dessous, j'essai d'extraire une liste d'extensions contenues dans un dossier à l'aide d'un TStringList (ExtCompare).

Les deux boucles For, servent dont à filtrer les doublons et contruire le une seconde TStringList (ExtLst), sans les doublons à l'aide de la condition If Then.

L'algo semble correcte, mais au résultat, ça retourne la liste complète.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
function getListExtFiles(dir: string): string;
var
  ExtLst, ExtCompare : TStringList;
  SFilename: TSearchRec;
  ExtResult, separator: string;
  i, j, k: integer;
begin
  ExtLst := TStringList.Create;
  ExtCompare := TStringList.Create;
  // On ajoute une valeur pour permettre de rentrer dans la boucle "for i :="
  ExtLst.Add('null');
  dir := IncludeTrailingPathDelimiter(dir);
  // Recherche de la première entrée du répertoire 
  if FindFirst(dir+'*.*',faAnyFile,SFilename)=0 then
  begin
    repeat
      if (SFilename.Name<>'.')And(SFilename.Name<>'..') then
        // contruction the string list
        if ((SFilename.Attr and faDirectory)=0) then
          ExtCompare.Add(UpperCase(ExtractFileExt(SFilename.FindData.cFileName)));
        { Il faut ensuite rechercher l'entrée suivante }
    until FindNext(SFilename)<>0;
 
    // --- On Compare les 2 stringlist pour extraire les extensions sans les doublons ---
    for i := 0 to ExtCompare.Count-1 do
    begin
      for j := 0 to ExtLst.Count-1 do
      begin
        if ExtCompare.Strings[i]<>ExtLst.Strings[j] then
        begin
          ExtLst.Add(ExtCompare.Strings[i]);
        end;
      end;
    end;
 
    for k := 1 to ExtLst.Count-1 do // k = 0 => Null
    begin
      // Concaténe les extensions dans une chaine
      ExtResult := ExtResult + separator + ExtLst.Strings[k];
      if (ExtLst.Count>2) then separator := ' | ' else separator := '';
    end;
    // --------------------------------------------------------------
    { Libére les ressources de la recherche }
    FindClose(SFilename);
  end;
  // Libère la mémoire allouée
  ExtLst.Free;
  ExtCompare.Free;
  // Retourne les extensions différentes sans les doublons
  result := ExtResult;
end;
Merci pour vos conseils.