PDA

Ver la Versión Completa : Iconos de archivos conocidos


ElDuc
11-10-2006, 19:28:47
Buenas.

Alguien puede orientarme como saber qué icono esta relacionado con un archivo.

Por ejemplo: Si encuentro un archivo con extensión .doc en principio es un word ¿donde esta el icono?

Gracias

maeyanes
11-10-2006, 19:31:01
Revisa esta página: http://www.latiumsoftware.com/en/delphi/00014.php


Saludos...

dec
11-10-2006, 20:06:12
Hola,

¿Alguien consiguió el icono asociado a un archivo con la función "ExtractAssociatedIcon" del API de Windows (ShellApi)? Por más que lo he intentado no consigo nada... y he visto tres o cuatro ejemplos buscando por ahí, además de mirar en la ayuda correspondiente, pero, que si quieres arroz Catalina...

seoane
11-10-2006, 20:24:47
Puede que cometieras el mismo error que yo, la ruta del archivo no puede ser fija, debe ser un buffer lo bastante grande para recibir la ruta del ejecutable. Ya que si nos fijamos bien en la ayuda pone:


If the icon handle is obtained from an executable file, the function stores the full path and file name of that executable in the string pointed to by lpIconPath.


Entonces la cosa queda así:

var
Buffer: array[0..MAX_PATH] of Char;
Icono: TIcon;
Index: Word;
begin
Icono:= TIcon.Create;
try
StrCopy(Buffer,PChar('d:\1.jpg'));
Index:= 0;
Icono.Handle:= ExtractAssociatedIcon(GetModuleHandle(nil),@Buffer,Index);
// Aqui dibujo el icono, pero lo podriamos asignar a un Timage.Picture
Canvas.Draw(0,0,Icono);
finally
Icono.Free;
end;
end;

dec
11-10-2006, 21:10:30
Hola,

Genial Domingo. Había leído lo que dices en la ayuda, pero, no lo comprendí bien, claro está. Se toma nota. Apúntate otro 10. :)

Por cierto, me he permitido añadir al apartado de trucos (http://www.clubdelphi.com/trucos/index.php?id=371) el código fuente que has expuesto. ;)

roman
11-10-2006, 22:09:10
Según se indica en el truco citado de trucomanía, ExtractAssociatedIcon tendrá la desventaja de que debe aplicarse sobre un archivo existente.

Partiendo de ahí, me he tomado la libertad de hacer otra función, basada sólo en la extensión del archivo:


procedure ExtractIcon(FileExt: String; Icon: TIcon; SmallIcon: Boolean = false);
var
il: TImageList;
fi: TShFileInfo;
flags: Cardinal;
idx: Integer;

begin
ShGetFileInfo(
PChar('.' + FileExt), 0, fi, SizeOf(fi),
SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES
);
idx := fi.iIcon;

il := TImageList.Create(nil);

try
if SmallIcon then flags := SHGFI_SMALLICON else flags := SHGFI_LARGEICON;
il.Handle := ShGetFileInfo('', 0, fi, SizeOf(fi), SHGFI_SYSICONINDEX or flags);
il.GetIcon(idx, Icon);
finally
il.Free;
end;
end;


La usaríamos, por ejemplo, así:


ExtractIcon('jpg', Image1.Picture.Icon);


o bien


ExtractIcon('jpg', Image1.Picture.Icon, true);


si queremos el icono pequeño.

// Saludos

maeyanes
11-10-2006, 22:16:51
Eh... Roman, viendo la cabecera de tu función:

procedure ExtractIcon(FileExt: String; Icon: TIcon; SmallIcon: Boolean = false);

Si haces la llamada:

ExtractIcon('jpg', Image1.Picture.Icon, false);


Te va a devolver un icono grande, me imagino que para el pequeño tendría que ser:


ExtractIcon('jpg', Image1.Picture.Icon, True);



Saludos...

P.D. Edité mi mensaje por que tuve un pequeño error de apreciación del cual me di cuenta después de enviado el mensaje...

roman
11-10-2006, 22:28:15
Je, je, claro que sí. Ya lo he corregido en el original. :)

// Saludos

ElDuc
16-10-2006, 18:16:16
Gracias a todos por vuetra ayuda.

Hepodido solucionar el problema.

Saludos.