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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.02.2011, 02:32
Аватар для Yurgen
Yurgen Yurgen вне форума
Прохожий
 
Регистрация: 09.12.2010
Адрес: Киев
Сообщения: 13
Репутация: 10
Вопрос File Exploring и TListView

Всем доброго утра, вечера, дня или ночи.
Буду краток. Пишу файл-менеджер. Использую FindFirst, FindNext и пробую разные элементы списков в Delphi. Траблы в том что не могу прикрутить иконки к ListView`y. Плюс так выходит что для файлов с разного типа нужны разные иконки, если определять тип по расширению в имени элемента, то папки и файлы без расширения будут закошены под одну гребёнку.
Товарищи, есть идеи?
Ответить с цитированием
  #2  
Старый 01.02.2011, 04:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,026
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Есть.
Делается это через получение ссылки на системный ImageList и получения индекса через специальный вызов API по имени файла.

Код:
  // Load image lists for files icons
  ilSystemSmall.Handle := SHGetFileInfo('', 0, SHFI , SizeOf(SHFI),
                          SHGFI_SMALLICON Or SHGFI_SYSICONINDEX);
  ilSystemLarge.Handle := SHGetFileInfo('', 0, SHFI, SizeOf(SHFI),
                          SHGFI_LARGEICON Or SHGFI_SYSICONINDEX);

и

Код:
function GetSystemImageIndex(AFileName : String) : Integer;
  var
    SHFI : TSHFileInfo;
  begin
    Result := -1;
    Try
      SHGetFileInfo(PChar(AFileName), SHGFI_USEFILEATTRIBUTES,SHFI, sizeof(SHFI),
                    SHGFI_SYSICONINDEX OR SHGFI_SMALLICON OR SHGFI_DISPLAYNAME);
      Result := SHFI.iIcon;
    Except
    End;
  end;
Ответить с цитированием
  #3  
Старый 01.02.2011, 23:06
Аватар для Yurgen
Yurgen Yurgen вне форума
Прохожий
 
Регистрация: 09.12.2010
Адрес: Киев
Сообщения: 13
Репутация: 10
По умолчанию

Вобщем отображение списка задано такой процедурой:
Код:
procedure TMainForm.actRefreshExecute(Sender: TObject);
var res : TSearchRec;
begin
     lvFiles1.Clear;
     if ( FindFirst ( '*.*', faAnyFile, res ) <> 0 ) then Exit;
     repeat
           lvFiles1.Items.Add.Caption := res.name;
           if ( res.Attr = 10 ) then lvFiles1.Items[lvFiles1.ItemIndex].ImageIndex := 0
           else lvFiles1.Items[lvFiles1.ItemIndex].ImageIndex := 1;
     until ( FindNext ( res ) <> 0 );
end;

Но оно к сожалению крашит на выражении:
Код:
 if ( res.Attr = 10 ) then lvFiles1.Items[lvFiles1.ItemIndex].ImageIndex := 0
           else lvFiles1.Items[lvFiles1.ItemIndex].ImageIndex := 1;
Ответить с цитированием
  #4  
Старый 02.02.2011, 01:55
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,026
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Угу. Конечно. А lvFiles1.ItemIndex не смущает? в момент заполнения списка?

Код:
var
  Item : TListItem;
begin
  ...
  Item := lvFiles1.Items.Add;
  Item.Caption := res.name;
  if ( res.Attr = 10 ) 
    then Item.ImageIndex := 0
    else Item.ImageIndex := 1;
  ...
Ответить с цитированием
  #5  
Старый 01.05.2011, 17:29
Аватар для Yurgen
Yurgen Yurgen вне форума
Прохожий
 
Регистрация: 09.12.2010
Адрес: Киев
Сообщения: 13
Репутация: 10
Хорошо

Спасибо разобрался. Даже немного импрувнул используя битовую маску:
Код:
if ( sr.Attr and $10 ) = faDirectory then begin
              SubItems.Add ( '<DIR>' );
              ImageIndex := 1;
           end;

Теперь новая проблема. Как отсортировать список так, что бы сначала шли папки, а потом файлы. А не все отсортировано просто по имени.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter