salut a tous,
comment faire pour trouver lister les fichiers d'un repertoire dans un treeview ou list view et surtout affichier les icons suivant le type de fichiers?
Version imprimable
salut a tous,
comment faire pour trouver lister les fichiers d'un repertoire dans un treeview ou list view et surtout affichier les icons suivant le type de fichiers?
Salut
Tu dois associer une ImageList au TreeView et ensuite affecter un numéro d'image au noeud en fonction du type de fichier.
y a pas une autre solution?
je veux dire y a pas un moyen de recuperer les icons system de tel ou tel autres fichiers?
je vais pas devoir creer autant de image que de type de fichier?
dois bien avoir une autre soluce qd meme?
genre recupere l'icon d'un fichier? non?
Fais une recherche approfondie sur le forum avec "ExtractIcon", où un truc comme ça.
bon, je suis arrive ici:
ceci me recupere l'icone de l'application dans IconAppCode:
1
2 HICON IconApp; IconApp = ExtractIcon(HInstance, NomFichier, 0);
mais je vois pas du tout comment faire pour charger l'icon du fichier dans le listview
Si qq a une piste?Code:
1
2
3
4
5
6
7
8 if (OpenDialog1->Execute()) { ListItem = ListView1->Items->Add(); ListItem->Caption = OpenDialog1->FileName; ListItem->SubItems->Add("taille"); ListItem->SubItems->Add("attribut"); ListItem->SubItems->Add("date"); }
pour afficher les icones correspond a un fichier, je passe par un TImageList contenant les icones.
ensuite il suffit de mettre a jour la propriété ImageIndex de ton item.
Pour remplir un TImageList avec les icones des fichiers :
Code:
1
2
3
4
5
6
7
8 DWORD ImageHandle; SHFILEINFO info; ImageHandle = SHGetFileInfo("", 0, &info, sizeof(info), SHGFI_ICON | SHGFI_LARGEICON | SHGFI_SYSICONINDEX); if (ImageHandle != 0) { ObjImgFichierLarge->Handle = ImageHandle; ObjImgFichierLarge->ShareImages = true; }
Miky
bon voila, j'ai place dans une form:
un Tbutton, un Topendialogue, un Timagelist, un Tlistview et dans l'evenement buttonclick j'ai mis ceci:
mais sa fonctionne toujours pas! je ne recupere pas l'icon du fichier! :cry:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 void __fastcall TForm1::Button1Click(TObject *Sender) { TListItem *ListItem; DWORD ImageHandle; SHFILEINFO info; OpenDialog1->Title = "Visualisation de l'icon"; if (OpenDialog1->Execute()) { ImageHandle = SHGetFileInfo(OpenDialog1->FileName.c_str(), 0, &info, sizeof(info), SHGFI_ICON | SHGFI_LARGEICON | SHGFI_SYSICONINDEX); if (ImageHandle != 0) { ListView1->ViewStyle = vsIcon; ListView1->SmallImages = ImageList1; ListView1->LargeImages = ImageList1; ImageList1->Handle = ImageHandle; ImageList1->ShareImages = true; ListItem = ListView1->Items->Add(); ListItem->Caption = ExtractFileName(OpenDialog1->FileName); } } }
j'ai un icon qui represente une main! 8O
je comprends pas du tout
salut,
Il te manque l'affectation de l'icon dans l'item de ta liste (ListItem->ImageIndex) .
je ne connais plus le nom exacte de la propriété, mais c'est dans "info"
Par contre, ce que je fais, j'appel
dans la création de mon formulaire, cela initialise mon TImageList.Code:
1
2
3 ImageHandle = SHGetFileInfo("", 0, &info, sizeof(info), SHGFI_ICON | SHGFI_LARGEICON | SHGFI_SYSICONINDEX); ...
Puis lorsque j'ai besoin de connaitre l'icone d'un fichier, j'appel
et cela me retourne l'index de l'icone se trouvant dans le TImageListCode:
1
2
3 ImageHandle = SHGetFileInfo(nomFichier, 0, &info, sizeof(info), SHGFI_ICON | SHGFI_LARGEICON | SHGFI_SYSICONINDEX); ...
merci pour ton aide mikyfpc mais rien ne fonctionne! :( :? :cry:
A l'aide! j'en peux plus!
voilà le code exact d'une fonction que j'utilise pour récupérer l'icone d'un fichier.
Au préalable, dans le constructeur de ma form, je fais :
Code:
1
2
3
4
5
6
7 SHFILEINFO info; DWORD ImageHandle = SHGetFileInfo("", 0, &info, sizeof(info), SHGFI_ICON | SHGFI_SMALLICON | SHGFI_SYSICONINDEX); if (ImageHandle != 0) { ObjImageFichier->Handle = ImageHandle; // ObjImageFichier est un TImageList ObjImageFichier->ShareImages = true; }
J'ai attaché mon objet TImageList a ma listview (SmallImage pour mon cas)
Et la, c'est le code de ma fonction qui place l'icone du fichier
Code:
1
2
3
4
5
6
7
8
9
10
11
12 SHFILEINFO info; DWORD result; ... result = SHGetFileInfo(filenamepath.c_str(), 0, &info, sizeof(info), SHGFI_TYPENAME | SHGFI_ICON |SHGFI_SMALLICON | SHGFI_SYSICONINDEX); if(result != 0) { pItem->ImageIndex = info.iIcon; } ...
il se passe quoi dans ton cas ? Erreur de compil, erreur d'execution, ou rien ?
voila le source de mon code avec tes modifs!
j'ai une fenetre Debbugger Exception Notification avec ecris:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; SHFILEINFO info; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { DWORD ImageHandle = SHGetFileInfo("", 0, &info, sizeof(info), SHGFI_ICON | SHGFI_SMALLICON | SHGFI_SYSICONINDEX); if (ImageHandle != 0) { ObjImageFichier->Handle = ImageHandle; // ObjImageFichier est un TImageList ObjImageFichier->ShareImages = true; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { DWORD result; TListItem *pItem; OpenDialog1->Title = "Visualisation de l'icon"; if (OpenDialog1->Execute()) { result = SHGetFileInfo(OpenDialog1->FileName.c_str(), 0, &info, sizeof(info), SHGFI_TYPENAME | SHGFI_ICON |SHGFI_SMALLICON | SHGFI_SYSICONINDEX); if(result != 0) { pItem->ImageIndex = info.iIcon; pItem = ListView1->Items->Add(); pItem->Caption = ExtractFileName(OpenDialog1->FileName); }
Project .exe raised execption class EAccessViolation with message 'Access violation at adresse 4013cffb in module vcl60.bpl. read of adresse 00000025. process Stopped. use step or run to conitnue.
si je fais run sa me donne :
'Access violation at adresse 4013cffb in module vcl60.bpl. read of adresse 00000025.
le probleme vient de ta création d'item. Tu déclares un pointeur vers un TListItem et tu essayes de renseigner ImageIndex avant l'allocation de ton pointeur.
Code:
1
2
3
4
5 TListItem *pItem; pItem = ObjLFichiers->Items->Add(); pItem->ImageIndex = info.iIcon; etc...
Merci mikyfpc sa marche nickel!
j'avais pas capter l'histoire d'allocation! :wink:
merci bien! vais pouvoir finir le reste de mon prog!
tu pense que dans le cas d'un fichier sur une serveur ou fichier sur FTP sa marche aussi?