Newsgroup: it.comp.lang.delphi
Titolo: nuova (avevo scritto in html sorry) risorsione file e cartelle tipo esplora risorse

procedure prendifile(Path: String; Contenitore: TStrings);
var
TSC: TSearchRec;
begin
try
  if FindFirst(Path, faAnyFile, TSC) = 0 then
     begin
      repeat
       Contenitore.Add(TSC.Name);
       if TSC.Attr = faDirectory then
       prendifile(TSC.Name, Contenitore);
       until FindNext( TSC ) <> 0;
      end;
  finally
  FindClose( TSC );
 end;
end;
dove' che sbaglio il risultato provato con un button mi da :
diciamo che glio ho passato la directory c:\programmi
.
projects
.
..
acer
questo
quello
PERO' NON MI ENTRA NELLE SOTTO CARTELLE, il compito per cui l'ho create... 
ma cosa e' quel projects??
il resto e' una lista di cartelle come se non riciamasse la ricorsione in 
prendifile(TSC.Name, Contenitore);
qualcuno sa come aiutarmi?
poi dovrei passare il tutto ad un treeview, ho provato con le cartelle a 
passargliele cosi ma mi da not enough actual parameters  in "with 
treeview1.Items.Add do"
procedure TForm1.Button3Click(Sender: TObject);
var
  treeview1: TTreeView;
  Z: TStringList;
  I: Integer;
begin
  listview1.Clear;
  Z := TStringList.Create;
  try
    prendifile(Combobox1.Text+'\*.*', Z);
    for I := 0 to Z.Count-1 do
    begin
      with treeview1.Items.Add do
       Caption := Z.Strings[I];
    end;
   finally
   Z.Free;
  end;
 end;
end.
qualche idea?
Grazie
Daniel

end
Cosě funziona 
-- 
Ore 18.30: premo invio.

 ha scritto nel messaggio 
news:08l+RAndBS7Y2a...@4ax.com...


 gli passo sempre c:\programmi
passagli 'c:\programmi\*.*'
Ciao, Antò.

 risorsione??
scusami  non avevo seguito bene il thread, prova cosě
procedure prendifile(Path: String; Contenitore: TStrings);
var
TSC: TSearchRec;
begin
  try
    if FindFirst(Path+'\*.*', faAnyFile, TSC) = 0 then
    begin
      repeat
        if (TSC.Name <> '.') and (TSC.Name <> '..') then
        begin
          if (TSC.Attr  = faDirectory) then
          begin
            Contenitore.Add('DIR: '+TSC.Name);
            prendifile(path+'\'+TSC.Name, Contenitore);
          end
          else
            Contenitore.Add('FILE: '+TSC.Name);
        end;
      until FindNext( TSC ) <> 0;
    end;
  finally
    FindClose( TSC );
  end;
end;
Ciao, Antň.

>          if (TSC.Attr  = faDirectory) then
No va bene! si dovrebbe usare    if (TSC.Attr And faDirectory)<>0 then
in quanto se possiede altri attributi cone il "nascosta" non ti funziona.
Giorgio. 

 ha scritto nel messaggio 
news:447f2df1$0$980$5fc...@news.tiscali.it...


 ha scritto nel messaggio 
news:r03rwv2r8yvm$.1mhlum0d6x7bs.dlg@40tude.net...


nelle cartelle e sottocartelle e relativi file!!!
Postata tempo fa su questo stesso gruppo:
unit FileSearcher;
interface
uses
  SysUtils;
type
  TFileFoundEvent = procedure (AFullPathName: String; AFileInfo:
TSearchRec; var AStop: Boolean) of object;
  TFileSearcher = class
  private
    FFileFoundEvent: TFileFoundEvent;
  protected
    procedure DoFileFound(AFullPathName: String; AFileInfo:
TSearchRec; var AStop: Boolean);
  public
    property OnFileFound: TFileFoundEvent read FFileFoundEvent write
FFileFoundEvent;
    procedure ScanFolder(const AFolder: String; ARecursive: Boolean =
True);
  end;
implementation
{ TFileSearcher }
procedure TFileSearcher.DoFileFound;
begin
  if Assigned(FFileFoundEvent) then
    FFileFoundEvent(AFullPathName, AFileInfo, AStop);
end;
procedure TFileSearcher.ScanFolder;
var
  StopFlag: boolean;
  procedure LookForFiles(AFolder: String);
  var
    F: TSearchRec;
  begin
    ChDir(AFolder);
    if FindFirst('*.*', faAnyfile, F) = 0 then
    begin
      repeat
        if (F.Name <> '.') and
           (F.Name <> '..') then
        begin
          if ((F.Attr and faDirectory) <> 0) then
          begin
            if ARecursive then
              LookForFiles(F.Name);
          end
          else
            DoFileFound(ExpandFileName(F.Name), F, StopFlag);
        end;
      until StopFlag or (FindNext(F) <> 0);
      FindClose(F);
    end;
    ChDir('..');
  end;
begin
  StopFlag := False;
  LookForFiles(AFolder);
end;
end. 

 ha scritto nel messaggio 
news:2fnu72l75hu0mmu5k...@4ax.com...


> True);
Qui gli passi la path.
L'evento OnFileFound ti consente di agganciarci il codice che vuoi tu.
Che diamine, un po' di sforzo!

 ha scritto nel messaggio 
news:np70821vede3rrl46...@4ax.com...


mi dici dove trovo del materiale che mi spiega questo argomento 
Quale "argomento" ? A te serve un buon manuale del linguaggo che ti
spieghi cosa sono gli eventi e come si usano.  Mi spiace, ma ti
mancano proprio le basi.

Questa l'avevo fatta per cancellare ricorsivamente una dir. con tutte le
sotto dir, puoi modificarla facilmente al tuo scopo, Giorgio
// Devi richiamarla es. con CancellaDirectory(c:\prova)
procedure TForm1.CancellaDirectory(Dir: String);
   var ResSearch: TSearchRec;
   st: String;
// Cerca il primo
Try
    if FindFirst(Dir+'\*.*', faAnyFile, ResSearch)=0 then
       if (ResSearch.Attr And faDirectory)<>0 then
           begin
           if ResSearch.Name[1]<>'.' then
               begin
               CancellaDirectory(Dir+'\'+ResSearch.Name);
               RmDir(Dir+'\'+ResSearch.Name);
               end;
           end
       else
          DeleteFile(PChar(Dir+'\'+ResSearch.Name));
    // Prosegue col successivo
   While FindNext(ResSearch)=0 do
      if (ResSearch.Attr And faDirectory)<>0 then
         begin
        if ResSearch.Name[1]<>'.' then
            begin
            CancellaDirectory(Dir+'\'+ResSearch.Name);
            RmDir(Dir+'\'+ResSearch.Name);
            end;
         end
      else
         DeleteFile(PChar(Dir+'\'+ResSearch.Name));
Finally
   // Chiude il ciclo di ricerca
   FindClose(ResSearch.FindHandle);
   end;

           if ResSearch.Name[1]<>'.' then
Sarebbe bene che cancellasse anche le cartelle che iniziano per il
punto, però.

 ha scritto nel messaggio 
news:e5rnsi$im2$1...@balena.cs.interbusiness.it...

grazie ho risolto, ora riesco a mettere in una listview le directory e file, 
esplorandole tutte....
il problema ora e' metterle in un treeview per mostrarle come un albero da 
poter aprire simil windows esplora risorse, mi sembra pero' che cosi come le 
ho salvate e visualizzate sulla listview non formerebbero un albero 
correttamente! qualcuno ha una struttura di esempio che dovrei utilizzare 
per farlo, almeno per avere un idea...
oppure devo modificare completamente la funzione ricorsiva che mi esplora le 
cartelle come quella che utilizzo:
procedure prendifile(Path: String; Contenitore: TStrings);
var
TSC: TSearchRec;
begin
  try
    if FindFirst(Path+'\*.*', faAnyFile, TSC) = 0 then
    begin
      repeat
        if (TSC.Name <> '.') and (TSC.Name <> '..') then
        begin
          if (TSC.Attr = faDirectory) then
          begin
            Contenitore.Add(TSC.Name);//directory
            prendifile(path+'\'+TSC.Name, Contenitore);
          end
          else
            Contenitore.Add(TSC.Name);// file
        end;
      until FindNext( TSC ) <> 0;
    end;
  finally
    FindClose( TSC );
  end;
end;
e per mettere nel listview uso questa:
procedure TForm1.Button3Click(Sender: TObject);
var
  Z: TStringList;
  I: Integer;
begin
  listview1.Clear;
  Z := TStringList.Create;
  try
    prendifile(Combobox1.Text, Z);
    for I := 0 to Z.Count-1 do
    begin
      with listview1.Items.Add do
        Caption := Z.Strings[I];
    end;
   finally
   Z.Free;
  end;
 end;
grazie a tutti
Daniel 

cartelle come quella che utilizzo:
Bravo, così accoppierai definitivamente due codici che dovrebbero
essere assolutamente svincolati l'uno dall'altro.
Ma perché non prendi esempio da chi perde del tempo a fornirti gli
esempi ?  Nel codice che ti ho mostrato prima, ti viene illustrata la
strada corretta per procedere: hai una classe che possiede un metodo
che solleva un evento.  L'evento si comporta sostanzialmente come una
callback: a quell'evento agganci tutto il codice che vuoi, sia che tu
voglia riempire una TListView, sia che tu voglia riempire un TTreeView
sia che tu voglia riempire un TPaperino.

 essere assolutamente svincolati l'uno dall'altro.   :(
E' che nell'esempio dell'help del dephi mostra :
procedure TForm1.Button1Click(Sender: TObject);
var
  MyTreeNode1, MyTreeNode2: TTreeNode;
begin
  with TreeView1.Items do
  begin
    Clear; { remove any existing nodes }
    MyTreeNode1 := Add(nil, 'RootTreeNode1'); { Add a root node }
    { Add a child node to the node just added }
    AddChild(MyTreeNode1,'ChildNode1');
    {Add another root node}
    MyTreeNode2 := Add(MyTreeNode1, 'RootTreeNode2');
    {Give MyTreeNode2 to a child }
    AddChild(MyTreeNode2,'ChildNode2');
    {Change MyTreeNode2 to ChildNode2 }
    { and add a child node to it}
    MyTreeNode2 := TreeView1.Items[3];
    AddChild(MyTreeNode2,'ChildNode2a');
    {Add another child to ChildNode2, after ChildNode2a }
    Add(MyTreeNode2,'ChildNode2b');
    {add another root node}
    Add(MyTreeNode1, 'RootTreeNode3');
  end;
end;
 come popolare un treeview ma non ricorsivamente quindi ho capito benissimo 
come crearlo nodo per nodo ma a run-time proprio no!
MyTreeNode1 := Add(nil, 'RootTreeNode1'); { Add a root node }
    { Add a child node to the node just added }
    AddChild(MyTreeNode1,'ChildNode1');
    {Add another root node}
    MyTreeNode2 := Add(MyTreeNode1, 'RootTreeNode2');
    {Give MyTreeNode2 to a child }
    AddChild(MyTreeNode2,'ChildNode2');
qui infatti gia' sono quanti nodi ho quindi posso aggiungere nodi e figli a 
chi voglio conoscendo le variabili MyTreeNode1....2....3ect
e ha run time no!
A presto
Daniel

dichiarazione dei processi!
Ma è sempre meglio imparare a fare le cose per bene *da subito*, che
inziare con le porcate e poi migliorare.  Ti ho fatto un esempio di
utilizzo, mi sembra strano che tu abbia tante difficoltà.



var
  fs: TFileSearcher;
...                                                          ==> cosa 
indicano?(cosa posso o dovrei mettere?)
fs := TFileSearcher.Create;
try
  fs.OnFileFound := // tuo metodo ...==>  puoi farmi un esempio breve di che
metodo e come inserilo anche semplicissimo? {come questo piccolo codice}
  fs.ScanFolder( // tuo path );
finally
  fs.Free;
end;
ciao
Daniel 

A me pare che Laforgia stia discutendo del sesso degli angeli.Non penso
che un forum sia un posto dove venire a fare il professorino frustrato.
per Daniel:
dai un occhio qui:
http://www.swissdelphicenter.ch/torry/showcode.php?id=154
non far caso a questi professorini-web che girano, puoi documentarti
autonomamente. Dal sito 
www.torry.net
 trovi una bella sezione "Tips"
che tipuò aiutare in tante cose.
per Laforgia:
se hai voglia di aiutare qualcuno, dagli una risposta e basta, non
penso sia il caso di mettere in ridicolo una persona che sta imparando;
così facendo ti rendi ridicolo solo tu. Mi piacerebbe vedere cosa ti
rispondevano nei tuoi primi post e mi piacerebbe sapere se hai trovato
chi ti faceva del "nonnismo". Penso che ti devi dare una bella calmata.
Ciao, Alan.

Ciao, Alan.
ciao e grazie mille, anche per la comprensione