Page 1 sur 1
Afficher l'icone devant le nom d'un fichier icone (.ico)
Publié : lun. 18/mars/2013 14:27
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
Re: Afficher l'icone devant le nom d'un fichier icone (.ico)
Publié : lun. 18/mars/2013 14:37
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
Re: Afficher l'icone devant le nom d'un fichier icone (.ico)
Publié : lun. 18/mars/2013 15:10
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
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
comme le dit MS dans la doc SHFILEINFO
Re: Afficher l'icone devant le nom d'un fichier icone (.ico)
Publié : lun. 18/mars/2013 15:25
par GallyHC
Bonjour,
Cela te permet quoi ton utilisation de "CoInitializeEx"?
Cordialement,
GallyHC
Re: Afficher l'icone devant le nom d'un fichier icone (.ico)
Publié : lun. 18/mars/2013 17:16
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
Re: Afficher l'icone devant le nom d'un fichier icone (.ico)
Publié : lun. 18/mars/2013 17:16
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
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
Re: Afficher l'icone devant le nom d'un fichier icone (.ico)
Publié : lun. 18/mars/2013 17:29
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
Re: Afficher l'icone devant le nom d'un fichier icone (.ico)
Publié : lun. 18/mars/2013 17:41
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.
Re: Afficher l'icone devant le nom d'un fichier icone (.ico)
Publié : lun. 18/mars/2013 17:45
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.

Re: Afficher l'icone devant le nom d'un fichier icone (.ico)
Publié : lun. 18/mars/2013 18:03
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.
Re: Afficher l'icone devant le nom d'un fichier icone (.ico)
Publié : mar. 19/mars/2013 8:09
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