Afficher l'icone devant le nom d'un fichier icone (.ico)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Afficher l'icone devant le nom d'un fichier icone (.ico)

Message par omega »

Bonjour

Pour afficher l'icone d'un fichier devant son nom, il suffit d'utiliser
la procédure ci-dessous. Mais quand il s'agit d'un fichier-icone (.ico)
cette procédure ne donne rien.

Pourquoi cette procédure n'inclut pas ce type de fichiers ?

Code : Tout sélectionner

Procedure GetAssociatedFileIcon(IconPath.s, Value.l)
  Protected FileInfo.SHFILEINFO
  SHGetFileInfo_(IconPath, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_ICON | Value) 
  ProcedureReturn FileInfo\hIcon 
EndProcedure
Merci
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Afficher l'icone devant le nom d'un fichier icone (.ico)

Message par GallyHC »

Bonjour,

Car la fonction Windows "SHGetFileInfo" qui bien de l'API "shell32.dll" permet de retrouver une icone dans un fichier et non pas charger une icone pour cela il y a une autre fonction.

J'ai commencer un programme faisant ce que tu veux mais je n'utilise pas la fonction "SHGetFileInfo", car quand il y a beaucoup de fichier celle-ci peu avoir des gros problèmes et même dans mon cas faire planter PB.

En gros je charge toutes les icones en mémoire avec leurs extensions (genre *.bmp, ...). Après j'ai fait une fonction qui en fonction de l'extension me donne sont icone. Cela me permet d'être plus rapide et de na pas faire une chargement d'icone a chaque fois qu'il y a un fichier.

Après si c'est avec ton logiciel de FTP que cela ne fonctionne pas cela est normal car tu n'as que le listage pas l'icone réel. Il faudrait forcé le téléchargement du fichier pour pouvoir le charger dans ton soft (ce qui peu prendre du temps tout dépend).


Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Afficher l'icone devant le nom d'un fichier icone (.ico)

Message par Anonyme2 »

omega a écrit :Bonjour

Pour afficher l'icone d'un fichier devant son nom, il suffit d'utiliser
la procédure ci-dessous. Mais quand il s'agit d'un fichier-icone (.ico)
cette procédure ne donne rien.

Pourquoi cette procédure n'inclut pas ce type de fichiers ?

Code : Tout sélectionner

Procedure GetAssociatedFileIcon(IconPath.s, Value.l)
  Protected FileInfo.SHFILEINFO
  SHGetFileInfo_(IconPath, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_ICON | Value) 
  ProcedureReturn FileInfo\hIcon 
EndProcedure
Merci
Salut omega,
SHGetFileInfo nécessite le nom du fichier complet c'est-à-dire avec le chemin, il faut essayer de cette manière sur le site distant avec le http://blabal etc.
Ensuite comme le dit GallyHC, c'est peut-être pas sur que cela fonctionne sur des fichiers distants, d'ailleurs ce n'est pas que pour les .ico, mais comme je l'ai déjà écrit sur ce forum il y a peu, ce sont les icônes du shell connues au moment de l'appel.
GallyHC a écrit :Bonjour,

Car la fonction Windows "SHGetFileInfo" qui bien de l'API "shell32.dll" permet de retrouver une icone dans un fichier et non pas charger une icone pour cela il y a une autre fonction.

J'ai commencer un programme faisant ce que tu veux mais je n'utilise pas la fonction "SHGetFileInfo", car quand il y a beaucoup de fichier celle-ci peu avoir des gros problèmes et même dans mon cas faire planter PB.

En gros je charge toutes les icones en mémoire avec leurs extensions (genre *.bmp, ...). Après j'ai fait une fonction qui en fonction de l'extension me donne sont icone. Cela me permet d'être plus rapide et de na pas faire une chargement d'icone a chaque fois qu'il y a un fichier.

Après si c'est avec ton logiciel de FTP que cela ne fonctionne pas cela est normal car tu n'As que le listage pas l'icone réel. Il faudrait forcé le téléchargement du fichier pour pouvoir le charger dans ton soft (ce qui peu prendre du temps tout dépend).
Et puis, je répète, chaque icône est à détruire avec l'API des Destroyicon_()


Cordialement,
GallyHC
Salut GallyHC,
as-tu initialisé avec

Code : Tout sélectionner

CoInitializeEx_()
j'utilise ceci dans mon projet

Code : Tout sélectionner

CoInitializeEx_(0, #COINIT_APARTMENTTHREADED|#COINIT_SPEED_OVER_MEMORY|#COINIT_DISABLE_OLE1DDE)
puis à la fin de mon code

Code : Tout sélectionner

CoUninitialize_()
comme le dit MS dans la doc SHFILEINFO
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Afficher l'icone devant le nom d'un fichier icone (.ico)

Message par GallyHC »

Bonjour,

Cela te permet quoi ton utilisation de "CoInitializeEx"?

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Afficher l'icone devant le nom d'un fichier icone (.ico)

Message par Anonyme2 »

J'avais un plantage de mon code avec cet API (SHGetFileInfo), mais pas sur mes deux PC, sur un seul.
A partir du moment ou j'ai initialisé, plus de plantage.
Microsoft dit qu'il faut initialiser les composants du model objet (COM) avant d'utiliser SHGetFileInfo.
You must initialize Component Object Model (COM) with CoInitialize or OleInitialize prior to calling SHGetFileInfo.
Le lien microsoft
http://msdn.microsoft.com/fr-fr/library ... 85%29.aspx
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Afficher l'icone devant le nom d'un fichier icone (.ico)

Message par falsam »

Petite démo épurer de toutes fonctions de download ou upload. Juste pour montrer qu'il est inutile de charger les fichiers pour obtenir les icônes. Le résultat est le même que le rendu de FileZilla ou de n'importe quel autre logiciel de ftp.

J'ai laissé volontairement mes identifiants de connections afin de tester ce petit code. Pas de bétises avec FileZilla par exemple :mrgreen:

Code : Tout sélectionner

; FTP : Lecture du contenu d'une connexion FTP
;
; Contributor : falsam 
; OS          : Windows
; Purebasic   : 4.50++


EnableExplicit

Enumeration
  #Ftp
  #Mainform
  #FileExplorer
EndEnumeration

Define.l Event, GEvent, TEvent

;Structure qui contiendra les informations des fichiers ou dossiers
Structure DirectoryEntry
  Sort.s
  Type.s
  Name.s
  Size.l
  DateUpdate.l
EndStructure

Global NewList FTPDirectory.DirectoryEntry()

;Style de la fenetre principale
Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered

;Icone des dossiers par defaut
Global FolderIcon.l

Declare GetAssociatedFileIcon(IconPath.s, Value.l)
Declare FTPConnect()
Declare FTPReadDirectory()
Declare FTPDirectoryShow()
Declare Open_MainForm()
Declare Start()

;Cadrer une colonne à droite gauche ou au centre.
Procedure JustifyGadgetColumn(Gadget.l, Column.i, FMT.i)
  Protected Lvc.LV_COLUMN
  Lvc\Mask = #LVCF_FMT
  Lvc\FMT = FMT ;#LVCFMT_LEFT or #LVCFMT_CENTER or #LVCFMT_RIGHT                   
  SendMessage_(GadgetID(Gadget), #LVM_SETCOLUMN, Column, @Lvc)
EndProcedure

;Récupère l'icône associée à un fichier
Procedure GetAssociatedFileIcon(IconPath.s, Value.l)
  Protected FileInfo.SHFILEINFO
  SHGetFileInfo_(IconPath, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_ICON | Value) 
  ProcedureReturn FileInfo\hIcon 
EndProcedure

;Connection à un serveur ftp
Procedure FTPConnect()
 Protected FtpUrl.s, FtpPort.i, FtpUser.s, FTPPassWord.s
 
 ;Renseignez vos identifiants ftp
 FtpUrl = "s242132022.onlinehome.fr"
 FtpPort = 21
 FtpUser = "u48983622-pbr"
 FTPPassWord = "purebasicdemo"
 
 If OpenFTP(#ftp, FtpUrl, FTPUser, FTPPassWord, #PB_Ignore, FtpPort)
    FTPReadDirectory()
  Else
    MessageRequester ("Information","Ooops la connexion n'a pas pu se faire",#PB_MessageRequester_Ok)
  EndIf
  
EndProcedure

;Lecture des fichiers se trouvant sur le serveur ftp
;Chaque noms de fichier et dossiers est stocké dans une list
Procedure FTPReadDirectory()
  ClearList(FTPDirectory())
  ClearGadgetItems(#FileExplorer)
  SetGadgetText(#FileExplorer,"")
  If ExamineFTPDirectory(#ftp)
      While NextFTPDirectoryEntry(#ftp)
        AddElement(FTPDirectory())
        FTPDirectory()\Type=Str(FTPDirectoryEntryType(#ftp)) 
        FTPDirectory()\Name=FTPDirectoryEntryName(#ftp)        
        FTPDirectory()\Size=FTPDirectoryEntrySize(#ftp)
        FTPDirectory()\DateUpdate=FTPDirectoryEntryDate(#ftp)
        Select FTPDirectoryEntryType(#Ftp)
          Case 1
            FTPDirectory()\Sort="1"+FTPDirectoryEntryName(#Ftp)
            
          Case 2
            FTPDirectory()\Sort="0"+FTPDirectoryEntryName(#Ftp)
            
        EndSelect
      Wend
    EndIf
EndProcedure


;Affichage de la liste 
Procedure FTPDirectoryShow()
  Protected Name.s, Type.s, Size.s, Date.s, Icon.l
  
  SortStructuredList(FTPDirectory(),#PB_Sort_Ascending|#PB_Sort_NoCase, OffsetOf(DirectoryEntry\sort),#PB_Sort_String)
  
  ForEach FTPDirectory()
    
    Name = FTPDirectory()\Name
    Date = FormatDate("%dd/%mm/%yyyy %hh:%mm", FTPDirectory()\DateUpdate)
    
    Select FTPDirectory()\Type
      Case "1"
        Type="Fichier"
        Size = Str(FTPDirectory()\size)
        Icon = GetAssociatedFileIcon(FTPDirectory()\Name, #SHGFI_SMALLICON | #SHGFI_USEFILEATTRIBUTES)
        
      Case "2"
        Type="Dossier"
        Size=""
        Icon = FolderIcon
    EndSelect
    
    If Name <>"."
      AddGadgetItem(#FileExplorer,-1,Name + Chr(10) + Type + Chr(10) + Size + Chr(10) + Date, Icon)
    EndIf
    
  Next
EndProcedure  

Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 500, 400, "Ftp Demo", WindowStyle)
  ListIconGadget(#FileExplorer, 10, 10, 480, 380, "File", 200, #PB_ListIcon_FullRowSelect      )
  AddGadgetColumn(#FileExplorer, 1, "Type", 60)
  AddGadgetColumn(#FileExplorer, 2, "Taille", 60)
  AddGadgetColumn(#FileExplorer, 3, "Date", 100)
  justifyGadgetColumn(#FileExplorer, 2, #LVCFMT_RIGHT)
EndProcedure

Procedure Start()
  InitNetwork()
  Open_MainForm()
  FolderIcon = GetAssociatedFileIcon(GetHomeDirectory(), #SHGFI_SMALLICON)
  FTPConnect()
  FTPDirectoryShow()
  
EndProcedure

Start()

Repeat
  Event  = WaitWindowEvent(10)
  GEvent = EventGadget()
  TEvent = EventType()
  
  Select Event
    Case #PB_Event_Gadget
      Select GEvent   
        Case #FileExplorer
          If TEvent=#PB_EventType_LeftDoubleClick And GetGadgetItemText(#FileExplorer,GetGadgetState(#FileExplorer), 1) = "Dossier"
            SetFTPDirectory(#Ftp, GetGadgetItemText(#FileExplorer,GetGadgetState(#FileExplorer), 0))
            FTPReadDirectory()
            FTPDirectoryShow()
          EndIf
          
      EndSelect
           
    Case #PB_Event_CloseWindow
      CloseFTP(#ftp)
      End
      
  EndSelect
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Afficher l'icone devant le nom d'un fichier icone (.ico)

Message par GallyHC »

Bonjour falsam,

Oui je comprend tu fait que l'association d'une icone avec un type de fichier. Par contre ce que j'avais compris été plutôt de voir l'image d'un fichier *.ico et dans ce cas sans téléchargement du fichier je ne vois pas comment le faire?

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Afficher l'icone devant le nom d'un fichier icone (.ico)

Message par falsam »

GallyHC a écrit :Par contre ce que j'avais compris été plutôt de voir l'image d'un fichier *.ico et dans ce cas sans téléchargement du fichier je ne vois pas comment le faire?
Sans téléchargement tu ne peux pas. Une icone apparaîtra que si tu as le logiciel associé à l'extension du fichier installé sur ton ordinateur.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Afficher l'icone devant le nom d'un fichier icone (.ico)

Message par Anonyme2 »

Je suis comme GallyHC,
je croyais que omega voulais la vraie image pour chaque fichier ico et pas une image générique.

Voilà ma saisie d'écran à partir de ton code falsam.

Image
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Afficher l'icone devant le nom d'un fichier icone (.ico)

Message par falsam »

Denis a écrit :je croyais que omega voulais la vraie image pour chaque fichier ico et pas une image générique.
Oui Denis c'est ce qu'il souhaite. Mais la solution de télécharger chacun des éléments est très pénalisante voir même abérante.
Denis a écrit :Voilà ma saisie d'écran à partir de ton code falsam.
j'ai la même chose comme sur mon logiciel de ftp (FileZilla). Je ne connais pas de logiciel client FTP qui fasse ce que demande Omega.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Afficher l'icone devant le nom d'un fichier icone (.ico)

Message par omega »

je croyais que omega voulais la vraie image pour chaque fichier ico et pas une image générique.
C'est exactement ce que je veux. Chaque icône a sa propre image. C'est cette image que je souhaite afficher après transfert. Quand on affiche le contenu du chemin FTP, ça marche,
toutes les icônes sont bien affichées devant le nom de chaque fichier, mais quand je lance le transfert d'un fichier-icone (.ico) par exemple, l'image de l'icône n'est pas prise en considération
(seul le nom de l'icône apparait sur la liste des fichiers ftp) donc, c'est pendant le transfert
que ce problème devrait être réglé (et non pas durant l'affichage des fichiers ftp)

C'est juste une piste pour vous aider à réfléchir sur ce problème... (pendant le transfert)

Le même problème se pose pour les dossiers (là il s'agit de la même image standard d'un dossier)
je l'ai découvert hier ce problème encore...

Merci
Win7 (x64) 64 bits Pb 5.72
Répondre