Главная страница
    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.47 MB
Время: 0.004 c
1-70679
nitro313
2002-07-11 02:07
2002.07.22
Народ, подскажите... Как вывести переменную с разделением...


1-70705
lak_b
2002-07-11 12:45
2002.07.22
ТэСпидБатон


3-70611
officeman
2002-06-30 17:41
2002.07.22
(bdase) что за логин и пароль ???


1-70784
Fiend
2002-07-10 09:40
2002.07.22
Service ADO


1-70694
Александр
2002-07-10 17:52
2002.07.22
Помогите разобраться





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский