Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Iconos de archivos conocidos (https://www.clubdelphi.com/foros/showthread.php?t=36436)

ElDuc 11-10-2006 19:28:47

Iconos de archivos conocidos
 
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:

Cita:

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í:
Código Delphi [-]
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 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:

Código Delphi [-]
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í:

Código Delphi [-]
ExtractIcon('jpg', Image1.Picture.Icon);

o bien

Código Delphi [-]
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:

Código Delphi [-]
procedure ExtractIcon(FileExt: String; Icon: TIcon; SmallIcon: Boolean = false);

Si haces la llamada:
Código Delphi [-]
ExtractIcon('jpg', Image1.Picture.Icon, false);

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

Código Delphi [-]
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.


La franja horaria es GMT +2. Ahora son las 18:00:02.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi