X
ďťż

Ładny brzuch

Zacznę od tego, że poruszałem ten temat kilka dni temu.
Niestety skończyło się na czysto teoretycznych rozważaniach :mellow:
Mam inna propozycję.
Jeżeli ktoś czuje się na siłach, to niech napisze jak poprawnie powinno wyglądać to wyszukiwanie. Przypomnę, że chodzi o szukanie plików w określonym katalogu ale wraz z podkatalogami.
Poniżej kod, który znajduje pliki na dysku C z rozszerzeniem .txt
Mi chodzi o to, żeby wprowadzić szukaną nazwę z pola edit1 i o określenie w kodzie katalogu, który ma zostać przeszukany (linijka na dole)
Kod w tej postaci się kompiluje, ale brak efektów działania :(
unit przyklad_szukania; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ListBox1: TListBox; Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure searchFiles(dir, mask: string; recursive: boolean; Attr: integer; result: TStrings); var SR: TSearchRec; begin if dir[Length(dir)] <> '\' then dir:= dir + '\'; if recursive then begin if FindFirst(dir + '*', faDirectory, SR) = 0 then if (SR.Name <> '.') and (SR.Name <> '..') and (faDirectory and SR.Attr > 0) then searchFiles(dir + SR.Name, mask, recursive, Attr, result); while FindNext(SR) = 0 do if (SR.Name <> '.') and (SR.Name <> '..') and (faDirectory and SR.Attr > 0) then searchFiles(dir + SR.Name, mask, recursive, Attr, result); end; if FindFirst(dir + mask, Attr, SR) = 0 then if (SR.Name <> '.') and (SR.Name <> '..') and (SR.Attr and Attr > 0)then result.Add(dir + SR.Name); while FindNext(SR) = 0 do if (SR.Name <> '.') and (SR.Name <> '..') then result.Add(dir + SR.Name); FindClose(SR); end; procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.clear; //searchFiles('C:\\','*.txt', true, faAnyFile, ListBox1.Items); searchfiles(ExtractFilePath(Application.exename) + '\przykladowy\', edit1.text + '*.txt', true, faAnyFile, ListBox1.Items); end; end.



Może Ci się przyda :rolleyes:
Daj na formę ListBox-aprocedure szukaj(path:string); var sr:tsearchrec; f:integer; begin f:=findfirst(path+'*.*',faanyfile,sr); while f=0 do begin if (sr.Name<>'.')and(sr.Name<>'..') then if sr.Attr and fadirectory>0 then szukaj(path+sr.Name+'\') else if lowercase(ExtractFileExt(sr.Name))='.txt' then form1.listbox1.Items.Add(sr.Name); f:=findnext(sr); end; Application.ProcessMessages; end; procedure TForm1.Button1Click(Sender: TObject); begin szukaj('c:\'); end;
Użytkownik Cyrkiel edytował ten post 22 maj 2005, 12:55
Zerknijmy na tą procedurę szukającą co napisałeś:

procedure searchFiles(dir, mask: string; recursive: boolean; Attr: integer; result: TStrings);

Wyniki wyszukiwania są dodawane do parametru result (w dodatku ten parametr nie jest przekazywany przez zmienna tylko przez referencję). No dobra dodaje te wyniki do tej zmiennej i co dalej? Nic.

Napisałem kod, wyszukujący pliki *.txt w podkatalogach, sprawdziłem milion razy, zamin go tu dałem - działa. Więc tak (dla przykładu):

1. Na forme dajemy Button i ListBox.
2. W sekcji private deklarujemy procedurę:
procedure Szukaj(katalog: string);
3. Teraz ja uzupełnijmy. Gdzieś w kodzie:
procedure TForm1.Szukaj(katalog: string); const ext = '*.*'; //tymczasowo wszystkie pliki, potem przesitkujemy aby były tylko TXT var SR: TSearchRec; //wiadomo... begin {na wszelki wypadek sprawdzamy czy nazwa katalogu konczy się znakiem '\'} if katalog[length(katalog)] <> '\' then   katalog := katalog + '\'; if FindFirst(katalog + ext, faAnyFile, SR) <> 0 then   EXIT; //jeśli nic nie znajdujemy do wychodzimy z procedury while FindNext(SR) = 0 do begin   if ((sr.Attr and faDirectory) <> 0) and ( SR.Name <> '..') then     szukaj(katalog + SR.Name + '\') //jesli plik JEST katalogiem to do niego wchodzimy i szukamy w nim   else //jesli nie   begin     if (SR.Name <> '..') and (Sr.Name <> '.') and (lowercase(ExtractFileExt(SR.Name)) = '.txt') then //jesli rozszerzenie to TXT     ListBox1.Items.Add(katalog + SR.Name); //dodajemy plik do ListBox   end;  Application.ProcessMessages; end; end;
4. W zdarzeniu onclick dla Buttona:
Szukaj('C:\'); //zostana znalezione wszytski pliki TXT na C: i w podfolderach też

I to wszystko.

//ehh Cyrkiel mnie uprzedził...
Użytkownik programista1101 edytował ten post 22 maj 2005, 12:27
To co napisał programista1101 oczywiście działa, ale nie o to chodziło.
Dokładnie to samo realizuje kod jaki przedstawiłem.
Ja potrzebuję wprowadzić nazwę szukanego pliku z pola edit, a szukać w określonym przezemnie katalogu, czyli program musi zrealizować coś podobnego to takiego polecenia:
searchfiles(ExtractFilePath(Application.exename) + '\przykladowy\', edit1.text + '*.txt', true, faAnyFile, ListBox1.Items);
czyli szukać w katalogu przykladowy(i podkatalogach), który znajduje się w tym samym katalogu co program, nazwy podanej w polu edit.




To co napisał programista1101 oczywiście działa, ale nie o to chodziło.
Dokładnie to samo realizuje kod jaki przedstawiłem.
Ja potrzebuję wprowadzić nazwę szukanego pliku z pola edit, a szukać w określonym przezemnie katalogu, czyli program musi zrealizować coś podobnego to takiego polecenia:
searchfiles(ExtractFilePath(Application.exename) + '\przykladowy\', edit1.text + '*.txt', true, faAnyFile, ListBox1.Items);
czyli szukać w katalogu przykladowy(i podkatalogach), który znajduje się w tym samym katalogu co program, nazwy podanej w polu edit.

Właśnie o tym mówię..
Gdybym wiedział jak zapisać ścieżkę do szukanego pliku, to bym nie pytał...

No więc powinno być tak.

Założenia:
- użytkownik wpisuje nazwę pliku (z poprzednich tematów wiem, że bez rozszerzenia)
- program wyszukuje ten plik, lub odpowiadający mu wzorzec w katalogu i podkatalogach - np. katalogu aplikacji;

Tak więc wszystko powinno być tak:

1. Na forme dajemy Button i ListBox i Edit.
2. W sekcji private deklarujemy procedurę:
procedure Szukaj(katalog, plik: string);
3. Teraz ja uzupełnijmy. Gdzieś w kodzie:
procedure TForm1.Szukaj(katalog, plik: string); const ext = '*.*'; var SR: TSearchRec; fname: string; begin if katalog[length(katalog)] <> '\' then   katalog := katalog + '\'; if FindFirst(katalog + ext, faAnyFile, SR) <> 0 then   EXIT; while FindNext(SR) = 0 do begin   if ((sr.Attr and faDirectory) <> 0) and ( SR.Name <> '..') then     szukaj(katalog + SR.Name + '\', plik)   else   begin     if (SR.Name <> '..') and (Sr.Name <> '.') and     (lowercase(ExtractFileExt(SR.Name)) = '.txt') and     (lowercase(plik + '.txt') = lowercase(extractfilename(SR.Name))) then     ListBox1.Items.Add(katalog + SR.Name);   end;  Application.ProcessMessages; //nieobowiazkowe, jesli jest mało plików end; end;
W zasadzie dla zasad programowania parametr 'plik' powinien być przekazywany przez stałą - no ale niech bedzie tak ;).
4. W zdarzeniu on Click komponentu button mozemy napisać tak:

Szukaj('C:\', 'resume');
czyli zostanie znalziony plik resume.txt, znajdujacy sie w jakimkolwiek podfolderze znajdujacym sie na C jak rózniez w samym folderze C:\. Wielkość liter jest bez znaczenia.
Użytkownik programista1101 edytował ten post 22 maj 2005, 13:10

Założenia:
- użytkownik wpisuje nazwę pliku (z poprzednich tematów wiem, że bez rozszerzenia)
- program wyszukuje ten plik, lub odpowiadający mu wzorzec w katalogu i podkatalogach - np. katalogu aplikacji;


Dokładnie tak.

Szukaj('C:\', 'resume');

Nie tak :( Zdefiniowałeś, że program ma szukać pliku resume gdziekolwiek na dysku C. A gdzie możliwość (a wręcz konieczność!) podania nazwy w polu edit?
To użytkownik ma podać, jakiego pliku szuka (lub jego części *plik*) i nie ma w tym celu przetrzepać całego swojego dysku, tylko katalog dostarczony wraz z programem, dlatego konieczne jest zdefiniowanie właśnie tego katalogu w kodzie.

No ale chyba nie problem napisac:

Szukaj(ExtractFilePath(Application.Exename) + 'zespoly\', Edit1.text); ?


No ale chyba nie problem napisac:

Szukaj(ExtractFilePath(Application.Exename) + 'zespoly\', Edit1.text); ?

Problem rozwiązałem (metodą prób i błędów)
Oto jak powinien wygladać kod, który robi to o co mi chodziło:

procedure searchFiles(dir, mask: string; recursive: boolean; Attr: integer; result: TStrings); var  SR: TSearchRec; begin  if dir[Length(dir)] <> '\' then    dir:= dir + '\';  if recursive then  begin    if FindFirst(dir + '*', faDirectory, SR) = 0 then      if (SR.Name <> '.') and (SR.Name <> '..') and (faDirectory and SR.Attr > 0)  then        searchFiles(dir + SR.Name, mask, recursive, Attr, result);    while FindNext(SR) = 0 do      if (SR.Name <> '.') and (SR.Name <> '..') and (faDirectory and SR.Attr > 0) then        searchFiles(dir + SR.Name, mask, recursive, Attr, result);  end;  if FindFirst(dir + mask, Attr, SR) = 0 then    if (SR.Name <> '.') and (SR.Name <> '..') and (SR.Attr and Attr > 0)then      result.Add(SR.Name); // bez 'dir + ' bo nie potrzeba mi pełnej ścieżki  while FindNext(SR) = 0 do    if (SR.Name <> '.') and (SR.Name <> '..') then      result.Add(SR.Name); // bez 'dir + ' bo nie potrzeba mi pełnej ścieżki  FindClose(SR); end; procedure TForm1.Button1Click(Sender: TObject); begin   ListBox1.clear; searchfiles(ExtractFilePath(Application.exename) + 'katalog\', edit1.text + '*.txt', true, faAnyFile, ListBox1.Items); end;

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •  

    Drogi uzytkowniku!

    W trosce o komfort korzystania z naszego serwisu chcemy dostarczac Ci coraz lepsze uslugi. By moc to robic prosimy, abys wyrazil zgode na dopasowanie tresci marketingowych do Twoich zachowan w serwisie. Zgoda ta pozwoli nam czesciowo finansowac rozwoj swiadczonych uslug.

    Pamietaj, ze dbamy o Twoja prywatnosc. Nie zwiekszamy zakresu naszych uprawnien bez Twojej zgody. Zadbamy rowniez o bezpieczenstwo Twoich danych. Wyrazona zgode mozesz cofnac w kazdej chwili.

     Tak, zgadzam sie na nadanie mi "cookie" i korzystanie z danych przez Administratora Serwisu i jego partnerow w celu dopasowania tresci do moich potrzeb. Przeczytalem(am) Polityke prywatnosci. Rozumiem ja i akceptuje.

     Tak, zgadzam sie na przetwarzanie moich danych osobowych przez Administratora Serwisu i jego partnerow w celu personalizowania wyswietlanych mi reklam i dostosowania do mnie prezentowanych tresci marketingowych. Przeczytalem(am) Polityke prywatnosci. Rozumiem ja i akceptuje.

    Wyrazenie powyzszych zgod jest dobrowolne i mozesz je w dowolnym momencie wycofac poprzez opcje: "Twoje zgody", dostepnej w prawym, dolnym rogu strony lub poprzez usuniecie "cookies" w swojej przegladarce dla powyzej strony, z tym, ze wycofanie zgody nie bedzie mialo wplywu na zgodnosc z prawem przetwarzania na podstawie zgody, przed jej wycofaniem.