Newsgroup: it.comp.lang.delphi
Titolo: Come recuperare l'icona per un tipo di file?

Al momento ho una listview in cui ho dei riferimenti a dei file esistenti su
disco, quindi recupero l'icona (e la descrizione, un pò come fa Explorer)
usando SHGetFileInfo, e tutto funziona perfettamente.
Ora però avrei la necessità di "rompere" il legame tra il file fisico e il
file che mostro nella mia listview. Nel dettaglio, il mio file fisico in
questione è un file con estensione TMP (lo creo con GetTempName), ma sono
sicuro che sia uno ZIP. Come posso associargli l'icona che è associata ad un
file ZIP se l'api che sto usando ora recupera le informazioni dal file
fisico? Non c'è una specie di GetIconForType(estensione)?
-- 
Lis
ICQ@Home #7317603sette     ICQ@Work #16285702tre
Mercatino: 
http://lis77.bravepages.com
 (aggiornato *con foto*: 16/06/03)

 Non c'č una specie di GetIconForType(estensione)?
Nessuna idea?


 Nessuna idea?
Visto che non ti ha risposto nessuno, lo faccio io.
Ho avuto lo stesso problema poco fa (5-6 anni :) e avevo ovviato con il
solito "metodo dello scarpolino", ossia andando nel registry a vedere le
defaulticon e palle varie.
I problemi però sono tanti:
1) questo metodo può essere valido per il 90% delle icone ma nel frattempo
si sono trovati altri modi per associare un file ad un'applicazione, quindi
non è detto che funzioni sempre
2) è lento
3) non so come siano messe le ultime versioni di delphi (anche se presumo
che non sia cambiato niente), ma il tipo TIcon può contenere una sola icona,
al massimo 32x32 e 16 (!) colori.
Allora, il mio consiglio è: cerca, cerca e ancora cerca su google e posta
sui forum borland per vedere se trovi qualcosa di più corretto, perché
sicuramente c'è (magari prova a dare un'occhiata al sorgente di
ShellListView che trovi in C:\Programmi\Borland\Delphi7\ShellControls - ti
anticipo che non sarà una passeggiata).
Uno svantaggio di questo metodo però è che il file deve esistere, quindi se
vuoi sapere a priori qual è l'icona che rappresenta quell'*estensione* ma
non hai un file vero e proprio con quell'estensione, non credo che con
questo metodo tu possa farlo.
Se proprio non trovi *niente*, dimmelo che ti fornisco la mia scarpolinata
:)
--
Jax
Journeying Artificial Xenomorph

 scarpolinata :)
Prendi anche in considerazione l'ipotesi di mostrare delle icone "di
default", ossia precaricate nel tuo programma, da mostrare in base alle
estensioni dei file; in questo modo non mostrerai le stesse icone del
sistema, ma ti risparmi molti casini; dipende da cosa devi fare.


 sistema, ma ti risparmi molti casini; dipende da cosa devi fare.
Questa non è una strada percorribile perchè la mia listview non è altro che
una simulazione della lisvtiew di explorer. Non ho nessun problema fintanto
che nella mia listview ho un riferimento ad un file la cui estensione
combacia a quella del file fisico mentre ho problemi quando devo utilizzare
dei file temporanei: in quel caso ho da una parte un file .tmp e dall'altra
un file (in questo caso, per esempio) .zip.
Comunque proprio mentre scrivevo queste righe mi è venuta un'idea:
aggiungere dopo .tmp anche l'estensione vera. In questo modo non ho problemi
con l'icona. Ora provo al volo questa soluzione e vi faccio sapere


 con l'icona. Ora provo al volo questa soluzione e vi faccio sapere
YESSSSSSSSSSS!!!!!!!!!!!!!! 
Con questo metodo funziona e ottengo il mio scopo. Spero di non aver bisogno
di mettermi a cercare anche un metodo più "generale"
grazie


 bisogno di mettermi a cercare anche un metodo più "generale"
Ascolta, non vorrei fare il cattivone, ma vedi quanto tempo è passato dal
mio post? erano le 8.54: un minuto dopo ho fatto una rapida ricerca su
googlegroups, e il *primo* risultato mi è sembrato quello calzante.
Adesso sono le 9.15 e ho già fatto un esempio funzionante in base a quel
post. Ma cappero! Usatelo sto google!
Comunque, si tratta di fare questo:
1) creare due ImageList, una grande 16 e una 32, chiamate ImageListSmall  e
ImageListLarge (ovviamente se una delle due icone non ti serve...), con
ShareImages = True;
2) aggiungere CommCtrl, ShellAPI alla lista delle uses
3) aggiungere questo codice:
procedure TForm1.FormCreate(Sender: TObject);
var
 SysIL: HImageList;
 SFI: TSHFileINfo;
begin
 SysIL := SHGetFileInfo('', 0, SFI, SizeOF(SFI), SHGFI_SYSICONINDEX or
  SHGFI_SMALLICON);
 if SysIL <> 0 then
   ImagelistSmall.Handle := SysIL;
 SysIL := SHGetFileInfo('', 0, SFI, SizeOF(SFI), SHGFI_SYSICONINDEX or
  SHGFI_LARGEICON);
 if SysIL <> 0 then
   ImagelistLarge.Handle := SysIL;
end;
function GetIconIndex(const AFile: String; Attrs: DWORD):Integer;
var
    SFI: TSHFileInfo;
begin
   SHGetFileInfo(PChar(AFile), Attrs, SFI, SizeOf(TSHFileInfo),
       SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES);
   Result := SFI.iIcon;
end;
4) usare la funzione in questo modo:
var
  iIcon: TIcon;
  iIndex: Integer;
begin
  iIndex := GetIconIndex('pippo.rar', FILE_ATTRIBUTE_NORMAL);
  ImageListSmall.GetIcon(iIndex, iIcon);
  Image1.Picture.Icon.Assign(iIcon);
  iIcon.Free;
  iIcon := TIcon.Create;
  ImageListLarge.GetIcon(iIndex, iIcon);
  Image2.Picture.Icon.Assign(iIcon);
  iIcon.Free;
end;
Spero di non aver dimenticato niente.


post. Ma cappero! Usatelo sto google!
Quest'uomo e' un grande.
Jax for US!
-- 
Morde. 
(morde at programmer dot net)

 post. Ma cappero! Usatelo sto google!
Guarda che ho usato google, mica mi sogno di usare le Api di notte :-), ma
lo utilizzavo diversamente e non funzionava del tutto correttamente.
Inizialmente usavo la SHGetFileInfo in questo modo:
  SHGetFileInfo(PChar(sFileName), 0, SHFileInfo, SizeOf(TSHFileInfo), 
    SHGFI_SYSICONINDEX);
e in sFileName avevo il mio path+nomefile, e funzionava correttamente tranne
quando non c'era il file del parametro.
Con la tua soluzione invece recuperavo correttamente le icone per i files ma
se si trattava di una directory non funzionava.
Così ho unito le due cose e ho tirato fuori questo, che sto testando per
cercare di capire se può andare bene il valore di 1.000.000 che uso:
  SHGetFileInfo(PChar(AFile), 0, SFI, SizeOf(TSHFileInfo),
    SHGFI_SYSICONINDEX);
  if SFI.iIcon > 1000000 then
    SHGetFileInfo(PChar(AFile), FILE_ATTRIBUTE_NORMAL, SFI,
      SizeOf(TSHFileInfo),  SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES);
  Result := SFI.iIcon; 
-- 


 files ma se si trattava di una directory non funzionava.
I casi sono 3:
1) La directory non esiste, ma tu sai che quello è il nome di una directory:
      iIndex := GetIconIndex('', FILE_ATTRIBUTE_DIRECTORY);
2) La directory esiste, ma tu non sai se quello è il nome di una directory o
di un file:
    if DirectoryExists(sNomeFile) then
      iIndex := GetIconIndex(sNomeFile, FILE_ATTRIBUTE_DIRECTORY)
    else
      iIndex := GetIconIndex(sNomeFile, FILE_ATTRIBUTE_NORMAL)
3) La dir non esiste e non sai se quello è un nome di dir o di file:
    AttachYourself(toTram);
