![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Есть код
Код:
var Form1:TForm1; i:Integer; FileList: TStringList = nil; // Здесь будут наши данные для виртуального ListView implementation {$R *.dfm} {Получение списка файлов} procedure FindFiles(LV:TListView;ImgList:TImageList;Path:string); var WFD:WIN32_Find_Data; HFile:THandle; begin if not Assigned(FileList) then FileList := TStringList.Create else FileList.Clear; LV.Items.BeginUpdate;{Начинаем прорисовку} LV.Items.Clear;{Очистка ListView} Path:=Path; HFile:=FindFirstFile(PChar(Path+'*.*'),WFD);{Ищем файлы только в указанном каталоге} if HFile<>INVALID_HANDLE_VALUE then {Проверяем отсутствие ошибок} begin repeat if StrPas(WFD.cFileName)<>'.' then with LV.Items.Add do begin if (WFD.dwFileAttributes and faDirectory)<>faDirectory then{Проверка что это не папка} begin Caption:=ChangeFileExt(WFD.cFileName,''); SubItems.Add('...'); SubItems.Add('...');{Размер файла} end else begin Caption:=(WFD.cFileName);{Имя папки} SubItems.Add('[Папка]');{Указываем что это папка} SubItems.Add('...');{Размер папки} end; SubItems.Add('...'); SubItems.Add('...'); end; application.ProcessMessages; { Чтобы форма не сильно тормозила во время поиска} until FindNextFile(HFile,WFD)<>True; Winapi.Windows.FindClose(HFile); end; LV.Items.EndUpdate;{Заканчиваем прорисовку файлов} LV.Items.Count := FileList.Count; LV.Invalidate; // И на всякий случай обновляем его end; 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; из-за папок с большим количеством файлов решил пользоваться виртуальным ListView но почему то загружается пустой ListView. Причиной почему процедура FindFiles выведена отдельно, потому что требуется вывод не в один ListView, но для каждого нужно сделать чтобы был виртуальный ListView. OwnerData у ListView = True, но он все равно пуст как быть, подскажите пожалуйста. |
#2
|
||||
|
||||
![]() Проверь в отладчике, может FileList пуст.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
||||
|
||||
![]() FileList создаётся или чистится, но не заполняется ни чем и ни где, и ещё выходит, что заполненный LV обнуляется
Код:
LV.Items.Count := FileList.Count; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#4
|
|||
|
|||
![]() Цитата:
|
#5
|
||||
|
||||
![]() Похоже у вас здесь не хватает строчки
Код:
... FileList.Add(WFD.cFileName); ... Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#6
|
|||
|
|||
![]() Цитата:
|
#7
|
||||
|
||||
![]() Из кода вообще не видно - похоже что при вызове FindFiles происходит заполнение листвью и файлиста содержимым первого, а на самом деле такое не происходит - задумка аффтара и есть задумка автора, присутствуют непонятки, и есть подозрение, что код нужно немного исправить в этом месте
Код:
... if (WFD.dwFileAttributes and faDirectory)<>faDirectory then{Проверка что это не папка} begin Caption:=ChangeFileExt(WFD.cFileName,''); FileList.Add(WFD.cFileName); SubItems.Add('...'); SubItems.Add('...');{Размер файла} end else ... Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#8
|
|||
|
|||
![]() Цитата:
Вот полный код как он есть Код:
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls; type TForm1 = class(TForm) ListView1: TListView; procedure FormCreate(Sender: TObject); procedure ListView1Data(Sender: TObject; Item: TListItem); private { Private declarations } public { Public declarations } end; var Form1: TForm1; FileList: TStringList = nil; // Здесь будут наши данные для виртуального ListView implementation {$R *.dfm} {Получение списка файлов и информации о них} procedure FindFiles(LV:TListView;Path:string); var WFD:WIN32_Find_Data; HFile:THandle; ExtTemp,Attr:String; begin if not Assigned(FileList) then FileList := TStringList.Create else FileList.Clear; LV.Items.BeginUpdate;{Начинаем прорисовку} LV.Items.Clear;{Очистка ListView} HFile:=FindFirstFile(PChar(Path+'*.*'),WFD);{Ищем файлы только в указанном каталоге} if HFile<>INVALID_HANDLE_VALUE then {Проверяем отсутствие ошибок} begin repeat if StrPas(WFD.cFileName)<>'.' then with LV.Items.Add do begin if (WFD.dwFileAttributes and faDirectory)<>faDirectory then{Проверка что это не папка} begin Caption:=(WFD.cFileName); SubItems.Add(ExtractFileExt(WFD.cFileName));{Выделяем расширение} end else begin Caption:=(WFD.cFileName);{Имя папки} SubItems.Add('[Папка]');{Указываем что это папка} SubItems.Add('');{Размер папки} end; SubItems.Add('...');{Время создания папки\файла} SubItems.Add('...');{Атрибуты файла\папки} end; Application.ProcessMessages; { Чтобы форма не сильно тормозила во время поиска} until FindNextFile(HFile,WFD)<>True; Winapi.Windows.FindClose(HFile); end; LV.Items.EndUpdate;{Заканчиваем прорисовку файлов} LV.Items.Count := FileList.Count; LV.Invalidate; // И на всякий случай обновляем его end; procedure TForm1.FormCreate(Sender: TObject); begin FindFiles(ListView1,'C:\Windows\'); end; 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; end. |
#9
|
||||
|
||||
![]() Как и ожидалось, после добавления вышеприведённой строки и в том самом предпологаемом месте, листвью наполняется, во всяком случае, именами файлов
З.Ы. Вот что-то по-теме, посмотрите пжлст Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#10
|
||||
|
||||
![]() Посмотреть пример в Дельфи нельзя? ..\Demos\Virtual Listview.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |