Текущий архив: 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.47 MB
Время: 0.005 c