Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> VirtualStringTree и отображение иконок файлов, Оптимизация загрузки иконок 
:(
    Опции темы
CHERRY
Дата 10.5.2012, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



В VirtualStringTree для отображения иконок ассоциированных с файлом используется код: 
Код

          if fWinIcon then//отображать иконки windows
          Begin
            Icon := TIcon.Create;
            SHGetFileInfo(pchar(TSerchInfo(fSerchInfo[i]).LongName), 0,
              FileInfo, SizeOf(FileInfo),SHGFI_ICON or SHGFI_SMALLICON);
            Icon.Handle := FileInfo.hIcon;
            ImageIndex := ImList.AddIcon(Icon);
            Icon.Free;
          End

TSerchInfo(fSerchInfo[i]).LongName - полное имя файла. 
Все работает, но например, в папке System32 больше 2-х тысяч файлов, соответственно иконок в ImList загружается столько же(причем однотипных иконок). Поэтому на отображение папки требуется несколько секунд.
Как оптимизировать процесс? 
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
XperT
Дата 10.5.2012, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



Определяйте тип файла и ассоциируйте его с иконкой. Перед загрузкой следующей иконки проверяйте не загружали ли вы для такого типа файлов уже иконку.
PM MAIL   Вверх
CHERRY
Дата 10.5.2012, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



Да, таким образом можно загрузить только "нужные" иконки, но как потом узнать, что файлу *.txt соответствует индекс 10 из ImList, а *.dll  индекс 186
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
XperT
Дата 10.5.2012, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



Ужас, вы не знаете как в программировании ассоциировать одни данные с другими? Да вариантов на самом деле очень много (список отсортирован в порядке от правильного до простого):
1. Ассоциативный массив (TDictionary)
2. Массив структур (где структура состоит из 2 полей: расширение файла и индекс иконки)
3. Двумерный массив
4. Два одномерных массива (или других списков, новички очень любят использовать TStringList)
...

Это не предел. Список можно расширить еще несколькими правильными вариантами (о которых я сейчас не подумал), а так же кучей дурацких вариантов (которые тем не менее будут работать).

Это сообщение отредактировал(а) XperT - 10.5.2012, 15:04
PM MAIL   Вверх
CHERRY
Дата 10.5.2012, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



Спасибо. Идея понятна
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
kami
Дата 10.5.2012, 21:34 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



А я бы предложил, раз уж используется VT, задействовать "системный" ImageList.
Поясняю:

Код

const
  SystemIconsFlag = SHGFI_ADDOVERLAYS or SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_SMALLICON;

procedure TForm1.FormCreate(Sender: TObject);
var
  fi: TSHFileInfo;
begin
  SystemSmallImageList.ShareImages := True; // это чтобы не удалить системные иконки.
  SystemSmallImageList.Handle := SHGetFileInfo(PChar(''), 0, fi, SizeOf(TSHFileInfo), SystemIconsFlag); // подменяем хендл "нашего" ImgList на системный.
  // изначально системный ImageList не содержит иконок. Они появляются при первом обращении к нужной иконке.
  // и использовать при этом, само собой, нужно ImageIndex, а не IconHandle.
end;


А теперь - непосредственно отображение:
Код

procedure TForm1.vtGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind;
  Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer);
var
  NodeData: PmyFileInfo;
  fi: TSHFileInfo;
  str: string;
begin
  ImageIndex := -1;  
  if Kind <> ikOverlay then
    begin
      NodeData := Sender.GetNodeData(Node);
      str := NodeData.FileName; // "забираем" имя файла, иконку которого нужно отобразить
      if SHGetFileInfo(PChar(str), FILE_ATTRIBUTE_NORMAL, fi, SizeOf(TSHFileInfo), SystemIconsFlag) <> 0 then
        ImageIndex := fi.iIcon;
      // получили индекс иконки в системном ImageList. Максимальное время занимается на внесение иконки в него.
      // Когда иконка уже в списке, то действие практически не занимает времени.
      // Кроме того, так как VT запрашивает только те иконки, файлы которых сейчас на экране, то вся операция занимает минимум времени.
    end;
end;

Итого - заполнение VT списком файлов из system32 и работа только с нужными на текущий момент иконками в общем и целом занимает меньше секунды. Непосредственную работу по "а есть ли уже эта иконка в списке и какая она по номеру" берет на себя система, что, имхо, большой плюс.

Добавлено @ 21:38
Ну и - в приведенном примере SHGetFileInfo  действует на основании расширения файла. Посему "действительных" иконок (к примеру) exe файлов не увидеть...

Это сообщение отредактировал(а) kami - 10.5.2012, 21:49
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.