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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.05.2014, 20:39
HTTqp HTTqp вне форума
Новичок
 
Регистрация: 16.04.2014
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: -25
По умолчанию виртуальный режим 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  
Старый 08.05.2014, 21:29
Тролль Тролль вне форума
Заблокирован
 
Регистрация: 07.05.2014
Сообщения: 11
Версия Delphi: 7, Kylix
Репутация: -1385
По умолчанию

Цитата:
Сообщение от HTTqp
Подскажите что не так, делаю загрузку файлов через виртуальный 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;


Не код, а кошмар. "SR:TSearchRec;" - это просто обертка над структурой Win32_FIND_DATA. Имена файлов в ней сами собой не появятся, ее надо заполнять (см. FindFirst/FindNext), и точно не в функции OnData. Как у Вас организован поиск файлов?

Код:
"Item.Caption:=(SR.Name); // скобки не нужны
Item.SubItems.Add(ExtractFileExt(SR.Name));" // нет необходимости извлекать расширение, в структуре уже есть такой параметр, может быть сконвертирован с помощью StrPas.
MAD: пользуемся тегами для формления кода!

Последний раз редактировалось M.A.D.M.A.N., 08.05.2014 в 23:08.
Ответить с цитированием
  #3  
Старый 09.05.2014, 10:59
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А что, у вас встроенный хелп не работает? Там же есть все по TSearchRec и даже с готовыми примерами.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 09.05.2014, 12:48
HTTqp HTTqp вне форума
Новичок
 
Регистрация: 16.04.2014
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: -25
По умолчанию

Цитата:
Сообщение от Страдалецъ
А что, у вас встроенный хелп не работает? Там же есть все по TSearchRec и даже с готовыми примерами.
Меня интересует именно виртуальный listview, я не понимаю как его заполнять(
Ответить с цитированием
  #5  
Старый 09.05.2014, 13:38
Тролль Тролль вне форума
Заблокирован
 
Регистрация: 07.05.2014
Сообщения: 11
Версия Delphi: 7, Kylix
Репутация: -1385
По умолчанию

Цитата:
Сообщение от HTTqp
Меня интересует именно виртуальный listview, я не понимаю как его заполнять(


С 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  
Старый 09.05.2014, 14:37
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от HTTqp
Меня интересует именно виртуальный listview, я не понимаю как его заполнять(
В том то и смысл, что виртуальный listview никак не заполняется - он отображает не свои, а чужие данные.

Вот набросал пример отображения данных в виртуальном 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  
Старый 10.05.2014, 20:09
HTTqp HTTqp вне форума
Новичок
 
Регистрация: 16.04.2014
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: -25
По умолчанию

О то что надо друзья, спасибо)))
Только Тролль подскажи, не могу понять как сделать сначала папки потом файлы?
Ответить с цитированием
  #8  
Старый 23.09.2014, 19:35
HTTqp HTTqp вне форума
Новичок
 
Регистрация: 16.04.2014
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: -25
По умолчанию

Цитата:
Сообщение от poli-smen
В том то и смысл, что виртуальный listview никак не заполняется - он отображает не свои, а чужие данные.

Вот набросал пример отображения данных в виртуальном 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;

а что если в этом месте


// Выполняем поиск и добавление имён файлов в 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;


надо добавить что то но в следующий столбец как это организовать?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter