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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.06.2014, 22:31
HTTqp HTTqp вне форума
Новичок
 
Регистрация: 16.04.2014
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: -25
Восклицание Сортировка папки\файлы

Подскажите как отсортировать по методу сначала папки потом файлы. Код написал а сортировку не получается осуществить, читал пробывал что в инете есть но увы. Код расписан так что все вроде понятно

Код:
procedure TForm1.FormCreate(Sender: TObject);
var
WFD:WIN32_Find_Data;
HFile:THandle;
Attr,Path:String;
begin
 ListView1.Items.BeginUpdate;{Начинаем прорисовку}
 ListView1.Items.Clear;
 Path:=IncludeTrailingPathDelimiter('C:\Windows');{Добавляем '\' при его отсутствиии}
 HFile:=FindFirstFile(PChar(Path+'*.*'),WFD);{Ищем файлы только в указанном каталоге}
 if HFile<>INVALID_HANDLE_VALUE then {Проверяем отсутствие ошиьок}
  begin
   repeat
   if (WFD.dwFileAttributes and faHidden)<>2 then{Условие показыать\не показывать скрытые файлы}
    if StrPas(WFD.cFileName)<>'.' then
     with ListView1.Items.Add do
      begin
       if (WFD.dwFileAttributes and faDirectory)<>faDirectory then
        begin
         Caption:=WFD.cFileName;
         SubItems.Add(ExtractFileExt(WFD.cFileName));{Выделяем расширение}
         SubItems.Add('размер');{Размер файла}
        end else
         begin
          Caption:=(WFD.cFileName);{Имя папки}
          SubItems.Add('[Папка]');{Указываем что это папка}
          SubItems.Add('размер');
         end;
        SubItems.Add('Дата');{Время создания папки\файла}
        Attr:='----';
        if (WFD.dwFileAttributes and faArchive)<>0 then Attr[1]:='a';{Архивный}
        if (WFD.dwFileAttributes and faReadOnly)<>0 then Attr[2]:='r';{Только чтение}
        if (WFD.dwFileAttributes and faHidden)<>0 then Attr[3]:='h';{Скрытый}
        if (WFD.dwFileAttributes and faSysFile)<>0 then Attr[4]:='s';{Системный}
        SubItems.Add(Attr);{Атрибуты файла\папки}
      end;
      application.ProcessMessages;  { Чтобы форма не сильно тормозила во время поиска}
   until FindNextFile(HFile,WFD)<>True;
   Winapi.Windows.FindClose(HFile);
  end;
  ListView1.Items.EndUpdate;{Заканчиваем прорисовку файлов}
end;
Ответить с цитированием
  #2  
Старый 04.06.2014, 03:35
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Можно проще
Ответить с цитированием
  #3  
Старый 04.06.2014, 15:43
HTTqp HTTqp вне форума
Новичок
 
Регистрация: 16.04.2014
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: -25
По умолчанию

Цитата:
Сообщение от Alegun
Можно проще
Нет этот вариант не подходит. Хотелось бы без использования лишних компонентов обойтись.
Ответить с цитированием
  #4  
Старый 04.06.2014, 15:51
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А вы ещё не игрались со свойством SortType у ListView? По умолчанию оно задано как stNone
Ответить с цитированием
  #5  
Старый 04.06.2014, 16:57
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от HTTqp
Хотелось бы без использования лишних компонентов обойтись.
А Shell Controls -- разве не стандартные компоненты?
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #6  
Старый 04.06.2014, 17:07
HTTqp HTTqp вне форума
Новичок
 
Регистрация: 16.04.2014
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: -25
По умолчанию

Цитата:
Сообщение от Alegun
А вы ещё не игрались со свойством SortType у ListView? По умолчанию оно задано как stNone
Пробывал результатов не дало.
Ответить с цитированием
  #7  
Старый 04.06.2014, 17:08
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Кстати вот этой поверки будет мало
Код:
if StrPas(WFD.cFileName)<>'.' then
поскольку вторым элементом каталога идет '..'

А по сабжу - написать свою процедуру сравнения элементов
Например такую

Код:
procedure TForm1.ListView_Compare(Sender: TObject; Item1, Item2: TListItem;
  Data: Integer; var Compare: Integer);
begin
  if (Item1.Subitems[0] = '[Папка]' )and(Item2.Subitems[0] <> '[Папка]') then     Compare:= 1 else
  if (Item1.Subitems[0] <> '[Папка]' )and(Item2.Subitems[0] = '[Папка]') then     Compare:= -1 else
    Compare:=CompareText(Item1.Caption,Item2.Caption);
end;
И присвоить её
Код:
ListView1.OnCompare     :=  ListView_Compare;
Ответить с цитированием
  #8  
Старый 04.06.2014, 17:23
HTTqp HTTqp вне форума
Новичок
 
Регистрация: 16.04.2014
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: -25
По умолчанию

Пишут можно через TStringList сделать а как не написано. Может тут кто знает?
Ответить с цитированием
  #9  
Старый 04.06.2014, 18:00
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от HTTqp
Пишут можно через TStringList сделать...
В него можно сначало имена файлов/папок с путями вогнать, отсортировать по критерию методом этого класса и обратно в ListView загрузить - двойная работа одним словом
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter