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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2014, 15:14   #1
kgms
 
Регистрация: 27.01.2014
Сообщений: 7
По умолчанию Вывод в ListView файлов с определенными расширениями

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

Вот что у меня выходит:

Код:
  EXTList:=TStringList.Create;
  if FileExists(ExtractFilePath(paramstr(0))+'Config\EXT.mif') then
  EXTLIst.LoadFromFile(ExtractFilePath(paramstr(0))+'Config\EXT.mif');

  //в файле EXT.mif хранится список необходимых расширений
  //CNCBackUp - ListView
  //CNCUPLOAD - переменная пути

  CNCBackUp.Clear; 
  for j:=0 to EXTLIst.Count-1 do
  begin
  if FindFirst(CNCUPLOAD+'\*.'+ExtList.Strings[j], faAnyFile - faDirectory - faVolumeId, sr) = 0 then
        begin
            ListItem := CNCBackUp.Items.Add; 
            ListItem.Caption := sr.name;
            ListItem.SubItems.Add(inttostr(sr.size));
            ListItem.SubItems.Add(datetimetostr(FileDateToDateTime(sr.time)));
            EXT:=AnsiUpperCase(GetFileFormat(sr.Name));
            if EXT='EIA' then ListItem.ImageIndex:=0;
            if EXT<>'EIA' then ListItem.ImageIndex:=1;
            while FindNext(sr) = 0 do
                begin
                    ListItem := CNCBackUp.Items.Add;
                    ListItem.Caption := sr.name;
                    ListItem.SubItems.Add(inttostr(sr.size));     
                    ListItem.SubItems.Add(datetimetostr(FileDateToDateTime(sr.time)));
                    EXT:=AnsiUpperCase(GetFileFormat(sr.Name));
                    if EXT='EIA' then ListItem.ImageIndex:=0;
                    if EXT<>'EIA' then ListItem.ImageIndex:=1;
                end;
        FindClose(sr);
        end;
  end;
  EXTList.Free;
И вроде все работает и работает правильно. Но, соглашусь, криво это как-то заворачивать в цикл. Да и работать будет медленно при большом количестве файлов. Подскажите пожалуйста, как можно решить эту задачу иным методом. Заранее признателен.

Последний раз редактировалось kgms; 18.11.2014 в 15:24.
kgms вне форума Ответить с цитированием
Старый 18.11.2014, 15:27   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

ShellListView не?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.11.2014, 15:32   #3
kgms
 
Регистрация: 27.01.2014
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
ShellListView не?
С него начинал . Есть маленькая загвоздка. Программа работает по сети с машинами CNC. Парк машин довольно большой (20+). Как минимум половина из них имеет на борту компьютер под управлением Win95 (смешно? Мне не очень ). Переустановить не представляется возможным.
А ShellListView ужасно медленно отображает содержимое папки в Win95 по сети. На порядок медленнее моего варианта с ListView.
kgms вне форума Ответить с цитированием
Старый 18.11.2014, 15:43   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
ShellListView ужасно медленно отображает содержимое папки в Win95 по сети
Это не только с Win95. Там у него болячки винды генетические.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.11.2014, 15:45   #5
kgms
 
Регистрация: 27.01.2014
Сообщений: 7
По умолчанию

Изначально пробовал следующий вариант

Код:
  EXTList:=TStringList.Create;
  if FileExists(ExtractFilePath(paramstr(0))+'Config\EXT.mif') then
  EXTLIst.LoadFromFile(ExtractFilePath(paramstr(0))+'Config\EXT.mif');

  CNCBackUp.Clear;
  if FindFirst(CNCUPLOAD+'\*.*', faAnyFile - faDirectory - faVolumeId, sr) =   0 then
  begin
  fe:=GetFileFormat(SR.Name);
  for j:=0 to EXTLIst.Count-1 do
  if AnsiUpperCase(fe) = ExtList.Strings[j] then
  begin
       ListItem := CNCBackUp.Items.Add;
       ListItem.Caption := sr.name;
       ListItem.SubItems.Add(inttostr(sr.size));
       ListItem.SubItems.Add(datetimetostr(FileDateToDateTime(sr.time)));
       EXT:=AnsiUpperCase(GetFileFormat(sr.Name));
       if EXT='EIA' then ListItem.ImageIndex:=0;
       if EXT<>'EIA' then ListItem.ImageIndex:=1;
         while FindNext(sr) = 0 do
            begin
               fe:=GetFileFormat(SR.Name);
               for k:=0 to EXTLIst.Count-1 do
               if AnsiUpperCase(fe) = ExtList.Strings[k] then
                    begin
                         ListItem := CNCBackUp.Items.Add;
                         ListItem.Caption := sr.name;
                         ListItem.SubItems.Add(inttostr(sr.size));
                         ListItem.SubItems.Add(datetimetostr(FileDateToDateTime(sr.time)));
                         EXT:=AnsiUpperCase(GetFileFormat(sr.Name));
                         if EXT='EIA' then ListItem.ImageIndex:=0;
                         if EXT<>'EIA' then ListItem.ImageIndex:=1;
                   end;
            end;
   end;
    FindClose(sr);
  end;
  EXTList.Free;
Т.е. не заворачивая поиск в цикл, сверял расширение найденного файла с расширением из списка и, в случае соответствия, добавлял в ListView строку. Этот метод быстрее, но периодически дублировал записи. Т.е. появлялось два одинаковых файла.
kgms вне форума Ответить с цитированием
Старый 18.11.2014, 15:48   #6
kgms
 
Регистрация: 27.01.2014
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это не только с Win95. Там у него болячки винды генетические.
Не спорю, но с Win9x это слишком заметно. Вообщем - этот вариант я отмел почти сразу.
kgms вне форума Ответить с цитированием
Старый 18.11.2014, 16:39   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

1. Выкинь из цикла работу с ListView полностью!
2. Сделай ListView виртуальным и отображай фрагмент списка файлов в OnData.
Цикл можно ЕЩЁ оптимизировать, но это после первых двух пунктов.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 18.11.2014, 17:05   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Этот метод быстрее, но периодически дублировал записи. Т.е. появлялось два одинаковых файла.
а может стоило бы разобраться в причинах дублирования.
Например: файл удовлетворяет ДВУМ и более условиям фильтрации.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 18.11.2014, 17:22   #9
kgms
 
Регистрация: 27.01.2014
Сообщений: 7
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
1. Выкинь из цикла работу с ListView полностью!
2. Сделай ListView виртуальным и отображай фрагмент списка файлов в OnData.
Цикл можно ЕЩЁ оптимизировать, но это после первых двух пунктов.
А в цикле что?

Цитата:
Сообщение от evg_m Посмотреть сообщение
а может стоило бы разобраться в причинах дублирования.
Например: файл удовлетворяет ДВУМ и более условиям фильтрации.
Пытался. Условие только одно. Причем, что характерно, дублируется только последний файл в списке.

Последний раз редактировалось Stilet; 18.11.2014 в 17:40.
kgms вне форума Ответить с цитированием
Старый 18.11.2014, 17:43   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
А в цикле что?
Заполнение списка файлов.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод в listview helper999999 Общие вопросы Delphi 5 22.02.2014 21:14
Поиск файлов по маске и нахождения общего размера найденных файлов и вывод в терминал Колямбий Помощь студентам 0 21.04.2013 21:31
Перемещение файлов из списка Listview Putin-mode Общие вопросы Delphi 9 18.07.2012 07:36
ListView вывод иконок Rolls Компоненты Delphi 2 13.05.2010 07:56
Поиск файлов сразу с несколькими расширениями. Как??? Altera Общие вопросы Delphi 20 28.03.2008 01:43