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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2010, 18:16   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Не заносятся пути для всех файлов после FindFirst

Добрый вечер! Делаю поиск по папке. Нужно ее содержимое представить в StringGrid'e: имя файла и путь к нему. Вот мой код:
Код:
procedure TForm1.ShellTreeView2Change(Sender: TObject; Node: TTreeNode);
var
 path_2: string;
 SR,SR_2: TSearchRec;
 FindRes,i,j:Integer;
 kol,kol_2: TStringList;
begin
 kol:=TStringList.Create;
 Form1.RzStatusPane36.Caption:=Form1.ShellTreeView2.Path + '\';
 Form1.ListBox3.Clear;
 FindRes:=FindFirst(Form1.RzStatusPane36.Caption + '*.pdf',faAnyFile,SR);
 while FindRes = 0 do
 begin
  if (SR.Name <> '.') or (SR.Name <> '..') then
  begin
   kol.Add(SR.Name);
   Form1.RzStatusPane38.Caption:=IntToStr(kol.Count);
   Form1.ListBox3.Items.Add(SR.Name);
   FindRes:=FindNext(SR);
   Form1.RzStringGrid19.RowCount:=Form1.ListBox3.Items.Count;
   for i:= 0 to Form1.ListBox3.Items.Count - 1 do
   Form1.RzStringGrid19.Cells[0,i]:=Copy(ListBox3.Items[i],1,Pos('.',ListBox3.Items[i])-1);
   for j:=0 to Form1.ListBox3.Items.Count - 1 do
   Form1.RzStringGrid19.Cells[1,j]:=Form1.RzStatusPane36.Caption + SR.Name;
  end;
 end;
 FindClose(SR);
end;
В StringGrid у меня выводятся сами файлы правильно в первую колонку, с этим проблем нет, а во второй колонке напротив каждого файла должен находится путь к файлу. В
Код:
Form1.RzStatusPane36.Caption
хранится путь к папке, в которой поиск осуществляется. А у меня во вторую колонку заносится путь только для первого файла. Подскажите как правильно надо записать?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 01.12.2010, 18:35   #2
oleg.v
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 80
По умолчанию

Пример кода : Ищем все каталоги выше, включая текущий
Код:
var
  searchResult : TSearchRec;

begin
  // Пробуем найти каталоги выше текущего каталога
  SetCurrentDir('..');

  if FindFirst('*', faDirectory, searchResult) = 0 then
  begin
    repeat
      // Показываем только каталоги
      if (searchResult.attr and faDirectory) = faDirectory
      then ShowMessage('Directory = '+searchResult.Name);
    until FindNext(searchResult) <> 0;

    // Должен освободить ресурсы, используемые этими успешными, поисками
    FindClose(searchResult);
  end;
end;
oleg.v вне форума Ответить с цитированием
Старый 01.12.2010, 18:39   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

И что? Мне не это нужно. Мой код прекрасно ищет все, мне нужны пути к найденным файлам получить. Мне и не надо по все подпапкам искать, код должен работать только для конкретной папки.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 01.12.2010, 22:07   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

бегло просмотрел (нет времени вникать в суть проблемы),

Код:
//заменить
  if (SR.Name <> '.') or (SR.Name <> '..') then
//на
  if (SR.Name <> '.') and (SR.Name <> '..') then
//и после команды:
  FindRes:=FindNext(SR);
//цикл
  for j:=0 to Form1.ListBox3.Items.Count - 1 do 
    Form1.RzStringGrid19.Cells[1,j]:=Form1.RzStatusPane36.Caption + SR.Name;
//будет работать уже с другим файлом (если вообще будет)
Кстати если if (SR.Name <> '.') or (SR.Name <> '..') then не выполится то похоже вообще зациклит, поскольку FindNext(SR) не будет отрабатывать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 01.12.2010 в 22:19.
Аватар вне форума Ответить с цитированием
Старый 02.12.2010, 03:19   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Кстати если if (SR.Name <> '.') or (SR.Name <> '..') then не выполится то похоже вообще зациклит, поскольку FindNext(SR) не будет отрабатывать
Ээээммм...не совсем понял. Можно подробнее пояснить? Вроде бы в других местах программы работает.
Вот, сделал так:
Код:
procedure TForm1.ShellTreeView2Change(Sender: TObject; Node: TTreeNode);
var
 path_2: string;
 SR,SR_2: TSearchRec;
 FindRes,i,j:Integer;
 kol,kol_2: TStringList;
begin
 kol:=TStringList.Create;
 Form1.RzStatusPane36.Caption:=Form1.ShellTreeView2.Path + '\';
 Form1.ListBox3.Clear;
 FindRes:=FindFirst(Form1.RzStatusPane36.Caption + '*.pdf',faAnyFile,SR);
 while FindRes = 0 do
 begin
  if (SR.Name <> '.') and (SR.Name <> '..') then
  begin
   kol.Add(SR.Name);
   Form1.RzStatusPane38.Caption:=IntToStr(kol.Count);
   Form1.ListBox3.Items.Add(SR.Name);
   FindRes:=FindNext(SR);
   Form1.RzStringGrid19.RowCount:=Form1.ListBox3.Items.Count;
   for i:= 0 to Form1.ListBox3.Items.Count - 1 do
   for j:=0 to Form1.ListBox3.Items.Count - 1 do
   Form1.RzStringGrid19.Cells[0,i]:=Copy(ListBox3.Items[i],1,Pos('.',ListBox3.Items[i])-1);
   Form1.RzStringGrid19.Cells[1,j]:=Form1.RzStatusPane36.Caption + SR.Name;
  end;
 end;
 FindClose(SR);
end;
Вроде работает как надо, но только для первого значения не выводится. Начинает выводит только со второго....а надо-то и с первого..
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 02.12.2010 в 03:26.
artemavd вне форума Ответить с цитированием
Старый 02.12.2010, 08:58   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
FindRes:=FindNext(SR);
А почему он в середине? Вроде как по логике в конце должон быть.
Цитата:
for i:= 0 to Form1.ListBox3.Items.Count - 1 do
for j:=0 to Form1.ListBox3.Items.Count - 1 do
А это зачем??
I'm learning to live...

Последний раз редактировалось Stilet; 02.12.2010 в 09:03.
Stilet вне форума Ответить с цитированием
Старый 02.12.2010, 09:37   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Виталий, виноват, это лишняя строка . Вот, подправил немного код:
Код:
procedure TForm1.ShellTreeView2Change(Sender: TObject; Node: TTreeNode);
var
 path_2: string;
 SR,SR_2: TSearchRec;
 FindRes,i,j:Integer;
 kol,kol_2: TStringList;
begin
 kol:=TStringList.Create;
 Form1.RzStatusPane36.Caption:=Form1.ShellTreeView2.Path + '\';
 Form1.ListBox3.Clear;
 FindRes:=FindFirst(Form1.RzStatusPane36.Caption + '*.pdf',faAnyFile,SR);
 while FindRes = 0 do
 begin
  if (SR.Name <> '.') and (SR.Name <> '..') then
  begin
   kol.Add(SR.Name);
   Form1.RzStatusPane38.Caption:=IntToStr(kol.Count);
   Form1.ListBox3.Items.Add(SR.Name);
   Form1.RzStringGrid19.RowCount:=Form1.ListBox3.Items.Count;
   FindRes:=FindNext(SR);
   for i:= 0 to Form1.ListBox3.Items.Count - 1 do
   Form1.RzStringGrid19.Cells[0,i]:=Copy(ListBox3.Items[i],1,Pos('.',ListBox3.Items[i])-1);
   Form1.RzStringGrid19.Cells[1,i]:=Form1.RzStatusPane36.Caption + SR.Name;
  end;
 end;
 FindClose(SR);
end;
по-прежнему в столбец [1,i] записи начинают выводится со второй строки....как бы это исправить?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 02.12.2010, 10:07   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ты помоему запутался в трех соснах.
Вот вариант попроще и работает как надо:
Код:
 while FindRes = 0 do
 begin
  if (SR.Name <> '.') and (SR.Name <> '..') then
  begin
   kol.Add(SR.Name);
   Caption:=IntToStr(kol.Count);
   Form1.ListBox3.Items.Add(SR.Name);
   Form1.RzStringGrid19.RowCount:=Form1.ListBox3.Items.Count;
   with  Form1.RzStringGrid19 do begin
    Cells[0,RowCount-1]:=Copy(SR.Name,1,Pos('.',SR.Name)-1);
    Cells[1,RowCount-1]:=Caption + SR.Name;
    RowCount:=RowCount+1;
   end;
  end;
  FindRes:=FindNext(SR);
 end;
 FindClose(SR);
А то что ты навертел - это перебор однозначно, масштабированию не подлежит.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.12.2010, 10:20   #9
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Эх, Виталий, ну что поделаешь, не иду я легкими путями, ты же знаешь . Спасибо, работает)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имена всех секций всех ini-файлов (DELPHI) Dj_SheLL Помощь студентам 7 10.10.2010 17:44
Для массива определить сумму всех элементов, стоящих после максимального HECTOR.A. Паскаль, Turbo Pascal, PascalABC.NET 4 17.06.2009 22:04
Текстовый редактор для открытия всех файлов в выделенных папках, подпапках. Alar Софт 5 20.01.2009 16:25
DOS команда для удаления всех файлов, имена которых содержат цифры Samopal Операционные системы общие вопросы 1 23.12.2008 21:12
Извлечение пути файлов dagarik Общие вопросы Delphi 7 01.11.2007 14:42