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

Delphi Sources



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

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

Есть код
Код:
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  
Старый 18.09.2014, 03:25
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Проверь в отладчике, может FileList пуст.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 18.09.2014, 08:34
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

FileList создаётся или чистится, но не заполняется ни чем и ни где, и ещё выходит, что заполненный LV обнуляется
Код:
LV.Items.Count := FileList.Count;
Ответить с цитированием
  #4  
Старый 18.09.2014, 15:19
HTTqp HTTqp вне форума
Новичок
 
Регистрация: 16.04.2014
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: -25
По умолчанию

Цитата:
Сообщение от Alegun
FileList создаётся или чистится, но не заполняется ни чем и ни где, и ещё выходит, что заполненный LV обнуляется
Код:
LV.Items.Count := FileList.Count;
А можете подсказать как сделать чтобы он не обнулялся\чистился, чтобы нормально заполнялся?
Ответить с цитированием
  #5  
Старый 18.09.2014, 15:43
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Похоже у вас здесь не хватает строчки
Код:
...
FileList.Add(WFD.cFileName);
...
, а куда её вставить смотрите сами, вам виднее
Ответить с цитированием
  #6  
Старый 18.09.2014, 19:40
HTTqp HTTqp вне форума
Новичок
 
Регистрация: 16.04.2014
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: -25
По умолчанию

Цитата:
Сообщение от Alegun
Похоже у вас здесь не хватает строчки
Код:
...
FileList.Add(WFD.cFileName);
...
, а куда её вставить смотрите сами, вам виднее
что то куда не вставлю ни куда не подходит, не работает. Можно как то ткнуть носом прям?
Ответить с цитированием
  #7  
Старый 18.09.2014, 22:45
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Из кода вообще не видно - похоже что при вызове FindFiles происходит заполнение листвью и файлиста содержимым первого, а на самом деле такое не происходит - задумка аффтара и есть задумка автора, присутствуют непонятки, и есть подозрение, что код нужно немного исправить в этом месте
Код:
...
 if (WFD.dwFileAttributes and faDirectory)<>faDirectory then{Проверка что это не папка}
        begin
         Caption:=ChangeFileExt(WFD.cFileName,'');
         FileList.Add(WFD.cFileName);
         SubItems.Add('...');
         SubItems.Add('...');{Размер файла}
        end else
...
Ответить с цитированием
  #8  
Старый 18.09.2014, 23:18
HTTqp HTTqp вне форума
Новичок
 
Регистрация: 16.04.2014
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: -25
По умолчанию

Цитата:
Сообщение от Alegun
Из кода вообще не видно - похоже что при вызове FindFiles происходит заполнение листвью и файлиста содержимым первого, а на самом деле такое не происходит - задумка аффтара и есть задумка автора, присутствуют непонятки, и есть подозрение, что код нужно немного исправить в этом месте
Код:
...
 if (WFD.dwFileAttributes and faDirectory)<>faDirectory then{Проверка что это не папка}
        begin
         Caption:=ChangeFileExt(WFD.cFileName,'');
         FileList.Add(WFD.cFileName);
         SubItems.Add('...');
         SubItems.Add('...');{Размер файла}
        end else
...
прошу прощения надо было показать весь пример а не его часть, нет, все равно не то.
Вот полный код как он есть
Код:
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.
и исходник если нужно, просто не получается даже по мануалам сделать правильно.
Вложения
Тип файла: rar Temp.rar (66.9 Кбайт, 2 просмотров)
Ответить с цитированием
  #9  
Старый 19.09.2014, 07:27
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Как и ожидалось, после добавления вышеприведённой строки и в том самом предпологаемом месте, листвью наполняется, во всяком случае, именами файлов

З.Ы. Вот что-то по-теме, посмотрите пжлст
Ответить с цитированием
  #10  
Старый 19.09.2014, 11:54
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Посмотреть пример в Дельфи нельзя? ..\Demos\Virtual Listview.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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