Форум: "Основная";
Текущий архив: 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 подключать не нужно.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c