![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Всем доброго утра, вечера, дня или ночи.
Буду краток. Пишу файл-менеджер. Использую 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;Теперь новая проблема. Как отсортировать список так, что бы сначала шли папки, а потом файлы. А не все отсортировано просто по имени. |