Автор: destroy 27:04:2008, 13:39
У меня в программе пользователь выберает директорию и все файла добавляются в Memo.
Хочу сделать сортировочку. Тоесть чтобы можно было сортировать по названию, расширению, размеру.
Подскажите как это сделать?
Автор: sax_ol 28:04:2008, 05:44
Написать соответствующий код, или нет?
Автор: destroy 28:04:2008, 10:39
Получаю список файлов так:
Код
procedure FindFilesByMask(List :tStrings; var DirCount :Integer; const DirName, Mask :String; SubDir: Boolean = True);
procedure ScanDirs(const DirName :String);
var
h :tHandle;
wfd :tWin32FindData;
sfo :string;
n :integer;
SearchRec2 :TSearchRec;
begin
Inc(DirCount);
h := Windows.FindFirstFile(PChar(DirName+Mask), wfd);
end;
try
if h <> INVALID_HANDLE_VALUE then begin
repeat
if (wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
List.Add(DirName+wfd.cFileName);
until not Windows.FindNextFile(h,wfd);
end;
case GetLastError of
ERROR_NO_MORE_FILES, // больше нет файлов и каталогов удовлетворяющих маске (но были)
ERROR_FILE_NOT_FOUND, // вообще нет файлов и каталогов удовлетворяющих маске
ERROR_SHARING_VIOLATION // возникает во время создания каталога (уже создан но еще недоступен)
:; // ничего не делаем, все Ok
else // все остальные ошибки
raise Exception.CreateFmt('Ошибка просмотра каталога "%s": %s',[DirName,SysErrorMessage(GetLastError)]);
end;
finally
if h <> INVALID_HANDLE_VALUE then Windows.FindClose(h);
end;
// Теперь рекрсивно просмотрим подкаталоги
if not SubDir then exit;
h := Windows.FindFirstFile(PChar(DirName+'*.*'), wfd);
try
if h <> INVALID_HANDLE_VALUE then begin
repeat
if ((wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0)
and (wfd.cFileName <> String('.'))
and (wfd.cFileName <> '..') then
ScanDirs(IncludeTrailingPathDelimiter(DirName+wfd.cFileName));
until not Windows.FindNextFile(h,wfd);
end;
case GetLastError of
ERROR_NO_MORE_FILES, // больше нет файлов и каталогов удовлетворяющих маске (но были)
ERROR_FILE_NOT_FOUND, // вообще нет файлов и каталогов удовлетворяющих маске
ERROR_SHARING_VIOLATION // возникает во время создания каталога (уже создан но еще недоступен)
:; // ничего не делаем, все Ok
else // все остальные ошибки
raise Exception.CreateFmt('Ошибка просмотра каталога "%s": %s',[DirName,SysErrorMessage(GetLastError)]);
end;
finally
if h <> INVALID_HANDLE_VALUE then Windows.FindClose(h);
end;
end;
begin // FindFilesByMask
ScanDirs(IncludeTrailingPathDelimiter(DirName));
end;
Можно было бы конечно записать список файлов в массив и отсортировать.
Просто интересно, можно ли сделать это по другому.
Автор: sax_ol 28:04:2008, 11:28
Закидывайте данные в TStringList, его сорттируйте, а на выходе Assign в destination. Так вот первое что пришло.
Автор: destroy 28:04:2008, 14:00
sax_ol, я так тоже делал.
Но все ни так просто у меня.
Код который я привел не совсем полный так сказать...
Принцип такой:
Если найдена папка, название ее добавляется в memo
И после того как все имена файлов, которые находятся в этой папке добавлены в memo,
добавляется опять строчка с название этой папки.
Например:
video
c:\video\1.avi
c:\video\2.avi
c:\video\3.avi
video
music
c:\music\1.mp3
c:\music\2.mp3
...
А когда я закидываю в TStringList
у меня есессно все сбивается.
Думал может есть какая ф-я для сортировки при поиске файлов...
Автор: destroy 28:04:2008, 14:38
Цитата
Почему m позже v ?
Да это я так для примера привел.
Автор: sax_ol 28:04:2008, 15:05
Вы для примера (неправильного), условия меняете от топика к топику, а люди при этом думают, стараются помочь ... оч. некрасиво.
Автор: destroy 28:04:2008, 15:13
да я просто пример привел как я получаю список файлов.
Тоесть в начале название папки потом файлы потом опять название папки.
и вопрос просто как отсортировать все это и чтобы сохранилась структура.
Это Вы что то путаете.
Автор: sax_ol 28:04:2008, 15:41
Цитата(destroy @ 28:04:2008 - 17:13)

Это Вы что то путаете.
Я ничего не путаю, я смотрю на первый пост и сравниваю с последующими, и вижу что условия меняются постоянно, а это не хорошо.
Надо вам учиться правильно формулировать вопросы:
http://www.citforum.ru/howto/smart-questions-ru.shtml
Автор: destroy 28:04:2008, 16:07
Вопрос закрыт. Сделал.
Цитата
я смотрю на первый пост и сравниваю с последующими
читать надо, а не смотреть.
В 5 сообщение я расписал подробно что хотел.
Автор: sax_ol 28:04:2008, 16:40
Нафик читать всякую ерунду.