Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-9043
sandman
2001-11-20 14:42
2002.02.04
Вывод bitmap из ресурса


1-8936
Yuraz
2002-01-03 08:49
2002.02.04
Люди, подскажите, как слева в Code Explorer сделать нумерацию строк программного кода?


3-8795
dmitriyk
2002-01-04 04:20
2002.02.04
Как вывести информацию (HTML) в WebBrowser из БД Access


1-8945
kserg@ukr.net
2002-01-18 13:12
2002.02.04
Как программно перевести фокус в ячейку StringGrid.Cells


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский