ListView et Initialisation ListImage

ChTi160

XLDnaute Barbatruc
Bonjour à toutes et à Tous

je me suis interressé aux ListView et ce présente à moi un problème que je n'arrive pas a résoudre

j'ai un Userform avec une ListView j'aimerai inclure une icon dans la Colonne 1 et j'ai un message

Code:
Private Sub UserForm_Initialize()
Rem On place le Listview en mode rapport
Rem qui permet de créer des colonnes
LV_Trains.View = lvwReport
Dim imgX As ListImage
Dim wItem As ListItem

Me.ImageList1.ListImages.Clear
Me.ImageList1.ImageHeight = 16
Me.ImageList1.ImageWidth = 16
Set imgX = Me.ImageList1.ListImages.Add(, , LoadPicture(ThisWorkbook.Path & '\\' & 'printer.ico'))

Rem Création des colonnes
Call LV_Trains.ColumnHeaders.Add(, , 'Départ', LV_Trains.Width / 4)
Call LV_Trains.ColumnHeaders.Add(, , 'Heure', LV_Trains.Width / 4)
Call LV_Trains.ColumnHeaders.Add(, , 'Arrivée', LV_Trains.Width / 4)
Call LV_Trains.ColumnHeaders.Add(, , 'Heure', LV_Trains.Width / 4)
'-----------

Rem Ajout de la première ligne

Set wItem = Me.LV_Trains.ListItems.Add(, , 'Chambéry',1,1)
wItem.SubItems(1) = '06:00'
wItem.SubItems(2) = 'Paris'
wItem.SubItems(3) = '09:15'

Rem Ajout de la deuxième ligne
Set wItem = LV_Trains.ListItems.Add(, , 'Chambéry')
wItem.SubItems(1) = '15:30'
wItem.SubItems(2) = 'Lyon'
wItem.SubItems(3) = '17:15'


End Sub
je devrais normalement Lol
au niveau de cette ligne inclure l'icone d'index 1 de ma ListImage1 dans la Colonne 1(0)de ma listView
Set wItem = Me.LV_Trains.ListItems.Add(, , 'Chambéry',1,1)
j'ai un message ImageList doit être initialisé avant de pouvoir être utilisé
alors que je peux utiliser cette image dans la procèdure suivante
Code:
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim Ctrl As Control

For Each Ctrl In Me.Controls
        If TypeOf Ctrl Is CommandButton Then
            Ctrl.MousePointer = 99
            Set Ctrl.MouseIcon = Me.ImageList1.ListImages(1).Picture
        End If
Next
End Sub
c'est donc que ImageList a bien était Initialisé non ??????
si quelqu'un peut me dire ou le Bas Blesse et m'indiquer la marche a suivre pour résoudre ce problème(un petit exemple )
Merci D'avance

Message édité par: Chti160, à: 20/10/2005 12:54
 

Gibson94

Nous a quitté
Repose en paix
Salut Jean-Marie, le forum,

Tu peux pas poser une question plus facile pour commencer...lol

Si tu remplaces 'Chambéry' par 'Brunoy' et tu colles ton avatar à la place de ton icone number one... je suppose que çà va toujours planter...lol... T'en as pas assez de te compliquer la vie, il faut que tu viennes compliquer la nôtre avec tes histoires de trains qui se croisent...

Bon, c'était juste pour te dire un p'tit bonjour au passage (du train pour Chambéry...) Allez, tant que le message d'erreur ne vient pas de la SNCF, t'as de l'espoir...

Ahhh...c'est toujours passionnant ces histoires de trains, de tête de train et d'arrière train...lol
 

ChTi160

XLDnaute Barbatruc
Salut
arfff
je vois un message et c'est qui????
c'est Guy qui vient me parler du boulot

tu vas bien j'espère ,j'essaie d'apprendre mais c'est pas évident malgré mes nombreuses recherches je ne comprends pas pourquoi, je n'y arrive pas Lol

Enfin j'attends avec impatience la visite de Michel XLD pour qu'il me sorte de cette impasse Lol
j'ai consulté sa Page WiKi mais bon
A plus Guy et bonne fin de Journée
 

MichelXld

XLDnaute Barbatruc
bonjour chers Jean-Marie et Guy


Jean-Marie : tu m'apelles , j'accoures ...

j'espere que cette adaptation répondra à ta demande (testé avec Excel2002 et WinXP)
je te laisse decouvrir les modifications


Private Sub UserForm_Initialize()
Dim imgX As ListImage
Dim wItem As ListItem

LV_Trains.View = lvwReport

Me.ImageList1.ListImages.Clear
Me.ImageList1.ImageHeight = 16
Me.ImageList1.ImageWidth = 16
Set imgX = _
Me.ImageList1.ListImages.Add(, 'AA', LoadPicture(ThisWorkbook.Path & '\\\\\\\\' & 'printer.ico'))

LV_Trains.SmallIcons = ImageList1

Call LV_Trains.ColumnHeaders.Add(, , 'Départ', LV_Trains.Width / 4)
Call LV_Trains.ColumnHeaders.Add(, , 'Heure', LV_Trains.Width / 4)
Call LV_Trains.ColumnHeaders.Add(, , 'Arrivée', LV_Trains.Width / 4)
Call LV_Trains.ColumnHeaders.Add(, , 'Heure', LV_Trains.Width / 4)
'-----------

Rem Ajout de la première ligne
Set wItem = Me.LV_Trains.ListItems.Add(, , 'Chambéry')
wItem.SubItems(1) = '06:00'
wItem.SubItems(2) = 'Paris'
wItem.SubItems(3) = '09:15'
wItem.SmallIcon = 'AA'

Rem Ajout de la deuxième ligne
Set wItem = LV_Trains.ListItems.Add(, , 'Chambéry')
wItem.SubItems(1) = '15:30'
wItem.SubItems(2) = 'Lyon'
wItem.SubItems(3) = '17:15'
wItem.SmallIcon = 'AA'
End Sub



bonne soiree
MichelXld
 

ChTi160

XLDnaute Barbatruc
Salut Michel

tout d'abord merci de veiller et de répondre à ces compléments d'infos
je suis aller sur ta page WiKi j'ai beaucoup appris
je viens de tester et ça marche

j'ai testé en faisant varier la valeur de LV_Trains.View = 0 to 3

peut on adapter ce code pour que cet Icone se situe dans l'entête de Colonne
aurais tu un syte à me conseiller pour en apprendre plus sur ce type de Control?

Merci par Avance
 

ChTi160

XLDnaute Barbatruc
bonsoir MichelXLD
bonsoir le fil
sans prétention mis ici on partage
donc Michel je me permet puisque tu ne savais si l'on pouvait mettre des icones dans les ent^tes de colonnes eh bien OUI j'ai cherché et j'ai adapté ce que j'ai trouvé
je me permettrai peut être de mettre un petit fichier exemple qui reprendra ces diverses possibilités d'adaptation des colonnes et autres entêtes de colonne.
Donc pour Info
Dim imgX As ListImage
après avoir approvisionné le ListImage
For i = 1 To 4

Set imgX = ImageList1.ListImages.Add(, 'AA' & i, LoadPicture(ThisWorkbook.Path & '\\' & 'img' & i & '.ico'))

Next
il faut lier les entêtes de colonne au listImage

Set LV_Trains.ColumnHeaderIcons = ImageList1

'ici rempli les entêtes de colonne avec une îcones 'AA4'ou 'AA3'
'sans texte en colonne 1
Call LV_Trains.ColumnHeaders.Add(, , , LV_Trains.Width / 4, , 'AA4')
'sans îcone en colonne 2
Call LV_Trains.ColumnHeaders.Add(, , 'Heure', LV_Trains.Width / 4)
'avec texte et îcone en colonne 3
Call LV_Trains.ColumnHeaders.Add(, , 'Arrivée', LV_Trains.Width / 4, , 'AA3')

Call LV_Trains.ColumnHeaders.Add(, , 'Heure', LV_Trains.Width / 4, lvwColumnCenter)
une autre méthode en colonne 1 on colle l'îcone d'index 2
LV_Trains.ColumnHeaders(1).Icon = 2

en espèrant avoir fait avancer le sujet Lol
A Bientôt

Message édité par: Chti160, à: 22/10/2005 22:24
 

ChTi160

XLDnaute Barbatruc
Salut MichelXLD

bonjour le Forum
bonjour le Fil

Michel je suis très touché car tes pages Wiki m'apprennent beaucoup et c'est Ok pour compléter ce que tu as déjà fait

je vais comme je te l'ai dit mettre un fichier qui reprendra ce que j'ai trouvé concernant les ListView ce sont des adaptations de ce que j'ai trouvé sur le net(Merci aux personnes dont je n'ai pas relevées les noms)
par exemple:
Centrer une colonne de la Listeview
Call LV_Trains.ColumnHeaders.Add(, , 'Heure', LV_Trains.Width / 4, lvwColumnCenter)
ajuster la Largeur des colonnes à celle du Textevia une fonction RefreshLV LV_Trains
dans un Module Standart
Code:
Option Explicit
    Private Declare Function SendMessage Lib 'user32' Alias 'SendMessageA' (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Function LockWindowUpdate Lib 'user32' (ByVal hwndLock As Long) As Long
   
    Private Const LVM_FIRST = &H1000
    Private Const LVM_SETCOLUMNWIDTH = LVM_FIRST + 30
    Private Const LVSCW_AUTOSIZE = -1

Code:
 Sub RefreshLV(LV_Trains As ListView)
   
       LockWindowUpdate LV_Trains.Hwnd
       Call SendMessage(LV_Trains.Hwnd, LVM_SETCOLUMNWIDTH, 0, LVSCW_AUTOSIZE)
  
       If LV_Trains.ColumnHeaders(1).Width < LV_Trains.Width Then
          If LV_Trains.Height > (LV_Trains.ListItems.Count * 270) Then
               LV_Trains.ColumnHeaders(1).Width = LV_Trains.Width - 80
           Else
               If LV_Trains.ColumnHeaders(1).Width < LV_Trains.Width - 320 Then
                   LV_Trains.ColumnHeaders(1).Width = LV_Trains.Width - 320
               End If
         End If
      End If
      LockWindowUpdate 0&
  
   End Sub
Trier les Colonnes
Code:
Private Sublv_ColumnClick (ByVal ColumnHeader As MSComctlLib.ColumnHeader)
    LV_Trains.SortKey = ColumnHeader.Index - 1
   LV_Trains.Sorted = True
    LV_Trains.SortOrder = lvwAscending
End Sub

colorer le texte des SubItems
Code:
Set subItm = wItem.ListSubItems.Add(, , '15:30')
    subItm.ForeColor = vbRed
donner la possibilité de modifier les SubItems etc ....
Bonne Journée
 

Bebere

XLDnaute Barbatruc
Re : ListView et Initialisation ListImage

bonjour michel,Jean-Marie
peut être pour compléter vos codes
pour afficher des drapeaux par rapport au pays

Private Sub UserForm_Initialize()
Dim Li As ListItem, L As Integer, Chemin As String
Dim Col As Byte, NbCol As Byte, Pays As String
Dim I As Long, k As Byte

Chemin = "E:\essaisxlscapri\ESSAIXLS\"
With ImageList1
'Supprime toutes les images de la liste
.ListImages.Clear
'Définit la dimension des images
.ImageHeight = 16 'Hauteur
.ImageWidth = 16 'Largeur
'Charge les nouvelles images
.ListImages.Add , "eu", LoadPicture(Chemin & "etats-unis.ico")
.ListImages.Add , "nz", LoadPicture(Chemin & "nouvelle-zelande.ico")
.ListImages.Add , "ru", LoadPicture(Chemin & "royaume-uni.ico")
.ListImages.Add , "AMZ", LoadPicture(Chemin & "NL.ico")
End With

Set Me.ListView1.SmallIcons = Me.ImageList1
' Set Me.ListView1.Icons = Me.ImageList1
ListView1.ColumnHeaders.Clear
ListView2.ColumnHeaders.Clear

NbCol = 15

With Worksheets("Feuil1")
'entêtes pour les 2 listview
For Col = 1 To NbCol
ListView1.ColumnHeaders.Add , , .Cells(1, Col).Text, .Cells(1, Col).Width
ListView2.ColumnHeaders.Add , , .Cells(1, Col).Text, .Cells(1, Col).Width
Next Col
'contenu pour la listview1
For L = 2 To Application.CountA(Range("A:A")) '- 1
'1ère colonne
Set Li = ListView1.ListItems.Add(, , .Cells(L, 1).Text)

'colonnes suivantes
For Col = 2 To NbCol ' - 1
Select Case Col
Case 8
Pays = .Cells(L, 9).Text
Select Case Pays
Case "eu"
Li.ListSubItems.Add , , "", "eu"
Case "nz"
Li.ListSubItems.Add , , "", "nz"
Case "ru"
Li.ListSubItems.Add , , "", "ru"
Case "AMZ"
Li.ListSubItems.Add , , "", "AMZ"
End Select

Case Else
Li.ListSubItems.Add , , .Cells(L, Col).Text
End Select
Next Col
Next L
End With

ListView1.View = lvwReport
ListView2.View = lvwReport
ListView1.FullRowSelect = True
ListView2.FullRowSelect = True
ListView1.Gridlines = True
ListView2.Gridlines = True
ListView1.MultiSelect = True
'autres propriétés listview
ListView1.CheckBoxes = True 'false
'ListView1.HideColumnHeaders = True 'false
'ListView1.ColumnHeaders =
' ListView1.ColumnHeaderIcons = Im1
'ListView1.AllowColumnReorder = True 'false ''permet le glisser/déplacer des colonnes
Me.Caption = TM

' For i = 2 To Sheets("Feuil1").Range("A65536").End(xlUp).L
' .ListItems.Add , , Sheets("Feuil1").Cells(i, 1)
' For k = 2 To 7
' .ListItems(.ListItems.Count).ListSubItems.Add , , Sheets("Feuil1").Cells(i, k)
' Next
' Next


Me.ListView1.CheckBoxes = True
'Vous pouvez ensuite indiquer le statut par défaut de la CheckBox.
'Si vous ne spécifiez pas ce paramètre, la case ne sera pas visible tout de suite:
'Vous devrez cliquer sur le bord gauche de la Ligne pour faire apparaitre la CheckBox.

Dim z As Integer

For z = 1 To ListView1.ListItems.Count
ListView1.ListItems(z).Checked = False
Next z

'drapeaux

End Sub

à bientôt
 

CAPRI_456

XLDnaute Occasionnel
Re : ListView et Initialisation ListImage

Bonsoir le Forum, Michel , jean Marie, Bebere,

quelques tuyaux supplémentaires pour le même bug d'initialisation lors de l'utilisation d'Imagelist

Cela permet de mieux comprendre les interractions entre Imagelist et Listview et les clés (Key)

""Le contrôle ImageList doit être initialisé avant utilisation" erreur 35613" n'est pas émis par le contrôle ImageList mais par le TreeView/ListView que tu utilises.
Dans ce message, ImageList est le nom d'une de leurs propriétés, et le message dit que tu ne peux pas ajouter un Node/ListItem sans renseigner cette propriété avant.

Mais à quoi sert cette propriété? C'est tout simplement le fameux lien entre le contrôle ImageList et le TreeView/ListView. Elle te permet d'ajouter un Node/ListItem en donnant en argument la clé de l'image du contrôle ImageList, sans avoir à écrire un truc du genre "ImageList1.ListImage(LaCle).Picture....".

"Le contrôle ImageList ne peut pas être modifié tant qu'un autre contrôle est dépendant de lui-" dit que tu ne peux pas modifier contrôle ImageListsans désactiver ce lien. Il existe alors 2 écoles :
- tu peux, en mode conception, ajouter des images dans le contrôle ImageList, en leur donnant une clé unique, et faire le lien avec le TreeView/ListView. La banque d'image sera toujours la même, en exécution, mais tu pourras remplir/vider/modifer le contenu du TreeView/ListView à loisir (dans la mesure des images disponibles).

- tu peux, pendant l'exécution ajouter des images à un contrôle ImageListnon lié, en leur donnant une clé unique à chacune. Une fois ceci fait, tu peux, toujours en code, faire le lien : Me.TreeView1.ImageList = Me.imglstLargeIcons, et enfin remplir/vider/modifier le contenu du TreeView/ListView à loisir (dans la mesure des images disponibles). Si tu veux à nouveau charger des images, tu dois défaire le lien avant, et veiller à n'utiliser que des nouvelles clés uniques (à moins de supprimer les images que tu veux remplacer, et ré-utiliser les clés qu'elles portaient).

J'ai suffisament parlé de clé unique d'image pour ne pas avoir à expliquer le 3ème message "
Clé non unique dans la collection". Dans l'objet ImageList, tout comme dans le TreeView/ListView, les propriétés, respectivement ListImage, Nodes et ListItems sont des collections, dont chaque élément ajouté se doit d'avoir une clé unique (une chaine de caractères quelconque, mais unique dans la collection), et grâce à cela, on peut écrire, par exemple : Me.TreeView1.Nodes("root").EnsureVisible

Enfin, pour tes dernières questions, je fais un package. Tout cela relève de critères de conception (ou d'architecture, de modélisation...). Le concepteur, c'est toi. Tu utilises certainement des tableaux dans ton application. Certains sont peut-être différents, mais de même contenu, d'autres centralisent peut-être des données fonctionnellement incompatibles. Comment as-tu décidé de combien de tableaux, et où les déclarer?
Il s'agit là de choix réféléchis, adaptés à un contexte que tu es le seul (architecte) à maitriser, j'entends là, ton application.

Pour ma part, une banque d'image, c'est une base de données, dont chaque image est unique. Là où certains chipotent pour une String à la place d'un Variant, alors qu'on a 2Go de RAM, pour les images, c'est diablement plus important d'éviter de les dupliquer pour rien. Mais suivant le cas d'utilisation, la duplication peut être nécessaire.

Par exemple, pour gérer l'affichage du ListView, je crée une banque SmallIcons et une LargeIcons, d'autant d'image chacune, avec la même liste de clé dans chacune. Il me suffit de dire au ListView de changer de type de vue, et lui, il change de banque d'image (le code pour le remplir reste le même, puisque les clés sont identiques).

Autre exemple, pour un TreeView/ListView qui aurait pour charge de m'afficher des vignettes d'images contenues dans un répertoire, j'aurais besoin de remplir la base d'images au fur et à mesure du parcours du contenu du répertoire, faire le lien, et remplir le TreeView/ListView.

Encore un dernier, j'ai un formulaire qui reprend, avec un TreeView/ListView, les fonctionnalités d'Outlook (dossier groupes de contacts, dossier boite de reception, dossier courrier non lu...), et quand je double-clique la pièce jointe d'un message, j'ouvre un formulaire qui présente, avec un TreeView/ListView, le contenu de mes disques durs (comme l'Explorateur), pour cibler l'enregistrement du fichier. Si je mets toutes les icones dans une banque centralisée, ça marchera bien, mais quand je voudrais récupérer le formulaire type Explorateur pour l'intégrer dans une autre application, il va falloir aller récupérer les images qu'il utilise, et elles seules. S'il avait eu sa banque, ce serait plus ré-utilisable.



à+

rvblogn


source : http://www.vbfrance.com/forum/sujet-CONSEILS-FAIRE-FONCTIONNER-CORRECTEMENT-IMAGELIST_806937.aspx

bONSOIR à tous

CAPRI_456
 

Statistiques des forums

Discussions
292 797
Messages
1 926 336
Membres
183 028
dernier inscrit
FabG17