Treeview i pokazywanie tylko odpowiednich ścieżek

0

Witam.

Mam sobie kodzik wyszukujący w danej ścieżce foldery i pliki o konkretnym rozszerzeniu i pokazującym to wszystko w TreeView:

procedure GetDirectories(Tree: TTreeView; Directory: string; Item: TTreeNode; IncludeFiles: Boolean; Ext: String; HideExt: Boolean);
var
  SearchRec: TSearchRec;
  Node: TTreeNode;
begin
  Tree.Items.BeginUpdate;
  if Directory[Length(Directory)] <> '\' then Directory := Directory + '\';
  if (FindFirst(Directory + '*.*', faDirectory, SearchRec) = 0)  then
  begin
    repeat
      if (SearchRec.Attr and faDirectory = faDirectory) and (SearchRec.Name[1] <> '.') then
        begin
          if (SearchRec.Attr and faDirectory > 0) then
            Item := Tree.Items.AddChild(Item, SearchRec.Name);
            Node := Item.Parent;
           GetDirectories(Tree, Directory + SearchRec.Name, Item, IncludeFiles, Ext, HideExt);
           Item := Node;
        end
      else if IncludeFiles then
        if (Ext = '') or (Ext = '*') and (FindFirst(Directory + '*.' + Ext , faAnyFile, SearchRec) = 0) then
          begin
            if (SearchRec.Name[1] <> '.') then
               if HideExt = True then
                ExtractFileName(SearchRec.Name);
             Tree.Items.AddChild(Item, SearchRec.Name);
          end
        else
          begin
            if (ExtractFileExt(SearchRec.Name)= '.' + Ext) and (FindFirst(Directory + '*.' + Ext , faAnyFile, SearchRec) = 0) then
              begin
               repeat
                if HideExt = True then
                  ExtractFileName(SearchRec.Name);
                 Tree.Items.AddChild(Item, SearchRec.Name);
               until FindNext(SearchRec) <> 0;
                 FindClose(SearchRec);
              end;
          end;

    until (FindNext(SearchRec) <> 0) ;
      FindClose(SearchRec);
  end;
   Tree.Items.EndUpdate;
end;

Może nie jest najlepszy, ale działa on m.in. tak, że jeżeli się poda rozszerzenie to jeżeli w folderze jest plik o tym rozszerzeniu i folder (niekoniecznie pusty) nie mający w sobie takiego pliku to folder niemający tego pliku niezostanie on wyświetlony. I jest OK.

Problem polega na tym, że jeżeli jest kilka folderów (folder w folderze) i w żadnym z nich nie ma takiego pliku to i tak zostają te foldery wyświetlone.

Jak zmodyfikować ten kod (a może ktoś ma pomysł na inny), by ścieżka, której nie ma plików o konkretnym rozszerzeniu nie wyświetlała się w TreeView.

0

Zna ktoś może odpowiedź na moje pytanie?

0

Metoda chyba najwolniejsza... Ale najłatwiejsza. Po wczytaniu całego drzewa sprawdzaj po kolei wszystkie elementy. Jeżeli jest to folder i nie ma podelementów - to go usuń.

0

Tak na szybko? Zamień procedurę na funkcję - typ zwracany Boolean. A potem dokonaj zmian coś na kształt:

function GetDirectories(...): Boolean;
var
  subresult : Boolean;
  ...
begin
  Result := False
  //... pętla szukania
    if folder then
    begin
      node := nowy node;
      subresult := GetDirectories(...);
      if not subresult then
        delete node
      else
        co_tam_robisz_z_nodem;
      Result := Result or subresult;
    end;

    if plik_pasuje_do_wzorca then
      Result := True;
end;

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.