Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2008, 15:18   #1
SANTA_KLAUD
Пользователь
 
Регистрация: 30.04.2008
Сообщений: 35
Восклицание Помогите поправить код

Имеем код
Код:
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, FileCtrl;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
ListBox1: TListBox;
DirectoryListBox1: TDirectoryListBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var sr:TSearchRec;
Result:word;
begin
Result := FindFirst ('*.doc',faAnyFile,sr);
ListBox1.Clear;
While result=0 do
Begin
Result:=FindNext (sr);
ListBox1.Items.add(sr.name);
End;
end;
end.
это поисковик файлов но он ищет только в дирктории выбранной в "DirectoryListBox" как можно сделать чтоб он искал не только в этой директории но и во вложиных в неё директориях.
SANTA_KLAUD вне форума Ответить с цитированием
Старый 29.05.2008, 15:28   #2
D-mon
Форумчанин
 
Регистрация: 22.06.2007
Сообщений: 414
По умолчанию

В поиск. Я это видел, сегодня, сам искал... 3 темы по этому поводу было найдено.
Нет невыполнимых задач, всё дело времени...
D-mon вне форума Ответить с цитированием
Старый 29.05.2008, 16:33   #3
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Вот так вот работает
Код:
procedure TForm1.FindFile(Dir: string);
var
  SR: TSearchRec;
  FindRes: Integer;
  Kol:integer;
begin
  FindRes := FindFirst(Dir + '*.*', faAnyFile, SR);
  while FindRes = 0 do
  begin
    if ((SR.Attr and faDirectory) = faDirectory) and
      ((SR.Name = '.') or (SR.Name = '..')) then
    begin
      FindRes := FindNext(SR);
      Continue;
    end;

    // если найден каталог, то
    if ((SR.Attr and faDirectory) = faDirectory) then
    begin
      // входим в процедуру поиска с параметрами текущего каталога +
      // каталог, что мы нашли
      FindFile(Dir + SR.Name + '\\');
      FindRes := FindNext(SR);
      // после осмотра вложенного каталога мы продолжаем поиск
      // в этом каталоге
      Continue; // продолжить цикл
    end;

    ListBox1.Items.Add(SR.Name);
    FindRes := FindNext(SR);
  end;
  FindClose(SR);
end;
FaTaL вне форума Ответить с цитированием
Старый 29.05.2008, 19:15   #4
SANTA_KLAUD
Пользователь
 
Регистрация: 30.04.2008
Сообщений: 35
По умолчанию

этот код ищет тока при условии что файлы лежат C:\MyPro\ а глубже в MyPro во вложеных каталогах не ищет

Последний раз редактировалось SANTA_KLAUD; 29.05.2008 в 19:31.
SANTA_KLAUD вне форума Ответить с цитированием
Старый 29.05.2008, 23:11   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Пройдись поиском, я давал процедуру готовую, называется FindIt введи это слово в поиск и найдешь
p.s. там только убрать ограничение, а то она только папки ищет, так нужно было
Кстати, та процедура что дал FaTaL по идее тоже должна работать, я не вникал, но она с рекурсией, значит ищет вложенные
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 29.05.2008 в 23:18.
mutabor вне форума Ответить с цитированием
Старый 30.05.2008, 09:01   #6
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Всё нормально код работает. Вызываешь значит криво. Вот например так надо:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FindFile(Dir: string);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.FindFile(Dir: string);
var
  SR: TSearchRec;
  FindRes: Integer;
  Kol:integer;
begin
  FindRes := FindFirst(Dir + '*.*', faAnyFile, SR);
  while FindRes = 0 do
  begin
    if ((SR.Attr and faDirectory) = faDirectory) and
      ((SR.Name = '.') or (SR.Name = '..')) then
    begin
      FindRes := FindNext(SR);
      Continue;
    end;

    // если найден каталог, то
    if ((SR.Attr and faDirectory) = faDirectory) then
    begin
      // входим в процедуру поиска с параметрами текущего каталога +
      // каталог, что мы нашли
      FindFile(Dir + SR.Name + '\\');
      FindRes := FindNext(SR);
      // после осмотра вложенного каталога мы продолжаем поиск
      // в этом каталоге
      Continue; // продолжить цикл
    end;

    ListBox1.Items.Add(SR.Name);
    FindRes := FindNext(SR);
  end;
  FindClose(SR);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FindFile('Путь к папке');
end;

end.
FaTaL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите поправить! koyot Работа с сетью в Delphi 4 13.02.2008 18:46