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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2014, 03:18   #1
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
Восклицание Виртуальный 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, но он все равно пуст как быть, подскажите пожалуйста.
HTTqp вне форума Ответить с цитированием
Старый 18.09.2014, 06:42   #2
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

а разве в там отрисовывать самому не нужно? (немного забыл уже vcl, поправьте если не так)
ZuBy вне форума Ответить с цитированием
Старый 18.09.2014, 08:06   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
почему то загружается пустой ListView
Отладкой проходил?
Цитата:
разве в там отрисовывать самому не нужно?
В ЛистВью? Нет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.09.2014, 09:11   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Если ListView виртуальный, то вот это лишнее, выкинь:
Код:
 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;
Вот, посмотри. Выдрал из своего проекта не глядя:
Код:
procedure TMainForm.ListViewData(Sender: TObject; Item: TListItem);
var
  Member: TMember;
begin
  Member:= FMemberList[Item.Index];
  Item.Caption:= Member.Name;
  Item.SubItems.Add(IntToStr(Member.Rating));
  Item.SubItems.Add(DateTimeToStrEx(Member.LastVisit));
  Item.SubItems.Add(IntToStr(Member.Place));
  Item.ImageIndex:= Integer(Member.Gender);
  Item.Data:= Member;
end;

procedure TMainForm.UpdateListView;
begin
  // Обновление списка
  FMemberList.CalcPlaces();
  ListView.Items.Count:= FMemberList.Count;
  ListView.Invalidate();
end;
Статья по сабжу.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 18.09.2014, 15:22   #5
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Если ListView виртуальный, то вот это лишнее, выкинь:
Код:
 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;
Статья по сабжу.
Как я это уберу если по этому коду происходит заполнение, если уберу заполнение нужных полей не будет происходить!
HTTqp вне форума Ответить с цитированием
Старый 18.09.2014, 15:36   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Как я это уберу если по этому коду происходит заполнение, если уберу заполнение нужных полей не будет происходить!
Виртуальный ListView потому и виртуальный, что данные он не хранит, а только отображает. Причём только те, что в окно влазят. Покури интернеты, статей 100500 ахулиардов штук по этому поводу понаписали.

Я ж тебе пример свой выдрал. У меня данные хранятся в списке в памяти:
Код:
Member:= FMemberList[Item.Index]; // <--- FMemberList - это список с данными
Если интересно, вот код этого класса-списка.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 18.09.2014, 15:41   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Как я это уберу если по этому коду происходит заполнение, если уберу заполнение нужных полей не будет происходить!
заполнять надо не ListView а СВОЮ внутреннюю таблицу.
Цитата:
FileList: TStringList = nil; // Здесь будут наши данные для виртуального ListView
их там нет вот и пустой список. (он не пустой, но все строки в нем пустые!)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 18.09.2014 в 15:43.
evg_m вне форума Ответить с цитированием
Старый 18.09.2014, 19:41   #8
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
заполнять надо не ListView а СВОЮ внутреннюю таблицу.

их там нет вот и пустой список. (он не пустой, но все строки в нем пустые!)
А как сделать чтобы было заполнение правильно? Пожскажите пожалуйста, не могу разобраться ни как.
HTTqp вне форума Ответить с цитированием
Старый 18.09.2014, 19:47   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Пожскажите пожалуйста, не могу разобраться ни как.
Я тебе кусок исходника подарил. Ты его смотрел или нет?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 18.09.2014, 20:11   #10
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Я тебе кусок исходника подарил. Ты его смотрел или нет?
В том то и косяк что ты выдрал, и вобще не понятно что там хоть бы откоментил, Member: TMember я как понял это новый тип, но остальное откуда ты взял фиг знает.
HTTqp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как перетащить элемент ListView в другой ListView? Paul Hindenburg Компоненты Delphi 5 26.01.2013 11:35
Виртуальный сервер ClMlD Операционные системы общие вопросы 3 09.12.2012 00:55
Виртуальный ListView Anfall Компоненты Delphi 2 26.10.2010 13:12
[C# + WPF] ListView. Узнать выделена ли строка в нём. ListView.View == GridView. Casper-SC WPF, UWP, WinRT, XAML 2 12.08.2010 19:04
Виртуальный функции. Иллидан Помощь студентам 3 11.04.2008 10:28