Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.11.2012, 23:04
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию Диалог выбора папки и добавление файлов ListBox

Собственно как реализовать помощью SelectDirectory?
Пытаюсь:
Код:
var
  Directory: string;
begin
  if SelectDirectory('Выбери папку:', '', Directory) then
    SendMessage(PlayList.Handle, LB_DIR, DDL_DIRECTORY, Integer(Directory));
Однако при выборе папки в плэйлист добавляется только имя, подскажите..
Ах да, еще желательно бы чтобы подпапки учитывались.
Ответить с цитированием
  #2  
Старый 20.11.2012, 02:45
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Функция SelectDirtectory возвращает тебе ТОЛЬКО имя выбранной пользователем папки. Далее делаем поиск всех файлов (если надо - рекурсивно по подпапкам) с помощью функций FindFirst/FindNext/FindClose. Примеров использования этих функций везде полно, в том числе в документации достаточно понятный пример.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
sariman (20.11.2012)
  #3  
Старый 20.11.2012, 17:55
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Вот нашел пример, но при выборе локального диска, выдает в листбоксе с двумя флэшами, например: D:\\Files\Music, а если просто папку с подпапками, то выводит нормально, подскажите в чем проблема?
Код:
procedure GetAllFiles(const Path: string; ListBox: TListBox );
var
  sRec: TSearchRec;
  isFound: Boolean;
begin
  isFound := FindFirst(Path + '\*.*', faAnyFile, sRec) = 0;
  while isFound do
  begin
    if (sRec.Name <> '.') and (sRec.Name <> '..') then
    begin
      if (sRec.Attr and faDirectory) = faDirectory then
        GetAllFiles(Path + '\' + sRec.Name, ListBox);
      if Pos('.mp3', Copy(sRec.Name, Length(sRec.Name)-3, 4)) = 1 then
        ListBox.Items.Add(Path + '\' + sRec.Name);
      if Pos('.AAC', Copy(sRec.Name, Length(sRec.Name)-3, 4)) = 1 then
        ListBox.Items.Add(Path + '\' + sRec.Name);
    end;
    Application.ProcessMessages;
    isFound := FindNext(sRec) = 0;
  end;
  FindClose(sRec);
end;
Ответить с цитированием
  #4  
Старый 20.11.2012, 17:59
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от sariman
Вот нашел пример, но при выборе локального диска, выдает в листбоксе с двумя флэшами, например: D:\\Files\Music, а если просто папку с подпапками, то выводит нормально, подскажите в чем проблема?
Вместо явного добавления слэша используй функцию IncludeTrailingPathDelimiter()
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
sariman (20.11.2012)
  #5  
Старый 20.11.2012, 18:16
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Что выполняет эта функция? Не понимаю что вы подразумеваете под "явным добавлением слэша", имеете ввиду вот это?
Код:
Path + '\' + sRec.Name
Ответить с цитированием
  #6  
Старый 20.11.2012, 18:19
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от sariman
Что выполняет эта функция? Не понимаю что вы подразумеваете под "явным добавлением слэша", имеете ввиду вот это?
Код:
Path + '\' + sRec.Name
Да, это явное добавления слэша. Вместо этого делай так:
Код:
IncludeTrailingPathDelimiter(Path) + sRec.Name
p.s. Естественно необязательно каждый раз, можно например сохранить в какую-то переменную (локальную в этой функции или в эту же переменную если убрать const)
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
sariman (20.11.2012)
  #7  
Старый 20.11.2012, 18:25
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Огромное спасибо!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter