Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.02;
Скачать: CL | DM;

Вниз

Иконки   Найти похожие ветки 

 
Павел ©   (2003-04-02 07:25) [0]

Подскажите, как узнать, или как использовать иконки установленные в системе к тем или иным файлам.
(avi,bmp,txt...и т.д.)


 
крот ©   (2003-04-02 07:50) [1]

ExtractAssociatedIcon


 
Павел ©   (2003-04-02 08:36) [2]

Спасибо!


 
Igor   (2003-04-02 10:17) [3]

to крот

Расскажи подробнее, если не сложно

Заранее спасибо


 
Diouzshev   (2003-04-02 13:05) [4]

Есть ссылка, но она не работает (надеюсь временно).
http://delphiplus.nagano.ru/articles/advice/file_icon/
поэтому, без позволения автора %( , приведу статью целиком, следующим сообщением. Начсет исходников - мыльте!


 
Diouzshev   (2003-04-02 13:09) [5]

Как отобразить иконку, связанную с типом файла #1
c 2002 Галимарзанов Фанис
Очень часто - например, при выводе в ListView списка файлов, требуется отобразить "иконку расширения файла" - так, как это делает Windows.

Проблема заключается в том, что для решения этой задачи требуется как минимум два компонента - TImageList и TlistView, причем элементы обоих компонетов придется формировать динамически, или

Procedure TmainForm.AddNewItem(aFileName:string);
Var
NewItem:TlistItem;
Begin
NewItem:=MyListView.Add;
NewItem.Caption:= aFileName;
NewItem.ImageIndex:=????? // Кто вернет индекс?
End;

Кто вернет ImageIndex и вообще, где и как найти иконку?

При решении этой проблемы я перебрал несколько вариантов, но все они крутились вокруг ExtractAssociatedIcon - увы, нет под рукой MSDN, посему ничего не получалось. Отчаявшись, попросил помощи у коллег - ответ пришел почти мгновенно:

Fanis wrote:
Привет!
При отображении в PopMenu имен приаттаченных к сообщению файлов хочу также отрисовывать иконки в соответствии с расширением файла. День потерял, но...
Сам не пробовал, но вдруг поможет
============ //Author: Pascal Enz
uses
ShellApi;

function GetAssociatedIcon(const AExtension: string; ASmall: Boolean): HIcon;
var
Info: TSHFileInfo;
Flags: Cardinal;
begin
if ASmall then
Flags := SHGFI_ICON or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES
else
Flags := SHGFI_ICON or SHGFI_LARGEICON or SHGFI_USEFILEATTRIBUTES;

SHGetFileInfo(PChar(AExtension), FILE_ATTRIBUTE_NORMAL, Info,
SizeOf(TSHFileInfo), Flags);
Result := Info.hIcon;
end;
============
Игорь Захребетков


 
Diouzshev   (2003-04-02 13:10) [6]

Как отобразить иконку, связанную с типом файла #2
c 2002 Галимарзанов Фанис
Игорь, еше раз спасибо!
Протестировав пример, пришел к выводу, что это именно то, что я искал. Оставалось лишь найти способ хранения связки <расширение файла-иконка> и приспособить его для возврата ImageIndex. Ниже базовое решение - этого достаточно, чтобы приспособить для "внутреннего употребления". В тестовом проекте реализованы некоторые варианты его использования - для TListView и TPopupMenu.

unit ext_icon;

interface
uses Windows,controls,contnrs,classes;
type

// В этом объекте будут храниться имена расширений файлов,
// дескрипторы HICON и индесы иконок в TImageList
TExtFileIcon=class(TObject)
private
fExtName:string;
fExtIcon:HICON;
fPosInImageList:integer;
public
property ExtName:string read fExtName write fExtName;
property ExtIcon:HICON read fExtIcon write fExtIcon;
property PosInImageList:integer read fPosInImageList write fPosInImageList;
constructor Create(aExtname:string; aExtIcon:HICON; aPosInImageList:integer);
destructor Destroy;override;
end;

// Здесь будет храниться список объектов TextFileIcon
// Здесь решается вопрос, кто должен вернуть индекс
TExtIconList=class(TObjectList)
private
fExtImageList:TImageList;
procedure SetExtImageList(Value:TImageList);
public
// Указатель на TImageList
property ExtImageList:TImageList read fExtImageList write SetExtImageList; function GetPosInImageList(aExtName:string):integer;
destructor Destroy;override;
end;

function GetAssociatedIcon(const AExtension: string; ASmall: Boolean): HIcon;


 
Diouzshev   (2003-04-02 13:10) [7]

Как отобразить иконку, связанную с типом файла #3
c 2002 Галимарзанов Фанис

implementation

uses ShellApi,SysUtils,graphics;

function GetAssociatedIcon(const AExtension: string; ASmall: Boolean): HIcon;
var
Info: TSHFileInfo;
Flags: Cardinal;
begin
if ASmall then
Flags := SHGFI_ICON or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES
else
Flags := SHGFI_ICON or SHGFI_LARGEICON or SHGFI_USEFILEATTRIBUTES;
SHGetFileInfo(PChar(AExtension), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), Flags);
Result := Info.hIcon;
end;

constructor TExtFileIcon.Create(aExtname:string; aExtIcon:HICON; aPosInImageList:integer);
begin
inherited Create;
fExtName:=fExtName; // Расширение файла
fExtIcon:=aExtIcon; // Дескриптор иконки
fPosInImageList:=aPosInImageList; // Индекс TImageList
end;

destructor TExtFileIcon.Destroy;
begin
fExtName:="";
// Иконка была создана вызовом SHGetFileInfo,
// поэтому на нас <висит> ее уничтожение
if fExtIcon<>0 then DestroyIcon(fExtIcon);
fExtIcon:=0;
inherited Destroy;
end;

procedure TExtIconList.SetExtImageList(Value:TImageList);
begin
fExtImageList:=Value;
end;

// Вот кто возвращает требуемый индекс
function TExtIconList.GetPosInImageList(aExtName:string):integer;
var
j:integer;
xIcon:TIcon;
s:string;
begin
// Результат по умолчанию
Result:=-1;
if Assigned(fExtImageList) then
begin
// Если TImageList определен, то начнем
s:=lowercase(ExtractFileExt(aExtName));
// начнем перебор объектов
for j:=0 to Count-1 do
begin
if TExtFileIcon(Items[j]).ExtName=s then
// если есть совпадение <расширений>, то
begin
// вернем индекс
Result:=TExtFileIcon(Items[j]).PosInImageList;
Exit;
end
end;
// Ага, в списке не нашли, значит надо его дополнить
// Создадим контейнер иконки
xIcon:=TIcon.Create;
// Установим его дескриптор как результат функции GetAssociatedIcon
xIcon.Handle:=GetAssociatedIcon(s,true);
// Индекс иконки найдем через
Result:=fExtImageList.AddIcon(xIcon);
// Дополним наш список новым объектом
Add(TExtFileIcon.Create(s,xIcon.Handle,Result));
end;
end;

destructor TExtIconList.Destroy;
begin
fExtImageList:=nil;
Clear;
inherited Destroy;
end;

end.
Исходники (5.59К).


--------------------------------------------------------------------------------

Copyrightc 2002 Галимарзанов Фанис Специально для Delphi Plus



Страницы: 1 вся ветка

Текущий архив: 2003.06.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
3-2746
Ж. Александра
2003-05-08 21:33
2003.06.02
база DBF сохранение и открытие.


1-2856
sapsi
2003-05-22 10:32
2003.06.02
Команда для активизации окна


1-2847
Win error
2003-05-22 05:46
2003.06.02
Как загрузить файл?


3-2763
Razorblade
2003-05-13 23:44
2003.06.02
Подключение к БД MySQL из Delphi6


14-3074
Edelweiss
2003-05-16 09:26
2003.06.02
Delphi & ArcView