Este artículo introduce una función que puede utilizar para obtener el correspondiente icono de un archivo o documento sobre la base de su extensión de archivo (es decir, no importa si el archivo o documento existe en el disco o no)
ExtractAssociatedIcon
Para obtener el icono de una aplicación o documento podemos usar esta función API (declarada en la unidad ShellAPI):
function ExtractAssociatedIcon(hInst: HINST; lpIconPath: PChar;
var lpiIcon: Word): HICON; stdcall; hInst La aplicación manejar. Este valor está contenido en el HInstance variables predefinidas.
lpIconPath Un puntero a un buffer de caracteres que debería contener una cadena terminada en nulo con el nombre de ruta completo de la solicitud, la biblioteca (DLL) o documento. Si se trata de un documento, la función de lugar de la ruta completa de la aplicación asociada desde donde el icono fue extraída, por lo que debemos asignar un buffer lo suficientemente grande.
lpiIcon: El icono de índice (el primer icono en el archivo tiene un índice de 0). Si lpIconPath especifica un documento, entonces lpiIcon se establece por la función (que es la razón por la que se pasa por referencia) al índice de la posición real tomado de icono asociado al archivo ejecutable (se define en la asociación de archivo).
Valor de retorno: Si la función falla, devuelve 0. Si tiene éxito, devuelve un manejador de icono, que es un valor que Windows utiliza para identificar los recursos asignados. No es necesario llamar a la API DestroyIcon para liberar el icono, ya que será deallocated automáticamente cuando finaliza la aplicación, aunque puede hacerlo si lo desea.
MUESTRA DE CONVOCATORIA
Ahora, ¿qué hacemos con el manejador de icono? Normalmente lo que queremos es un icono, a saber, y ejemplo de la clase TIcon. Todo lo que tenemos que hacer es crear un objeto TIcon asignar y manejar este a su propiedad Handle. Si después asignar la propiedad Handle a otro valor, el icono anterior será liberado automáticamente. Lo mismo sucede si el objeto TIcon se libera.
Aquí está un ejemplo de que los cambios en el icono de la forma:
uses SysUtils, Windows, ShellAPI;procedimiento TForm1.Button1Click (Sender: TObject);
var
IconIndex: word;
Buffer: array [0 .. 2048] of char;
IconHandle: HIcon;
empezar
StrCopy (@ Buffer, 'C: \ Windows \ Help \ Windows.hlp');
IconIndex: = 0;
IconHandle: = ExtractAssociatedIcon (hInstance, Buffer, IconIndex);
si IconHandle <> 0 then
Icon.Handle: = IconHandle;
final;
GetAssociatedIcon
Lamentablemente, no ExtractAssociatedIcon si el archivo no existe en disco, por lo que se define un procedimiento que recibe el icono de un archivo si existe o no, y también puede obtener el icono pequeño (ideal para un TListView que pueden aparecer en vsIcon o vsReport ver estilos). El procedimiento recibe tres parámetros: el nombre del archivo y dos punteros a HICON (integer) variables: una para el icono grande (32x32) y otro para el icono pequeño (16x16). Cualquiera de ellos puede ser nulo si no necesita uno de estos iconos. Los iconos "devuelto" por el procedimiento debe ser liberado con la DestroyIcon API. Esto se hará automáticamente si le puede asignar el manejador de icono (HICON) a la propiedad Handle de un objeto TIcon (el icono se liberarán cuando este objeto se libera o un nuevo valor que se le han asignado).
uses SysUtils, Registry, Windows, ShellAPI;Reg: TRegistry;
type
PHICON = ^HICON;
procedure GetAssociatedIcon(FileName: TFilename;
PLargeIcon, PSmallIcon: PHICON);
// Gets the icons of a given file
var
IconIndex: word; // Position of the icon in the file
FileExt, FileType: string;
p: integer;
P1, P2: pchar;
etiqueta
noassoc;
empezar
IconIndex: = 0;
/ / Obtener la extensión del archivo
Extension: = UpperCase (ExtractFileExt (FileName));
if ((FileExt <> '. EXE ") y (Extension <>'. ICO ')) o
no Fileexists (Archivo) then begin
/ / Si el archivo es un EXE o ICO y existe, entonces
/ / Vamos a extraer el icono de este archivo. De lo contrario
/ / Aquí vamos a tratar de encontrar el icono asociado en el
/ / Registro de Windows ...
Reg: = nil;
intentar
Reg: = TRegistry.Create (KEY_QUERY_VALUE);
Reg.RootKey: = HKEY_CLASSES_ROOT;
si Extension = '. EXE' y, a continuación FileExt: = '. COM';
si Reg.OpenKeyReadOnly (Extension), entonces
intentar
Filetype: = Reg.ReadString ('');
finalmente
Reg.CloseKey;
final;
if (FileType <>'') y Reg.OpenKeyReadOnly (
FileType + '\ DefaultIcon') entonces
intentar
Nombre de fichero: = Reg.ReadString ('');
finalmente
Reg.CloseKey;
final;
finalmente
Reg.Free;
final;
/ / Si no hemos podido encontrar la asociación, que se
/ / Tratar de obtener el valor por defecto iconos
Si el nombre de archivo =''then GOTO noassoc;
/ / Obtener el nombre del archivo y el icono índice de la
/ / Asociación (de la forma "filaname" índice ")
p1: = PChar (filename);
P2: = StrRScan (p1,',');
si p2 <> nil then begin
p: = P2 - P1 + 1 / / Posición de la coma
IconIndex: = StrToInt (Copy (nombre de fichero, p + 1,
Longitud (Archivo) - p));
SetLength (nombre de fichero, p - 1);
final;
final;
/ / Intento de obtener el icono
si ExtractIconEx (pchar (Archivo), IconIndex,
PLargeIcon ^, PSmallIcon ^, 1) <> 1, entonces
empezar
noassoc:
/ / Error en la operación o el archivo no tiene asociado
/ / Icono. Trate de obtener el valor por defecto los iconos de SHELL32.DLL
try / / para obtener la ubicación de SHELL32.DLL
Nombre de fichero: = IncludeTrailingBackslash (GetSystemDir)
+ 'SHELL32.DLL';
excepto
Nombre de fichero: = 'C: \ WINDOWS \ SYSTEM \ shell32.dll ";
final;
/ / Determinar el icono por defecto para la extensión de archivo
if (Extension = '. DOC') y luego IconIndex: = 1
else if (Extension = '. EXE ")
o (Extension = '. COM') y luego IconIndex: = 2
else if (Extension = '. HLP') y luego IconIndex: = 23
else if (Extension = '. INI')
o (Extension = '. INF') y luego IconIndex: = 63
else if (Extension = '. TXT ") y luego IconIndex: = 64
else if (Extension = '. BAT') y luego IconIndex: = 65
else if (Extension = '. DLL')
o (Extension = '. SYS')
o (Extension = '. VBX')
o (Extension = '. OCX')
o (Extension = '. VXD') y luego IconIndex: = 66
else if (Extension = '. FON "), entonces IconIndex: = 67
else if (Extension = '. FFT') y luego IconIndex: = 68
else if (Extension = '. FOT') y luego IconIndex: = 69
más IconIndex: = 0;
/ / Intento de obtener el icono.
si ExtractIconEx (pchar (Archivo), IconIndex,
PLargeIcon ^, PSmallIcon ^, 1) <> 1, entonces
empezar
/ / No se ha podido obtener el icono. Sólo "retorno" ceros.
si PLargeIcon <> nil entonces PLargeIcon ^: = 0;
si PSmallIcon <> nil entonces PSmallIcon ^: = 0;
final;
final;
final;
MUESTRA DE CONVOCATORIA
Este ejemplo cambiar el icono de su formulario:
procedimiento TForm1.Button1Click (Sender: TObject);
var
SmallIcon: HICON;
empezar
GetAssociatedIcon ( 'file.doc', nil, @ SmallIcon);
si SmallIcon <> 0 then
Icon.Handle: = SmallIcon;
final;
Other People Are Searching For...
Related How To's
- D4: Hacer conscientes TCheckbox datos con TDBEdit
- Ordenado biblioteca de componentes para facilitar las migraciones o construye
- Composición y recursivo OCL
- La composición es mucho mejor que la herencia
- Código derivados en columnas ECO II
- Windows motor de búsqueda
- Cambio de izquierda y derecha canal de volúmenes por separado:
- Envío de mensajes de correo electrónico HTML con Indy
- ECO2 se ocupa de expresión y el control Repeater ASP.NET
- Cómo almacenar el contenido de uno en uno RichEdit archivos EMF

Delicious
Digg
Google
Yahoo