![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 пуст.
|
|
#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. |
|
#10
|
||||
|
||||
|
Посмотреть пример в Дельфи нельзя? ..\Demos\Virtual Listview.
|