Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];




Вниз

Как получить иконку зарегистрированного расширения 


NLO   (2002-01-18 12:36) [0]

Как получить иконку зарегистрированного расширения, подчеркиваю нужно получить ее в зависимости от расширения (txt или т.д.)(ExtractIconEx кажется вот этой функций можно) и только не так Icon.Handle:=ExtractAssociatedIcon(HInstance,Pchar(FileName), W); так как нужно указать путь к файлу, а нужно просто по расширению



Serghei   (2002-01-18 12:45) [1]

Попробуй функцию ShGetFileInfo(....)

Удачи



NLO   (2002-01-18 15:21) [2]

И как ее использовать ?



Внук   (2002-01-18 16:46) [3]

Отвечаю на вопрос как (если интересует процесс, а не готовая функция).
Открываешь реестр, в ветви HKEY_CLASSES_ROOT находишь ключ со значением, например, ".avi", смотришь параметр по умолчанию "avifile". В этой же ветви находишь ключ с названием "avifile". В подключе DefaultIcon в параметре по умолчанию прописан путь и имя файла, содержащего иконку, а также ее номер (если иконок несколько). Таков алгоритм, которым пользуется сама система.
Так же и с другими расширениями.



DK   (2002-01-19 02:40) [4]

2Serghei (18.01.02 12:45)
ShGetFileInfo применима только к существующему файлу.

2NLO © (18.01.02 12:36)
Сам с этим долго возился, и похоже, что предложенный Внук © (18.01.02 16:46) способ является самым реальным.



Serghei   (2002-01-19 15:29) [5]

2 DK
Но ведь с помощью ShGetFileInfo можно получить в какой-то ИмажеЛист все зарегистрированныe иконки в системе то есть системный ImageList, и если расширение зарегистрированно то в нем оно долно быть обязательно!



DK   (2002-01-19 18:13) [6]

2Serghei (19.01.02 15:29)
>Но ведь с помощью ShGetFileInfo можно получить в какой-то
>ИмажеЛист все зарегистрированныe иконки в системе то есть
>системный ImageList
И как это можно сделать?
На сколько я знаю, можно скинуть так только IconCache, в котором не все зарегистрированные иконки, а только те, что использовались самыми последними (не помню точно максимальное количество). Кроме того приблизительно первые три десятка иконок - из системы, а только потом идут иконки из установленных приложений.



NLO   (2002-01-20 12:04) [7]

Вот как я решил эту проблему, выдрал эти функции из компонета FileBox.
Одна заполняет ImageList иконками а вторая взавитсимости от имени файла #иконки в ImageListe. имя файла необязательно должно содержать полный путь к файлу.

function GetImageIndex(FileName:string): Integer;
var
SHFileInfo: TSHFileInfo;
Flags: Integer;
s: string;
begin
Flags :=
SHGFI_USEFILEATTRIBUTES or
SHGFI_SYSICONINDEX or
SHGFI_EXETYPE;


Flags := Flags or SHGFI_SMALLICON;

s := FileName;
ShGetFileInfo(PCHAR(s),
0,
SHFileInfo,
SizeOf(TSHFileInfo),
Flags);

Result := SHFileInfo.iIcon;

end;




procedure GetImageList(Option: integer;ImageList:TimageList);
var
SHFileInfo: TSHFileInfo;
begin
with ImageList do
begin
ShareImages := true;
Handle := ShGetFileInfo("*.*", 0, SHFileInfo, SizeOf(TSHFileInfo),
Option or SHGFI_ATTRIBUTES or SHGFI_SYSICONINDEX)
end
end;




Serghei   (2002-01-21 09:23) [8]

Именно это и делал я когда переписывал ентот FileListBox в FileBox (см. в кладовке)



DK   (2002-01-21 10:39) [9]

Проверил твои функции. Гонишь!

Попробуй это со своими функциями:

Form1.OnPaint
var
I, J: Integer;
B: TBitmap;
begin
B := TBitmap.Create;
GetImageList(0, imageList1);
I := ImageList1.Count;
J := 0;
repeat
Imagelist1.GetBitmap(J, B);
Form1.Canvas.Draw((j mod 20)*36, (J div 20) * 36 , B);
inc(j);
until I<j;
B.Free;


Button1.OnClick

Caption := IntToStr(GetImageIndex(Edit1.text));


(Ещё нужен будет TEdit)

Вводишь в Едите любое имя файла (без пути) получаешь номер иконки (из тех, которые на экране).

У меня зарегистрировано расширение *.!!! написал 111.!!! результат: иконка № 0 - потому, что на диске этот файл не встречался очень давно и в IconCache для него иконка не сохранилась.
Переключился на Експлорер. Создал файл с:\122131.!!! После этого програма показала № 50

Кроме того посмотри внимательнее, может среди этих иконок найдёшь иконки компактов, которые вчера брал у соседа (они ведь не зарегистрированные).
И ещё: иконки екзешников ведь не зарегистрированы. Так почему они тоже здесь?

Мой знакомый (Pahmic) тоже такое когда-то искал. ответа так и не получил, думается, что тебе уже ответили правильно Внук © (18.01.02 16:46)



Serghei   (2002-01-21 11:03) [10]

2 DK!
Не знаю честно говоря что и ответить - сам я не большой мастер, сначала пробовал работать с данной функцией сам ShGetFileInfo. Потом как-то набрел на исходники ТZipTV там используют ее именно так GetImageList itd itp... для отображения файлов в TZipView!



Дмитрий   (2002-01-21 12:06) [11]

function GetSmallIcon(FileName: string): TIcon;
var FileInfo: TShFileInfo;
pidl : PItemIdList;
i : integer;
ImageList: TImageList;
Icon: TIcon;
begin
Result:=TIcon.Create;
Icon:=TIcon.Create;
ImageList:=TImageList.Create(nil);
FillChar(FileInfo, Sizeof(FileInfo), #0);
ImageList.ShareImages:=true;
ImageList.Handle:=SHGetFileInfo(
PChar(FileName),
SFGAO_SHARE,
FileInfo,
sizeof(FileInfo),
SHGFI_SMALLICON or SHGFI_SYSICONINDEX
);
ImageList.GetIcon(FileInfo.iIcon, Icon);
Result.Assign(Icon);
ImageList.Free;
end;



DK   (2002-01-21 14:27) [12]

Дмитрий © (21.01.02 12:06)
А где взять PItemIdList ?

2Serghei (21.01.02 11:03)
Так разве TZipView отображает несуществующие файлы?
Кроме того сама функция ShGetFileInfo обращается к реестру.
Вспомнил совсем неожиданно про Microangelo. Есть там кнопочка Rebuild System Cache. Так после этого список иконок, которые отображает выше упомянутая NLO функция резко уменьшился (раз в пять). Осталось 83 иконки.
PS.Мне до мастера чесно говоря тоже очень ещё далеко :)



Serghei   (2002-01-21 14:36) [13]

2 DK
Я написал ответ из соображения что надо искать зарегистрировааные файлы!
А с Микроанжело я счас сам попробую - интересно посмотреть - он и у меня торчит на машине!
Я смотрю и Дмитрий написал такое-же решение - наверное мы все зациклены на одном и том-же, только чур не обижаться никому :о)



Serghei   (2002-01-21 14:53) [14]

2 DK
Попробовал я с MicroAngelo Egineer - пр-р-р-осто ужас - число иконо сократилось раза в четыре не меньше 8:|.

Функция SHGetFileInfo не читает разве из реестра только регистрированные расширения а весь мусор?



DK   (2002-01-21 15:10) [15]

К чему всё и шло. По-моему единственно верный вариант ответа на вопрос NLO © (18.01.02 12:36) - это реестр.
Хотя, если из ShGetFileInfo можно достать всё необходимое, то через него будет удобнее, чем через реестр самоиу. И модуль Registry подключать не нужно.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.023 c
6-8965            Вован                 2001-11-11 13:18  2002.02.04  
Download files - как вытащить файл, переданный из формы HTML


3-8800            Fareader              2002-01-03 16:11  2002.02.04  
Как сделать прогу с IBX пошустрее?


1-8920            Eraser                2002-01-17 13:39  2002.02.04  
Название ComboBox


7-9014            perov                 2001-10-24 16:18  2002.02.04  
Убить процесс


3-8782            Pete                  2002-01-03 09:57  2002.02.04  
InterBase