|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
File Exploring и TListView
Всем доброго утра, вечера, дня или ночи.
Буду краток. Пишу файл-менеджер. Использую FindFirst, FindNext и пробую разные элементы списков в Delphi. Траблы в том что не могу прикрутить иконки к ListView`y. Плюс так выходит что для файлов с разного типа нужны разные иконки, если определять тип по расширению в имени элемента, то папки и файлы без расширения будут закошены под одну гребёнку. Товарищи, есть идеи? |
#2
|
|||
|
|||
Есть.
Делается это через получение ссылки на системный 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
|
||||
|
||||
Вобщем отображение списка задано такой процедурой:
Код:
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
|
|||
|
|||
Угу. Конечно. А 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
|
||||
|
||||
Спасибо разобрался. Даже немного импрувнул используя битовую маску:
Код:
if ( sr.Attr and $10 ) = faDirectory then begin SubItems.Add ( '<DIR>' ); ImageIndex := 1; end; Теперь новая проблема. Как отсортировать список так, что бы сначала шли папки, а потом файлы. А не все отсортировано просто по имени. |