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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 08.10.2007, 09:49   #1
Xandr
Пользователь
 
Регистрация: 12.07.2007
Сообщений: 60
По умолчанию Имена каталогов и подкаталогов

Подскажите. Выбираю каталог с помощь ShellComboBox1. Мне нужно найти по порядку имена всех подкаталогов причем и подкаталогов в подкаталогах, т.е. любой глубины. Спасибо.
Xandr вне форума
Старый 08.10.2007, 10:00   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Рекурсивный поиск. в Delphi World порой
I'm learning to live...
Stilet вне форума
Старый 08.10.2007, 13:27   #3
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

вот кусок функции такого поиска, все лишнее я повыкидывал (она у меня только файлы искала), но не проверял, по идее должна работать
параметры:
path - путь со слешем
ext - '*.*' (поиск любых файлов)
aListBox - листбокс в к-рый записывать, можешь заменить на что-то другое
Код:
//поиск включая подпапки
procedure FindIt(path, ext: string; aListBox: TListBox);
var
  SR: TSearchRec;
begin
if FindFirst(Path+Ext, faAnyFile, SR) = 0 then
  begin
    repeat
    if (SR.Attr = faDirectory) then
      if (SR.Name <> '.') and (SR.Name <> '..') then
        begin
        aListBox.Items.Add(SR.Name);
        FindIt(Path+sr.Name+'\',ext,aListBox);
        end;
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
end;
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 вне форума
Старый 08.10.2007, 21:22   #4
Xandr
Пользователь
 
Регистрация: 12.07.2007
Сообщений: 60
По умолчанию

Вобщем так, мне нужно чтобы все найденные имена подкаталогов в выбранном каталоге выводились к примеру в листбокс. Недаходит до меня. Напишите пример плиз.

Последний раз редактировалось Xandr; 08.10.2007 в 21:51.
Xandr вне форума
Старый 09.10.2007, 13:33   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Вобщем так, мне нужно чтобы все найденные имена подкаталогов в выбранном каталоге выводились к примеру в листбокс. Недаходит до меня. Напишите пример плиз.
а я тебе что дал

допустим у тебя есть путь к директории, неважно откуда ты его получил (тебе нужно получить из ShellComboBox1), простеший пример ExtractFilePath(Application.ExeName ), эта функция вернет путь к директории программы, дальше нужен параметр Ext, пишем '*.*' (так и пишем все пять символов), далее нужен листбокс, допустим он имеет имя ListBox1. Получаем такой вызов процедуры:

FindIt(ExtractFilePath(Application. ExeName),'*.*',ListBox1);

После ее выполнения, в листбоксе будет список всех найденных директорий, включая вложенные.

прим. Описание процедуры должно быть выше места где ее вызываешь.
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 вне форума
Старый 09.10.2007, 13:43   #6
Xandr
Пользователь
 
Регистрация: 12.07.2007
Сообщений: 60
По умолчанию

Спасибо за полное объяснение.
Цитата:
прим. Описание процедуры должно быть выше места где ее вызываешь.
я не настолько... просто сутки не спавши, доходило туго.
Еще раз спасибо.
Xandr вне форума
Старый 09.10.2007, 15:05   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Вот более продвинутая версия этой процедуры, пока проверял немного усовершенствовал, можно добавить дополнительный параметр - spaces, с ним в листбоксе можно будет визуально увидеть степень вложенности.
Параметр level вручную указывать не нужно.
Код:
procedure FindIt(path, ext: string; aListBox: TListBox;
  spaces: boolean = false; level: integer = 0);
var
  SR: TSearchRec;
  s: string;
  i: integer;
begin
if FindFirst(Path+Ext, faAnyFile, SR) = 0 then
  begin
    repeat
    if (SR.Attr = faDirectory) then
      if (SR.Name <> '.') and (SR.Name <> '..') then
        begin
        s:='';
        for i:=0 to level-1 do
          s:=s+'    ';
        aListBox.Items.Add(s+SR.Name);
        Inc(level);
        if spaces then
          FindIt(Path+sr.Name+'\',ext,aListBox,true,level)
        else
          FindIt(Path+sr.Name+'\',ext,aListBox);
        Dec(level);
        end;
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
end;
примеры вызова
FindIt(ExtractFilePath(Application. ExeName),'*.*', ListBox1);
FindIt(ExtractFilePath(Application. ExeName),'*.*', ListBox1,true);
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 вне форума
Старый 09.10.2007, 16:21   #8
Xandr
Пользователь
 
Регистрация: 12.07.2007
Сообщений: 60
По умолчанию

mutabor, что то она не так работает, я выбираю например папку D:\Picture, а в листбокс заполняется и D:\, а надо только Picture
Xandr вне форума
Старый 09.10.2007, 19:27   #9
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Путь надо передавать со слешем на конце
'D:\Picture\'
тогда найдет все вложенные в Picture папки, но не саму Picture.
Picture (а также все что есть на диске) найдет если передать 'D:\'

Только что проверил, все нормально работает.

p.s. добавь в самое начало процедуры после первого begin эту проверку
Код:
if Path <> '' then
  if Path[Length(Path)] <> '\' then Path:=Path+'\';
Да, и листбокс не забывай очищать перед новым поиском:
ListBox1.Clear;
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; 09.10.2007 в 19:52.
mutabor вне форума
Старый 09.10.2007, 21:00   #10
Xandr
Пользователь
 
Регистрация: 12.07.2007
Сообщений: 60
По умолчанию

Спасибо огромное, очень помог.
Xandr вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите как сделать отображение каталогов??? SANTA_KLAUD Общие вопросы Delphi 6 30.04.2008 23:47
список каталогов VVVadim Общие вопросы Delphi 11 03.04.2008 13:00
Дерево каталогов в табличной форме Македонский Общие вопросы Delphi 11 30.08.2007 16:47
Вывод подкаталогов! werser Помощь студентам 1 18.06.2007 20:23
древо каталогов Dunpeal Компоненты Delphi 6 21.11.2006 06:22