|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
виртуальный режим listview
Подскажите что не так, делаю загрузку файлов через виртуальный listview, в обработчике OnData пишу следующее:
Код:
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem); var Attr:String; SR:TSearchRec; begin Item.Caption:=(SR.Name); Item.SubItems.Add(ExtractFileExt(SR.Name)); Item.SubItems.Add(IntToStr(SR.Size));{Размер файла} Item.SubItems.Add(TimeToDateFile(SR.FindData.ftCreationTime));{Время создания папки\файла} Attr:='----'; if (sr.Attr and faArchive)<>0 then Attr[1]:='a'; if (sr.Attr and faReadOnly)<>0 then Attr[2]:='r'; if (sr.Attr and faHidden)<>0 then Attr[3]:='h';{Скрытый} if (sr.Attr and faSysFile)<>0 then Attr[4]:='s';{Системный} Item.SubItems.Add(Attr);{Атрибуты файла\папки} Item.SubItems.Add(SR.Name); end; P.S. Выводил без использования виртуального listview у меня долго открывала программа папки с большим кол-ом файлов. Предварительно я загружаю файлы нормально, если отключить OwnerData. |
#2
|
|||
|
|||
Цитата:
Не код, а кошмар. "SR:TSearchRec;" - это просто обертка над структурой Win32_FIND_DATA. Имена файлов в ней сами собой не появятся, ее надо заполнять (см. FindFirst/FindNext), и точно не в функции OnData. Как у Вас организован поиск файлов? Код:
"Item.Caption:=(SR.Name); // скобки не нужны Item.SubItems.Add(ExtractFileExt(SR.Name));" // нет необходимости извлекать расширение, в структуре уже есть такой параметр, может быть сконвертирован с помощью StrPas. Последний раз редактировалось M.A.D.M.A.N., 08.05.2014 в 23:08. |
#3
|
||||
|
||||
А что, у вас встроенный хелп не работает? Там же есть все по TSearchRec и даже с готовыми примерами.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#4
|
|||
|
|||
Цитата:
|
#5
|
|||
|
|||
Цитата:
С FindFirst/FindNext я никогда не работал, т.к. предпочитаю вызывать API напрямую. Вот код для поиска файлов на api: Код:
procedure FindFiles(path:string; mask:array of string); var WD:win32_find_data; hfile:thandle; ext:string; fname:string; begin path:=includetrailingpathdelimiter(path); // добавляем к пути завершающий слэш, если он отсутствует. hfile:=findfirstfile(pchar(path+'*.*'),wd); // ищем все файлы, какие только есть в этой папке. if hfile <> invalid_handle_value then begin repeat fname:=strpas(wd.cFileName); if (fname <> '.') and (fname <> '..') then begin fname:=path+fname; ext:=extractfileext(fname); if ansimatchstr(ext,mask)=true then { Это для того, чтобы была возможность искать файлы по нескольким маскам. Если Вы хотите искать ВСЕ файлы, закомментируйте или удалите эту строку.} { ага, попался подходящий файл. Имя файла у нас будет присвоено переменной fname. Вместо "form1.memo1.lines.add(fname)" напишите свой обработчик} // form1.Memo1.Lines.Add(fname); ************************************* with listview1.items.add do caption:=fname; ************************************* end; application.ProcessMessages; { Чтобы форма не сильно тормозила во время поиска. (лучше вынести в отдельный поток, но сейчас не тот случай).} until findnextfile(hfile,wd) <> true; windows.FindClose(hfile); end; end; procedure TForm1.Button1Click(Sender: TObject); var arr:array of string; begin // Пример 1. Ищем только файлы с расширением *.exe SetLength(arr, 1); arr[0]:='.exe'; findfiles('C:\',arr); // пример 2. ищем файлы с расширением *.exe, *.scr, *.com... SetLength(Arr, 3); arr[0]:='.exe'; arr[1]:='.scr'; arr[2]:='.com'; findfiles('C:\',arr); end; Последний раз редактировалось Тролль, 09.05.2014 в 13:47. |
#6
|
||||
|
||||
Цитата:
Вот набросал пример отображения данных в виртуальном ListView найденными файлами: Код:
var FileList: TStringList = nil; // Здесь будут наши данные для виртуального ListView procedure TForm1.Button1Click(Sender: TObject); var sr: TSearchRec; begin // Если объекта с нашими данными ещё нет - создаём его, иначе очищаем его от старых данных: if not Assigned(FileList) then FileList := TStringList.Create else FileList.Clear; // Выполняем поиск и добавление имён файлов в FileList: if FindFirst('C:\Windows\System32\*.*', faAnyFile, sr) = NO_ERROR then try repeat if (sr.Attr and faDirectory) = 0 then // Если очередной найденный элемент это файл begin FileList.Add(sr.Name); // Добавляем его в наш внутренний список end; until FindNext(sr) <> NO_ERROR; finally FindClose(sr); end; // Теперь просто указываем виртуальному ListView сколько ему нужно будет отображать элементов: ListView1.Items.Count := FileList.Count; ListView1.Invalidate; // И на всякий случай обновляем его end; // Этот метод будет автоматически вызываться для каждого элемента, который // нужно отобразить в виртуальном ListView // Естественно свойство OwnerData у ListView должно быть True - что указывает // на "виртуальность" ListView. procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem); begin if Assigned(FileList) and (Item.Index < FileList.Count) then begin Item.Caption := FileList[Item.Index]; end; end; |
#7
|
|||
|
|||
О то что надо друзья, спасибо)))
Только Тролль подскажи, не могу понять как сделать сначала папки потом файлы? |
#8
|
|||
|
|||
Цитата:
а что если в этом месте // Выполняем поиск и добавление имён файлов в FileList: if FindFirst('C:\Windows\System32\*.*', faAnyFile, sr) = NO_ERROR then try repeat if (sr.Attr and faDirectory) = 0 then // Если очередной найденный элемент это файл begin FileList.Add(sr.Name); // Добавляем его в наш внутренний список //ВОТ ТУТ end; until FindNext(sr) <> NO_ERROR; finally FindClose(sr); end; надо добавить что то но в следующий столбец как это организовать? |