Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.22;
Скачать: CL | DM;

Вниз

TListView и иконки.   Найти похожие ветки 

 
sergn   (2002-07-08 16:49) [0]

У меня есть список файлов и каталогов,
имена которых я отображаю в TreeView. Как мне создать
ImageList со списком иконок и узнать индекс иконки для каждого
узла Treeview?


 
Dinara ©   (2002-07-08 23:04) [1]

Сорри, если это не поможет, но:
можно нормально создать ImageList, а у каждого элемента указать ItemIndex (только надо картинки подключить к тривью через Images (по-моему...))


 
sergn   (2002-07-09 11:45) [2]

Так в том то и вопрос, как заполнить этот ImageList.
Иконки задаются операционной системой в соответсвии с
типом файла или папки. И каждой такой иконке винды присваивают определенный индекс.

Так вот задача:
1.Мне нужно этот список иконок подключить через ImageList к TreeView.
2.Для очередного элемента из своего списка файлов и папок
определить ImageIndex
.

Как это эту задачу выполнить?


 
M_I   (2002-07-09 11:52) [3]

Есть функция Win32, называется SHGetFileInfo.
Указываешь параметр, что тебя интересует ( в том числе и Иконка, хочешь - большая, хочешь - маленькая)
Более подробно, см. Win32Programmer`s Reference из пакета Delphi.


 
Vov ©   (2002-07-09 12:36) [4]

Недавно разбирался, только надо было в ListView:
1 способ:
uses ShellApi
...
var
pIcon : TIcon;
rezIcon, pLageIcon, pSmallIcon : HICON;
rezPChar : PChar;
RezChar : Array[0..MAX_PATH-1] of Char;
begin
FindExecutable(PChar(OpenDialog1.FileName),PChar(dirStr), RezChar);
rezpChar := @RezChar[0];
rezIcon := ExtractIconEx(rezpChar, 0, pLageIcon, pSmallIcon, 1 );
if (rezIcon = HICON(-1)) or (rezIcon = HICON(nil)) then
ListItem.ImageIndex := -1
else begin
pIcon := TIcon.Create;
pIcon.Handle := PLageIcon;
ImageList1.AddIcon( pIcon );//большие иконки
pIcon.Handle := PSmallIcon;
ImageList2.AddIcon( pIcon );//малые соотв.
ListItem.ImageIndex := ImageList1.Count - 1;
end;
end;
//!!в данном примере получаемая иконка соответствует исполняемому
//файлу и может не соответствовать привычному виду иконок для
//файлов других типов


2 способ (достает только большие иконки):
...
var
wICon : WORD;
...
begin
...
wIcon := 1;//индекс иконки в списке
pIcon.Handle := ExtractAssociatedIcon( 0, PChar(OpenDialog1.FileName) , wIcon);
//----------или--------------------------
pIcon.Handle := LoadIcon(0, PChar(OpenDialog1.FileName));
...
end;


 
Vov ©   (2002-07-09 12:57) [5]

Недавно сам разбирался
1 способ:
uses ShellApi
...
var
pIcon : TIcon;
rezIcon, pLageIcon, pSmallIcon : HICON;
rezPChar : PChar;
RezChar : Array[0..MAX_PATH-1] of Char;
begin
...
FindExecutable(PChar(OpenDialog1.FileName),PChar(OpenDialog1.FileName), RezChar);
rezpChar := @RezChar[0];
rezIcon := ExtractIconEx(rezpChar, 0, pLageIcon, pSmallIcon, 1 );
if (rezIcon = HICON(-1)) or (rezIcon = HICON(nil)) then
ListItem.ImageIndex := -1
else begin
pIcon := TIcon.Create;
pIcon.Handle := PLageIcon;
ImageList1.AddIcon( pIcon );
pIcon.Handle := PSmallIcon;
ImageList2.AddIcon( pIcon );
ListItem.ImageIndex := ImageList1.Count - 1;
end;
...
end;
//!!Возвращается первая иконка исполняемого файла


2 способ (возвращается только большая иконка 32х32):
...
var
...
wICon : WORD;
begin
...
wIcon := 1;//индекс иконки в списке
pIcon.Handle := ExtractAssociatedIcon( 0, PChar(OpenDialog1.FileName) , wIcon);
//или===========================================================
pIcon.Handle := LoadIcon( 0, PChar(OpenDialog1.FileName));
//==============================================================
ImageList1.AddIcon( pIcon );
...
end;


 
Vov ©   (2002-07-09 12:59) [6]

что-то хреново у них с добавлением :)))


 
sergn   (2002-07-09 13:03) [7]

>M_I
Если я не ошибаюсь, то SHGetFileInfo можно использовать
следующим образом.


procedure GetShellImage(sfile:string; Large, Open: Boolean): Integer;
var
FileInfo: TSHFileInfo;
Flags: Integer;
begin
FillChar(FileInfo, SizeOf(FileInfo), #0);
Flags := SHGFI_SYSICONINDEX or SHGFI_ICON;
if Open then Flags := Flags or SHGFI_OPENICON;
if Large then Flags := Flags or SHGFI_LARGEICON
else Flags := Flags or SHGFI_SMALLICON;
SHGetFileInfo(PChar(sfile),0, FileInfo,SizeOf(FileInfo),Flags);
Result := FileInfo.iIcon;
end;

Но вопрос подключения самого списка иконок остается открытым,
К какому списку я буду применять Result?

>Vov
Твой метод мне не подходит, так как:
- ExtractIconEx возвращает индекс иконки только для исполняемых файлов.
-ExtractAssociatedIcon возвращает индекс иконки для файлов, но
не для папок.


 
msts   (2002-07-09 14:44) [8]

далее идут цитаты из примера к D5
...Borland\Delphi5\Demos\Virtual Listview\vlistview.pas
procedure TForm1.FormCreate(Sender: TObject);
var
FileInfo: TSHFileInfo;
ImageListHandle: THandle;
NewPIDL: PItemIDList;
begin
OLECheck(SHGetDesktopFolder(FIDesktopFolder));
FIShellFolder := FIDesktopFolder;
FIDList := TList.Create;
получаем хэндэл списка мал. иконок
ImageListHandle := SHGetFileInfo("C:\",
0,
FileInfo,
SizeOf(FileInfo),
SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
устанавливаем его (можно заменить хэндэл дерева см ниже)
SendMessage(ListView.Handle, LVM_SETIMAGELIST, LVSIL_SMALL, ImageListHandle);

ImageListHandle := SHGetFileInfo("C:\",
0,
FileInfo,
SizeOf(FileInfo),
SHGFI_SYSICONINDEX or SHGFI_LARGEICON);

SendMessage(ListView.Handle, LVM_SETIMAGELIST, LVSIL_NORMAL, ImageListHandle);
OLECheck(
SHGetSpecialFolderLocation(
Application.Handle,
CSIDL_DRIVES,
NewPIDL)
);
SetPath(NewPIDL);
ActiveControl := cbPath;
cbPath.SelStart := 0;
cbPath.SelLength := Length(cbPath.Text);
end;

установка иконки

function GetShellImage(PIDL: PItemIDList; Large, Open: Boolean): Integer;
var
FileInfo: TSHFileInfo;
Flags: Integer;
begin
FillChar(FileInfo, SizeOf(FileInfo), #0);
Flags := SHGFI_PIDL or SHGFI_SYSICONINDEX or SHGFI_ICON;
if Open then Flags := Flags or SHGFI_OPENICON;
if Large then Flags := Flags or SHGFI_LARGEICON
else Flags := Flags or SHGFI_SMALLICON;
SHGetFileInfo(PChar(PIDL),
0,
FileInfo,
SizeOf(FileInfo),
Flags);
Result := FileInfo.iIcon;
end;
так же в D6 есть компоненты
...Borland\Delphi6\Demos\ShellControls


 
msts   (2002-07-09 14:52) [9]

procedure TCustomTreeView.SetImageList(Value: HImageList; Flags: Integer);
begin
if HandleAllocated then TreeView_SetImageList(Handle, Value, Flags);
end;
TreeView_* набор "макросов" для работы с деревом
...Borland\Delphi5\Source\Rtl\Win\commctrl.pas




Страницы: 1 вся ветка

Текущий архив: 2002.07.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
1-70741
TTCustomDelphiMaster
2002-07-09 11:48
2002.07.22
Кто хавает память?


14-70858
Wizzard
2002-06-24 05:53
2002.07.22
Если имеется только DCU ... хелп...


3-70645
Splinter
2002-06-27 17:00
2002.07.22
Добавление поля в таблицу


1-70760
pusrg
2002-07-09 18:10
2002.07.22
Не грузится рантайм пакет.


7-70929
elefant
2002-04-29 15:47
2002.07.22
Мастера ПОМОГИТЕ!!!