[ASTUCE] COMMENT AFFICHER LES ICÔNES DES FICHIERS LISTÉS DANS UN TFILELISBOX

cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 - 9 janv. 2007 à 07:07
the clansman Messages postés 1 Date d'inscription jeudi 3 mars 2005 Statut Membre Dernière intervention 17 octobre 2008 - 17 oct. 2008 à 16:35
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41025-astuce-comment-afficher-les-icones-des-fichiers-listes-dans-un-tfilelisbox

the clansman Messages postés 1 Date d'inscription jeudi 3 mars 2005 Statut Membre Dernière intervention 17 octobre 2008
17 oct. 2008 à 16:35
Salut,

Je viens de tomber sur ce code, et c'est de la bombe en boite ! Félicitations à l'auteur !

Par contre, si l'auteur ne sait pas quoi faire pour améliorer son code, j'ai des idées (à défaut des compétences pour modifier le composant moi même ;) ).

1. Quand un répertoire est caché, l'afficher 'en pale'
1 bis. De la même manière, quand un fichier est caché, dans TFileListBox, on pourrait, là aussi, l'afficher en pâle...
2. Dans le répertoire C:\Documents and Settings\\Favoris, on remarque que cette icone est une étoile... En effet, elle est définie par le fait que ce répertoire contient un fichier (caché) desktop.ini contenant le chemin de l'icone.
3. Pour le TDirectoryListBox, dans la procédure SetBmp, je préfère (mais ce n'est qu'un avis personnel) avoir de petites icones, que des grandes. Ainsi, au lieu d'avoir :
Flags := SHGFI_ICON Or SHGFI_LARGEICON;
J'ai plutôt fait :
Flags := SHGFI_ICON Or SHGFI_SMALLICON;
C'est un détail...

En tous cas, je vous félicite tous à nouveau car ce code est terrible.

A+

Philippe.
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
3 juil. 2007 à 13:59
Bonjour à tous,

@ cirec, comme cela c'est plus clair, loin de moi de mettre en doute tes capacités.

Je n'ai pas pensé au point d'arrêt .

De plus, c'est déjà surprenant avec un composant obsolète de pouvoir afficher les icônes avec clarté.

Merci pour la correction

@+,

Cincap
Utilisateur anonyme
3 juil. 2007 à 13:37
Tu me déçois un peut là ....
Si tu avais pris le temps (2 secondes) de mettre un point d'arrêt dans l'unité concernée tu aurais pu remarquer que l'erreur vient de borland ... et plus exactement du TFileListBox.

Quand aucune sélection n'est faite ou que la liste est vide, ItemIndex renvoi -1
Jusque là rien d'anormal ...
Mais si la propriété MultiSelect est à True ItemIndex renvoi 0 et ce même si la liste est vide

Il suffit donc de remplacer dans "procedure TFileListBox.CMHintShow"
Ceci : If ItemIndex > -1 Then

Par : If (ItemIndex > -1) and (ItemIndex < Count) Then

et ça fonctionne ;-)
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
2 juil. 2007 à 16:57
Bonjour à tous,

@ cirec, j'espère que tu vas bien, je constate en utilisant ton unité (CustomFileCtrl.pas), que si avec le composant "TfileListbox", sa propriété "Multiselect" est à true, on obtient une erreur en le survolant avec la souris dans le cas ou le mask de ce composant affiche une extension définie ex: *.avi et que l'on se rend dans un répertoire ou dossier ou il n'y a pas ces fichiers avec cette extension.

@+,

Cincap
cs_dugueclin Messages postés 66 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 10 juillet 2012
10 févr. 2007 à 14:22
Bonjour à tous,
Désolé de répondre aussi tardivement.

Merci Cirec pour ton formidable code!!! j'ai qu'une chose à dire: Félicitation!!!

je l'utilise dans un de mes project.L'affichage des icônes est plus jolis.
Vivement la mise à jour !!!.

par contre,j'utilise la procédure suivante:
// je liste des classeurs excels.Vous la connaissez tous je pense...

Trouve:=FindFirst(('C:\Mes documents')+'*.xls*',faAnyFile, Fichiers);
While Trouve=0 do
begin
Filename:=Fichiers.Name;
Trouve:=FindNext(Fichiers);
ExtPart:=ExtractFileExt(FileName);
LgExt:=Length(ExtPart);
Delete(FileName, Length(FileName)-LgExt+1,LgExt);
Result:=(FileName);
FileListBox1.Items.Add(Result);
end;
begin
FindClose(Fichiers);
end;

mais le problème c'est que, ben ça marche plus et je n'ai pas réussi à déclarer le repertoire ainsi que l'extention ".xls" dans le fichier CustomFileCtrl.pas.

Quelqu'un pourrait-il me dire comment faire??.dans le TJanFileListBox j'avais réussi à le modifier, mais là, avec le nouveau code c'est plus compliqué pour moi.
En vous remercient par avance et en re-félicitant l'auteur,
Sincères salutations et bon codding à tous
Utilisateur anonyme
16 janv. 2007 à 15:32
Alors ... après quelques petits testes j'en arrive aux mêmes résultats que toi :(

tout ce que j'ai réussi a obtenir pour l'instant c'est soit:

un chargement lent et un défilement rapide

un chargement rapide et un défilement lent ... (rien de neuf quoi )

j'ai même essayer un chargement "progressif" par tranche de 200 où 500 Items ....
celle-ci donne de bon résultat intermédiaire (quand on scroll) mais saccadé à cause des chargements répétitifs

Mais j'ai une alternative à vous proposer ... qui je pense (enfin j'espère qu'elle) vous plaira

je ne vous dis pas ce que c'est ... ha ha ha :)
Mais je vous invite à suivre l'évolution de la prochaine mise à jour qui devrait intervenir, si tout va bien, dans la journée ;)

J'en prévoie encore une mise à jour, mais pas dans l'immédiat, mais là encore je garde le mystère sur cette petite évolution qui devrait élever notre bon vieux TFileListBox à un niveau plus acceptable ... Si tout se passe bien ;-)

DrJérome : juste pour information ...
durant mes testes j'ai essayé comme toi d'utiliser ExtractAssociatedIcon à la place de SHGetFileInfo mais les délais de chargements me paraissent plus long

@+
Cirec
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
13 janv. 2007 à 07:48
Hello !

j'ai essayé de charger en mémoire les icônes (par exemple pour "system32") c'est lent à charger c'est rapide à scroler...

j'ai essayé des méthodes intermédiares non concluantes pour le moment (un coup c'est rapide un coup ça rame)

tu as du nouveau Cirec sur les méthodes intermédiaires?
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
12 janv. 2007 à 11:48
Bonjour,

J'avais retrouvé le lien exact d'ou ma question à Japee.

Au sujet des tests concernant Tfilelistbox, j'ai oublié de préciser que lors du click sur le dossier C:\Windows\System32, le code de JROD est plus rapide pour créer la liste des fichiers contenus dans ce dossier et une fois chargée moins rapide lors du click et maintien du bouton de l'ascenseur.

Alors que le tien c'est le contraire, moins rapide pour créer la liste des fichiers contenus dans ce dossier et une fois chargée plus rapide lors du click et maintien du bouton de l'ascenseur.

Les deux sources sont remarquables en soi.

@+,

Cincap
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
12 janv. 2007 à 09:38
! lire HALFTONE.

@+
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
12 janv. 2007 à 09:37
Bonjour,

@ Japee, tu es certain que ce lien

http://www.phidels.com/php/forum/
forum.php3?forumtable=posts&mode=showpost&postid=112071,

corresponde à ton message au sujet de XPman ?

Pour le Hajftone, Je connaissai aussi Jean-Yves Qienec qui était aussi un crack dans la manipulation des bmp et qui a laissé assez bien de sources en ce sens.

@+,

Cincap
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
11 janv. 2007 à 10:43
en fait dans mon code les icones sont configurables automatiquement pour avoir toutes les tailles (proportionnellement à TfileListbox.itemHeight)

drjerome JROD
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
11 janv. 2007 à 09:55
Bonjour,

Comme l'a rappelé JAPEE, ces améliorations concerne l'interêt technique et je pense une petite attention sympathique pour les malheureux qui utilisent ce légendaire composant.

Encore bravo aux deux solutions proposées.

Au fait JROD les icones dans ton code, peuvent t'ils aussi être configurés à 32x32 ?

@+,

Cincap
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
11 janv. 2007 à 07:56
Salut,

merci pour avoir testé ;)

j'ai trouvé l'amélioration pour la fluidité

je n'ai pas Delphi ici.

Je vous donnerai le code à tester ce soir

drjerome

A+
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
10 janv. 2007 à 23:50
Bonsoir,

Avec les 2 applications, dans "c:/windows/system32" je constate que le code de JROD lors uniquement du click sur l'ascenseur (pas sur les boutons en haut et bas), mon disque dur est sollicité par contre celui de Cirec, cela est fluide.

Lors du test avec les boutons haut et bas, le code de JROD à l'air plus fluide tout comme celui de Cirec.

@+,

Cincap
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
10 janv. 2007 à 21:17
(ps : j'ai 2118 fichiers dans system32 ça a l'air ok)
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
10 janv. 2007 à 21:15
RE ;)

j'ai essayé une méthode intermédiaire... c'était pas fameux (j'ai pas dû être bon)

Par contre mon code original ne présente pas le problème d'ascenseur au scroling, j'ai essayé avec "c:/windows/system32" (car ce dossier contient beaucoup de fichiers)

ça marche en spontané

il ne faut pas utiliser le 1° exécutable (celui du zip) il présentait un composant "Image1" qui retardait tout

vous me direz comment ça marche chez vous (pour mémoire le code est ici : http://www.phidels.com/php/forum/forum.php3?forumtable=posts&mode=showpost&postid=112071)

merci de me communiquer vos tests

drjerome
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
10 janv. 2007 à 15:54
Bonjour,

@ Cirec, j'avais remarqué ce petit plus lors du click sur le fichier, fallait y penser !

Et j'avais bien compris que la propriété canvas n'était pas public.

Encore bravo à vous deux pour cet excellent code.

@+,

Cincap
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
10 janv. 2007 à 15:31
Salut,

oui c'est intéressant de faire le chargement des icônes sur un modèle intermédiaire ça ne devrait pas poser de problème.

En ce moment je suis surbooké (orthographe ?), de mon côté ce ne sera pas immédiat (je précise)... mais bon, il faut aussi garder le contact avec nos proches sinon on fait de l'overdose de Delphi (hi! hi!)

Bonne prog drjerome
Utilisateur anonyme
10 janv. 2007 à 14:53
Bon alors il faut quand même que je réponde ... lol

Merci à vous pour vos appréciations et remarques.

ensuite :

Je n'utilise pas du tout la même méthode que DrJérome que ce soit pour récupérer ou pour afficher les Icônes dans le FileLisBox (avec les mêmes résultats)

La ou il pourrait y avoir similitude c'est dans le TDirectoryListBox et TDriveComboBox
Mais c'est déjà hors "challenge" ... lol

Ensuite sur des gros répertoires ta version est effectivement plus rapide que la mienne mais de loin pas aussi fluide ...

Pourquoi ?

Tout simplement parce que je charge une fois pour toute les Icônes de tout le répertoire en une fois ... Alors que toi tu recharges l'icône a chaque appel de la Méthode : DrawItem

Donc si tu charges le répertoire Systèm32 avec ta méthode le chargement initial est plus rapide certes mais la navigation dans le répertoire est ralenti pour cause de chargement d'icônes répétés ce qui chez moi ne se fait pas et du coup l'affichage est beaucoup plus rapide et fluide (avec l'ascenseur vertical)

Je vais peut être réfléchir à une méthode intermédiaire:
Entre le chargement complet et partiel bien sûr sans re-chargement à chaque affichage :) (à voir)


Autre chose : vous pouvez mettre deux ou trois TFileListBox sur une même fiche et tout fonctionne parfaitement

Et pour ceux qui ne l'aurait pas encore remarqué vous pouvez cliquer sur un Fichier de la FileListBox pour voir s'afficher des informations supplémentaires (à vous de les compléter si vous en voulez plus)

Sinon moi aussi je code sous D4 Pro
à ce propos:
@Japee : si ça t'intéresse j'ai fait un XPMan pour D4
ce qui est plus facile d'utilisation que les autres méthodes :)

ps : je confirme pour HALFTONE de DrJérome c'est grâce à lui que je connais cette astuce

et pour répondre à Cincap la propriété Canvas existe belle et bien dans TFileListBox mais elle n'est pas public (pas accessible) pour qu'elle le devienne tu dois dériver la Class TFileListBox comme nous l'avons fait DrJérome et moi même. Mais l'existence d'un Canvas n'est pas obligatoire pour pouvoir dessiner sur un composant mais c'est un autre débat ...

@+
Cirec
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
10 janv. 2007 à 10:22
@ JROD

Je l'ai constaté.

Je viens de faire une application de test avec ta méthode et c'est aussi superbe et rapide, le challenge est donc atteint.

Donc excellent travail et bravo pour l'astuce "Halftone".

Bonne continuation.

@+,

Cincap
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
10 janv. 2007 à 09:53
oups j'ai oublié de répondre au dernier point

j'ai utilisé le canvas du TfileListBox dans ma méthode
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
10 janv. 2007 à 09:24
merci

sans rancune également

drjerome
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
10 janv. 2007 à 09:16
Bonjour JROD,

Tu as raison, cette annotation est relative au "sans réponse à mon message privé concernant ton exe" donc pas de problème avec ce qui vient de se passer et sans rancune.

Comme confirmé, je programme sous D6 pour mon usage personnel et comme déjà dit, je suis plus attiré par la difficulté du code concernant un composant comme dans ce cas le TfileListBox et de constater jusqu'ou on peut aller pour le forcer à d'autres propriétés, car je ne pense pas que la propriété canvas de ce composant existe.

Bravo à JROD et à CIREC.

@+,

Cincap
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
10 janv. 2007 à 09:02
PS : ce n'est pas moi qui ai dit : "Pour les pauvres malheureux, qui codent encore sous D4"
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
10 janv. 2007 à 08:06
Bonjour,

@ DRJEROME "je répondais à "dugueclin", c'était entre lui et moi, je n'ai jamais fait de promesse à CINCAP,en plus CINCAP a été tellement désagréable que je ne voyais aucune raison de lui répondre"

Je ne vais pas polémiquer sur ce sujet, mais je tiens à dire que j'ai été toujours très correct au sujet de mes messages.

Je pensais qu'un forum ne se limitait pas à "je répondais à "dugueclin", c'était entre lui et moi".

Je pensais aussi que le fait d'avoir trouver une astuce (souvent mélangée avec les astuces d'autres !) devait mettre sur le devant de la scène l'auteur.

Pour les pauvres malheureux, qui codent encore sous D4, pour ma part, je code sous D6 (ce qui me convient parfaitement) mais je sais que tout le monde n'a pas Internet, et surtout ne peu suivre l'évolution des logiciels.

Mettre des icones dans un TfileListBox est plus un challenge que de l'utiliser.

La connaissance s'accroît quand on la partage.

Sinon sans rancune si j'ai sans intention, froissé l'ego de certains.

@+,

Cincap
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
10 janv. 2007 à 00:21
PS: drjerome = JROD
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
10 janv. 2007 à 00:19
Hello les gars,

j'avais transformé le zip qui vous tracassais en code ici :

http://www.phidels.com/php/forum/forum.php3?forumtable=posts&mode=showpost&postid=112071

je répondais à "dugueclin", c'était entre lui et moi, je n'ai jamais fait de promesse à CINCAP,en plus CINCAP a été tellement désagréable que je ne voyais aucune raison de lui répondre

Ma méthode n'est pas phénoménale... effectivement elle fait appel à une "class" modifiée + mon classique "HALFTONE" dont je suis le premier à en avoir parlé sur le présent site (CIREC peut me citer à ce sujet, il n'ya pas de problème)

Il me semble toutefois que ma méthode d'appel d'icône agit bien dans les dossiers où il y a beaucoup de fichiers (plus de rapidité, de fluidité) et il y a beaucoup d'amélioration à faire (mais bon ça donne des idées de base).

On peut l'adapter à d'autres composants

je peux me tromper... et je n'ai pas la science infuse.

Je rappelle qu'ici on n'a aucune obligation et on évite les phrase u style "je veux, j'exige, urgent etc..."

j'ai un boulot qui me prend du temps et je ne coche pas la case "être averti par mail", ça m'évite les tonnes d'emails que nous font subir les différents forums

Donc désolé si je ne réponds pas en direct

bonne nuit à tous

drjerome
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
9 janv. 2007 à 23:22
Bonsoir,

On fait confiance à DorotheeJ pour mettre DRJerome au courant des dernières évolutions du débat, pas vrai ? ;-)

Cirec > Simplement bravo et merci.
- Bravo pour l'intérêt technique du code. Je n'ai pas encore eu le temps de me pencher sur ses finesses, mais je compte bien le faire, tu peux me croire.
- Merci de mettre à la disposition des pauvres malheureux qui codent encore sous D4 cette belle TFileListBox qui agrémentera leurs tristes interfaces (ah, les beaux ShellListView et ShellListView des versions ultérieures...) :-)

A +
DorotheeJ Messages postés 7 Date d'inscription mardi 24 août 2004 Statut Membre Dernière intervention 9 janvier 2007
9 janv. 2007 à 22:26
en fait tu aimerais connaître sa méthode ? laisse-lui le temps de répondre, il n'a peut-être pas suivi la fin du débat
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
9 janv. 2007 à 22:02
Bonsoir,

@ DorotheeJ, pourquoi après des messages d'insistance, l'ami DRJEROME n'a jamais répondu, n'a jamais voulu montrer même un bout de code de son astuce.

Je pense tout simplement que si il avait su faire cette application sans composant externe, il n'aurait pas hésité à le placer sur le forum, car vu la difficulté, personne sur les forums n'a su répondre à ce challenge.

Nous a t'il tous bluffé ??????????????????????

L'important c'est que l'ami CIREC n'a pas hésité à en faire profiter tout le monde et je l'en félicite.

@+,

Cincap
DorotheeJ Messages postés 7 Date d'inscription mardi 24 août 2004 Statut Membre Dernière intervention 9 janvier 2007
9 janv. 2007 à 19:46
bonjour,

finalement tu as fait comme t'avais indiqué "DRJEROME", j'ai reconnu aussi la méthode "halftone" de "DRJEROME" (il avait réussi à réduire les icônes de manière jolie avec la méthode qu'il utilisait déjà pour les images)

merci à tous les deux

Dorotheej
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
9 janv. 2007 à 10:03
Mon premier message à l'air d'avoir été effacé.

Bonjour,

Bravo pour ce super code qui répond au challenge lancé il y a quelque temps.

Cela ne m'étonne pas que ce soit l'ami Cirec à l'origine de cette réponse, comme quoi.............

@+,

Cincap
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
9 janv. 2007 à 09:59
Salut,

Désolé d'être empéché de mettre ma note 10/10.

Ce problème persiste assez souvent.

@+,

Cincap
Rejoignez-nous