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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2013, 13:32   #1
Алена-X
 
Регистрация: 16.02.2013
Сообщений: 4
По умолчанию Поиск файлов в Delphi

Никто не мог бы мне подсказать, как написать программу на Delphi, которая ищет файлы, и чтобы с ними можно было что-либо делать? Я поискала решение задачи в Сети, но все рецепты там, во-первых, какие-то мутные, во-вторых, не работают.



Заранее благодарю.
Алена-X вне форума Ответить с цитированием
Старый 16.02.2013, 19:34   #2
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
По умолчанию

1)Создаешь новый проект.
2)Кидаешь на форму Listbox1 и Button1
3)Двойной клик по Button1
4)Копируешь исходник ниже
Код:
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption:='Поиск';
  BorderStyle:=bsSizeable;
  Position:=poScreenCenter;
  Button1.Caption:='Каталог';
  Width:=470;
  Height:=300;
  ListBox1.Width:=457;
  ListBox1.Height:=233;
  ListBox1.Top:=0;
  ListBox1.Left:=0;
  Button1.Width:=75;
  Button1.Height:=25;
  Button1.Top:=240;
  Button1.Left:=8;
end;

procedure FindFile(path : PChar);
type
 PathBuf = array[0..MAX_PATH] of char;
var
  Buf : PathBuf;
    H : THandle;
    R : TWIN32FindData;
    I : integer;
begin
  Application.ProcessMessages;
  lstrCpy(Buf, #0);
  LStrCat(Buf,Path);
  LStrCat(Buf,#42#46#42);
  H:=FindFirstFile(Buf,R);
  while H<>0 do
    begin
      if  ((R.dwFileAttributes
      and   FILE_ATTRIBUTE_DIRECTORY)=FILE_ATTRIBUTE_DIRECTORY)
      and ((R.cFileName[0]=#46)
      or   (R.cFileName[1]=#46)) then
        begin
          if not FindNextFile(H,R) then break;
          Continue;
        end;
      if ((R.dwFileAttributes
      and  FILE_ATTRIBUTE_DIRECTORY)=FILE_ATTRIBUTE_DIRECTORY) then
        begin
          LstrCpy(Buf,#0);
          LStrCat(Buf,Path);
          LStrCat(Buf,R.cFileName);
          LStrCat(Buf,#92);
          FindFile(Buf);
          if not FindNextFile(H,R) then break;
          Continue;
        end;
     i:=0;
     while true do
       if R.cFileName[i]=#0
       then break
       else inc(i);
     LstrCpy(Buf,#0);
     LStrCat(Buf,R.cFileName);
     Form1.ListBox1.Items.Add(String(Path)+R.cFileName);
     Form1.Refresh;
     if not FindNextFile(H,R) then break;
    end;
  Windows.FindClose(H);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  st : string;
begin
  Button1.Enabled:=false;
  if SelectDirectory('Выберите каталог для поиска','',st)
  then FindFile(PChar(st));
  Button1.Enabled:=true;
end;

end.
5)Вставляешь его с заменой вместо своей заготовки нового приложения
6)Жмешь F9
7)Радуешься

А если серьезно то найти инфу о поиске файлов совсем не трудно.
execom вне форума Ответить с цитированием
Старый 16.02.2013, 20:03   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Там, где двойной клик по кнопке, надо ещё двойной клик по форме (для формкреэйт)
phomm вне форума Ответить с цитированием
Старый 16.02.2013, 22:40   #4
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Там, где двойной клик по кнопке, надо ещё двойной клик по форме (для формкреэйт)
Черт возьми.. Это ты самую суть ухватил)
execom вне форума Ответить с цитированием
Старый 18.02.2013, 01:52   #5
Алена-X
 
Регистрация: 16.02.2013
Сообщений: 4
По умолчанию

Спасибо за код, обязательно опробую, только вам не кажется, что процедуру FindFile(path : PChar) нужно сперва объявить в разделе public или private?

И еще, нельзя ли все прокомментрировать, чтобы было понятно что тут за что отвечает? И - если уже совсем шиковать - нельзя ли код покороче?
Алена-X вне форума Ответить с цитированием
Старый 18.02.2013, 02:52   #6
Volkogriz
Форумчанин
 
Аватар для Volkogriz
 
Регистрация: 11.10.2007
Сообщений: 384
По умолчанию

Если процедура стоит выше чем процедура которая вызывает подпрограммку и не имеет компонентов формы и больше не где не используется то её и не надо больше не где видеть и ей тоже не надо не кого видеть
то есть не обязательно её объявлять всем глобально в разделе public нет смысла
как то так
Не количеством плюсов измеряется репутация человека...!

Последний раз редактировалось Volkogriz; 18.02.2013 в 03:06.
Volkogriz вне форума Ответить с цитированием
Старый 19.02.2013, 01:05   #7
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

хах, а зачем по форме щелкать? Тут же в основном заданы координаты и имена, и без этого заработает
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 19.02.2013, 01:14   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Алексей_2012 Посмотреть сообщение
хах, а зачем по форме щелкать? Тут же в основном заданы координаты и имена, и без этого заработает
двойной клик по форме в дизайнере переносит нас к событию OnCreate.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.02.2013, 05:38   #9
Алена-X
 
Регистрация: 16.02.2013
Сообщений: 4
По умолчанию

Цитата:
Сообщение от execom Посмотреть сообщение
1)Создаешь новый проект.
2)Кидаешь на форму Listbox1 и Button1
3)Двойной клик по Button1
4)Копируешь исходник ниже
Код:
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption:='Поиск';
  BorderStyle:=bsSizeable;
  Position:=poScreenCenter;
  Button1.Caption:='Каталог';
  Width:=470;
  Height:=300;
  ListBox1.Width:=457;
  ListBox1.Height:=233;
  ListBox1.Top:=0;
  ListBox1.Left:=0;
  Button1.Width:=75;
  Button1.Height:=25;
  Button1.Top:=240;
  Button1.Left:=8;
end;

procedure FindFile(path : PChar);
type
 PathBuf = array[0..MAX_PATH] of char;
var
  Buf : PathBuf;
    H : THandle;
    R : TWIN32FindData;
    I : integer;
begin
  Application.ProcessMessages;
  lstrCpy(Buf, #0);
  LStrCat(Buf,Path);
  LStrCat(Buf,#42#46#42);
  H:=FindFirstFile(Buf,R);
  while H<>0 do
    begin
      if  ((R.dwFileAttributes
      and   FILE_ATTRIBUTE_DIRECTORY)=FILE_ATTRIBUTE_DIRECTORY)
      and ((R.cFileName[0]=#46)
      or   (R.cFileName[1]=#46)) then
        begin
          if not FindNextFile(H,R) then break;
          Continue;
        end;
      if ((R.dwFileAttributes
      and  FILE_ATTRIBUTE_DIRECTORY)=FILE_ATTRIBUTE_DIRECTORY) then
        begin
          LstrCpy(Buf,#0);
          LStrCat(Buf,Path);
          LStrCat(Buf,R.cFileName);
          LStrCat(Buf,#92);
          FindFile(Buf);
          if not FindNextFile(H,R) then break;
          Continue;
        end;
     i:=0;
     while true do
       if R.cFileName[i]=#0
       then break
       else inc(i);
     LstrCpy(Buf,#0);
     LStrCat(Buf,R.cFileName);
     Form1.ListBox1.Items.Add(String(Path)+R.cFileName);
     Form1.Refresh;
     if not FindNextFile(H,R) then break;
    end;
  Windows.FindClose(H);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  st : string;
begin
  Button1.Enabled:=false;
  if SelectDirectory('Выберите каталог для поиска','',st)
  then FindFile(PChar(st));
  Button1.Enabled:=true;
end;

end.
5)Вставляешь его с заменой вместо своей заготовки нового приложения
6)Жмешь F9
7)Радуешься

А если серьезно то найти инфу о поиске файлов совсем не трудно.
Проверила, не работает. Отладчик ругается вот этот модуль в списке uses: FileCtr1, и вот на эту строчку:
Код:
if SelectDirectory('Выберите каталог для поиска', '', ST) then
Говорит, нету такой команды: SelectDirectory
Алена-X вне форума Ответить с цитированием
Старый 19.02.2013, 05:39   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Проверила, не работает. Отладчик ругается вот этот модуль в списке uses: FileCtr1, и вот на эту строчку:
в коде FileCtrl, буква а не цифра.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск файлов в Delphi Николай ПН Помощь студентам 5 17.12.2010 19:15
Поиск файлов в delphi Даниил_глазко Общие вопросы Delphi 2 17.12.2010 19:02
Поиск файлов в delphi _PROGRAMM_ Помощь студентам 4 21.09.2010 16:31
Поиск файлов в DirectoryListBox Delphi 7 Dalagardi Помощь студентам 0 24.03.2010 09:29
Поиск файлов (Delphi) VadEr Помощь студентам 4 05.12.2009 21:08