Skocz do zawartości
Forum komputerowe PC Centre
kamil274

[Delphi] Przeszukiwanie katalogów

Rekomendowane odpowiedzi

Witam,

próbuje zrobić coś na wzór TotalCommander. korzystam z TTreeView i DriveComboBox(wiem że są te komponenty z shell ale mi nie pasują).

Oto kod procedury wyszukującej katalogi i pliki:

procedure ListujKatalogi(tnRodzic : TTreeNode; Sciezka : string);
{Metoda falenicka}
var
sr : TSearchRec;
Wynik : integer;
tnDziecko : TTreeNode;
begin

Wynik := FindFirst(Sciezka + '*.*', faAnyFile, sr);      {faAnyFile}
{czytamy pierwszy plik_katalog}
 while Wynik = 0 do{jesli funkcja cos znalazla(wynik=0) rob}
 begin
  if
     (sr.Name <> '.')and(sr.Name <> '..') then
      {jezeli jest to katalog}
    begin{dopisujemy do drzewka}
      tnDziecko := Form1.TreeView1.Items.AddChild(tnRodzic, sr.Name);
      {dopisujemy katalog jako podrzedny}


         ListujKatalogi(tnDziecko ,Sciezka + sr.Name + '\');  {TO JEST TO WYWOLANIE REKURENCYJNE KTORE CZYTA NASTEPNE KATALOGI}
           {wywolujemy rekeurncyjnie metode, jako kat. nadrzedny bedzie
       teraz ostatnio znaleziony kat.}  
    end;
  Wynik := FindNext(sr);
  {szukamy nastepnych}
 end;
FindClose(sr);
{zwalniamy pamiec}
if tnRodzic = Nil then
else
  {tnRodzic.AlphaSort; }

end;

 

Jest to kod zaczerpnięty z neta ale działa :) z tym że przeszukuje od razu po wyborze dysku wszystkie katalogi i zajmuje to strasznie duzo czasu zanim to wyszuka(okolo 30 -40 sekund) i zapisze w TreeView.Pytanie mam takie : w jaki sposób przerobić procedurę aby wyszukiwała kolejne "zagłębione" katalogi dopiero po kliknięciu w wybrany katalog (czyli jesli mam 3 foldery A,B,C to gdy klikne dajmy na to B to dopiero przeszukuje mi ten folder i dopiero teraz zapisuje jego zawartosc do treeview np na glebokosc 3 katalogow).Drugie pytanie to: jeśli zaznaczę jakiś plik w tym drzewie myszką to jak mam to oprogramować? np chce zrobic cos takiego ze jak zaznaczę plik to mi wysle jego sciezke do jakiegos stringa/PChara zebym mogl operować na tym pliku.

Bardzo chętnie przyjmę jakiekolwiek rady :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Poczytaj o zdarzeniach. W pierwszym przypadku pewnie należy uruchomić tę procedurę szukającą w OnClick dla TTreeView.

W drugim też skorzystaj z OnClick.

http://www.google.pl/search?hl=pl&safe=off&client=opera&hs=KeD&rls=pl&q=delphi+TreeView+selected+node&aq=f&aqi=&aql=&oq=&gs_rfai=

http://delphi.about.com/od/vclusing/l/aa010703a.htm

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Poczytałem na ten temat ale udało mi się zrobić tylko coś takiego:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, ShellCtrls, FileCtrl;

type
 TForm1 = class(TForm)
   TreeView1: TTreeView;
   ComboBoxEx1: TComboBoxEx;
   ListView1: TListView;
   DriveComboBox1: TDriveComboBox;

   Label1: TLabel;

   procedure DriveComboBox1Change(Sender: TObject);
   procedure TreeView1Click(Sender: TObject);
 private

   { Private declarations }
 public

   { Public declarations }
 end;

var
 Form1: TForm1;
 Licznik:integer;  {zmienna ktora steruje glebokoscia wpisywania elementow(katalogow) do drzewa}
implementation
{$R *.dfm}


procedure ListujKatalogi(tnRodzic : TTreeNode; Sciezka : string);
{Metoda falenicka}
var
sr : TSearchRec;
Wynik : integer;
tnDziecko : TTreeNode;
begin
 if Licznik=2 then
   begin
     Licznik:=0;
   end
 else
   begin
     Wynik := FindFirst(Sciezka + '*.*', faAnyFile, sr);      {czytamy pierwszy plik_katalog}
     while Wynik = 0 do{jesli funkcja cos znalazla(wynik=0) rob}
       begin
         if (sr.Name <> '.')and(sr.Name <> '..') then     {jezeli jest to katalog}
           begin{dopisujemy do drzewka}
             tnDziecko := Form1.TreeView1.Items.AddChild(tnRodzic, sr.Name);{dopisujemy katalog jako podrzedny}
             Inc(Licznik);
             ListujKatalogi(tnDziecko ,Sciezka + sr.Name + '\');  {TO JEST TO WYWOLANIE REKURENCYJNE KTORE CZYTA NASTEPNE KATALOGI}
               {wywolujemy rekeurncyjnie metode, jako kat. nadrzedny bedzie teraz ostatnio znaleziony kat.}
           end;
         Wynik := FindNext(sr);{szukamy nastepnych}
       end;
     FindClose(sr);
   end;
end;




procedure TForm1.DriveComboBox1Change(Sender: TObject);
begin
TreeView1.Items.Clear;
 Licznik:=0;
  if DriveComboBox1.Drive='c' then
    begin
      ListujKatalogi(TreeView1.Items.AddChild(nil, '(Dysk ' + 'C' + ''),'C' + ':\');
    end
  else if DriveComboBox1.Drive='d' then
    begin
      ListujKatalogi(TreeView1.Items.AddChild(nil, '(Dysk ' + 'D' + ''),'D' + ':\');
    end
  else if DriveComboBox1.Drive='e' then
    begin
      ListujKatalogi(TreeView1.Items.AddChild(nil, '(Dysk ' + 'E' + ''),'E' + ':\');
    end;
Form1.TreeView1.Items.BeginUpdate;
Form1.TreeView1.Items.EndUpdate;
end;

procedure TForm1.TreeView1Click(Sender: TObject);
var Node,tmp:TTreeNode;  I:integer; b:boolean;    MousePos:TPoint;
begin
 {Wyznacza plik}
 Node := TreeView1.Selected;
 if TreeView1.Selected.Level=1 then    Form1.Label1.Caption:='Jestesmy w : '+Node.Text;


end;

end.

 

Zrobiłem pętle(w procedurze rekurencyjnej) ale to nie działa zbyt dobrze.Otóż niektórych katalogów mi nie ładuje do drzewa.Ma ktoś jakiś pomysł jak to zrobić żeby ładowało mi tylko do 3 rzędu (licząc od 0) i gdy posunie się o 1 dalej w tym rzędzie to ładuje np o 3 rzędy dalej? Oto przykładowy układ tych rzędów:

0 
1
 2
 2
1
 2
  3  <--Trzeci rząd
  3  <--Trzeci rząd
   4
1
 2
 2
  3  <--Trzeci rząd
  3  <--Trzeci rząd
   4
   4
 2 
1

Edytowane przez kamil274

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

×
×
  • Dodaj nową pozycję...