CommandButton Vs Image

cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008 - 27 juin 2006 à 10:00
 bellazanouba - 1 janv. 2008 à 23:12
Bonjour à tous,
J'ai un petit problème à vous soumettre. J’ai 2 objets ‘Image’ dont je dois changer l’image chaque fois que l’utilisateur clique dessus. Jusque là, rien de compliqué, j’utilise la fonction ‘LoadPicture’ dans l’événement ‘Click’ de chacun des objets ‘Image’. <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>





Mais j’ai remarqué que quand on clique plusieurs fois rapidement sur les objets ‘Image’, le rafraichissement des images est très lente. Or c’est le but recherché dans cette application. J’ai fait la même application avec des objets ‘CommandButton’ à la place des objets ‘Image’ et c’est plus rapide. C’est satisfaisant pour cette application. Or je ne peux pas avoir de boutons dans l’application.






 






Est-ce que quelqu’un aurait une idée pour m’aider svp ?




D'avance, je vous remercie,

Ice

22 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
27 juin 2006 à 10:09
Charge tes images dans deux contrôles Image. Et masque l'un ou l'autre selon la parité du click, ainsi tu n'aura plus le temps de chargement des images, juste le temps d'affichage qui sera moins long !
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 juin 2006 à 10:11
ton LoadPicture est une mauvaise chose, ici.... c'est lent de recharger le fichier a chaque fois.
tu pourrais stocker tes images, et les replacer dans tes controles Image, quand nécessaire.

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
27 juin 2006 à 10:40
Salut,

De mémoire, mais je ne sais pas si cela peut aider, il n'existe pas un controle appelé ImageList qui pourrais t'aider.      

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement/FONT>
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 juin 2006 à 10:50
si si, il existe bel et bien ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008
27 juin 2006 à 10:50
Darksidious, Renfield<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>





Merci pour vos suggestions.





Juste une petite précision, j’ai remarque que ce n’est pas la fonction ‘LoadPicture’ ou ‘LoadResPicture’ qui prend du temps, mais c’est bien l’événement ‘Click’ de l’objet ‘Image’. J’ai effectué un test supplémentaire en chargeant les images des objets ‘Images’ dans l’événement ‘Click’ des objets ‘CommandButton’ et c’est plus rapide.





Renfield,  veux-tu bien m’explique comment il faut faire pour stocker toutes les images, stp ?





Ice.
0
cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008
27 juin 2006 à 10:56
jrivet,



Merci pour ton information.



Ice.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 juin 2006 à 11:01
Comme le suggère jrivet, tu peux utiliser un ImageList (fait partie des Windows Common Controls)
en remplacement de ton fichier .res.

un tableau (ou Collection) de StdPicture est au pire utilisable

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008
28 juin 2006 à 13:56
Merci pour la suggestion mais comme je l’ai déjà signalé plus haut, c’est l’événement ‘Click’ de l’objet ‘Image’ qui est moins rapide que celui de l’objet ‘CommandButton’. L’idéal serait de pouvoir utiliser l’objet ‘CommandButton’ sans avoir l’effet 3D de cette objet.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>





Je vais regarder comment fonctionne l’objet ‘ImageList’.



@+

Ice.
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
28 juin 2006 à 14:38
Au pire, utilise un picturebox (avec sa propriété borderstyle à vbNone) à la place du contrôle image
0
cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008
28 juin 2006 à 15:16
Darksidious, <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>






 






Merci, mais j'ai déjà essayé l’objet ‘PictureBox’, mais c’est encore plus lent… Franchement, je ne vois plus comment faire !!!




 
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 juin 2006 à 15:56
plus lent ?
ca n'a aucun sens, ce que tu dit..... un evenement click, c'est un evenement Click...

ensuite, faut voir le code que ca déclenche...
tu peux peut etre voir a utiliser l'evenement MouseDown, qui survient avant l'evenement Click...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008
28 juin 2006 à 16:17
Renfield,
L’événement ‘Click’ paraît plus lent pour le rafraichissement de l'image dans l'objet 'Image' que dans l’objet ‘CommandButton’. Ce n’est pas après un clic, bien après plusieurs cliques de suite.<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>






 






Voici un extrait du code :






 






‘ Lobjet ‘Image’ : imgPressureLeft













Private Sub imgPressureLeft_Click()






 







    If Pressure <> 11 Then






        If (Pressure > 0) Then






            Pressure = FoldPressure - 1






          
 RedrawBarGraph






       

End If






    End If






 






End Sub






 






‘ Lobjet ‘Image’ : imgPressureRight













Private Sub imgPressureRight_Click()






 







    If Pressure <> 11 Then






        If (Pressure > 0) Then






            Pressure = FoldPressure + 1






          
 RedrawBarGraph






        End If






    End If






 






End Sub






 






‘ La fonction pour redessiner mes bargraph



















Private Sub RedrawBarGraph ()






 







    If (Pressure = 11) Then






   








        imgPressureLeft.Picture = LoadPicture(strDirectory & "\GLAUTO.bmp")






        imgPressureRight.Picture = LoadPicture(strDirectory & "\GRAUTO.bmp")






   








    Else






   








        If (Pressure = 0) Then






            imgPressureLeft.Picture = LoadPicture(strDirectory & "\GL000.bmp")






  
         imgPressureRight.Picture = LoadPicture(strDirectory & "\GR000.bmp")






        ElseIf (Pressure = 1) Then






            imgPressureLeft.Picture = LoadPicture(strDirectory & "\GL010.bmp")






            imgPressureRight.Picture = LoadPicture(strDirectory & "\GR010.bmp")






        ElseIf (Pressure = 2) Then






            imgPressureLeft.Picture = LoadPicture(strDirectory & "\GL020.bmp")






            imgPressureRight.Picture = LoadPicture(strDirectory & "\GR020.bmp")






        ElseIf (Pressure = 3) Then






            imgPressureLeft.Picture = LoadPicture(strDirectory & "\GL030.bmp")






            imgPressureRight.Picture = LoadPicture(strDirectory & "\GR030.bmp")






        ElseIf (Pressure = 4) Then






            imgPressureLeft.Picture = LoadPicture(strDirectory & "\GL040.bmp")






            imgPressureRight.Picture = LoadPicture(strDirectory & "\GR040.bmp")






        ElseIf (Pressure = 5) Then






            imgPressureLeft.Picture = LoadPicture(strDirectory & "\GL050.bmp")






            imgPressureRight.Picture = LoadPicture(strDirectory & "\GR050.bmp")






        ElseIf (Pressure = 6) Then






            imgPressureLeft.Picture = LoadPicture(strDirectory & "\GL060.bmp")






            imgPressureRight.Picture = LoadPicture(strDirectory & "\GR060.bmp")






        ElseIf (Pressure = 7) Then






            imgPressureLeft.Picture = LoadPicture(strDirectory & "\GL070.bmp")






            imgPressureRight.Picture = LoadPicture(strDirectory & "\GR070.bmp")






        ElseIf (Pressure = 8) Then






            imgPressureLeft.Picture = LoadPicture(strDirectory & "\GL080.bmp")






            imgPressureRight.Picture = LoadPicture(strDirectory & "\GR080.bmp")






        ElseIf (Pressure = 9) Then






            imgPressureLeft.Picture = LoadPicture(strDirectory & "\GL090.bmp")






            imgPressureRight.Picture = LoadPicture(strDirectory & "\GR090.bmp")






        Else






            imgPressureLeft.Picture = LoadPicture(strDirectory & "\GL100.bmp")






            imgPressureRight.Picture = LoadPicture(strDirectory & "\GR100.bmp")






        End If






   








    End If






 






End Sub
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 juin 2006 à 16:36
il est complètement inconcevable de faire tous ces LoadPicture sans arrêt dans le code...
ne cherche pas plus loin tes problèmes de lenteur.... bonjour les accès disque a chaque clic

en passant, tu aurait pu faire :
LoadPicture(strDirectory & "\GL" & format$ ( Pressure , "000") & ".bmp")

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
28 juin 2006 à 17:50
Je suis du même avis que Renfield : c'est sûrement pas la méthode click du contrôle Image ou PictureBox qui prend du temps, mais ta méthode RedrawBarGraph qui est appelée à chaque click et qui charge à chaque fois une image ! Charge tes images une fois pour toute, et n'accède pas au disque sans arrêt, tu y gagnera en rapidité !
0
cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008
28 juin 2006 à 17:54
Renfield, je sais que les ‘LoadPicture’ ce n’est pas top. J'ai essayé ‘LoadResPicture’ et c’est un peu mieux. Mais sans plus.
Pourtant si tu utilise ces ‘LoadPicture’ dans l’événement ‘Click’ des objets ‘CommandButton’ c’est plus rapide !!! <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>





Y a-t-il une alternative à ces ‘Loadpicture’ ?
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
28 juin 2006 à 18:01
Tu lis un peu ce qu'on t'écrit ? CHARGE une fois pour toute toutes tes images !

Tu peux utiliser tout tes loadpicture dès le chargement de ta feuille (stocke-les dans des stdpicture par exemple), et puis après tu n'a plus qu'à redéfinir le Picture de ton contrôle par la bonne image. Mais surtout évite de faire des LoadPicture ou autre LoadResPicture à tout va !
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
28 juin 2006 à 18:10
Salut,

le ton monte ici, et le temps se gâte

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement/FONT>
0
cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008
29 juin 2006 à 14:05
Darksidious,<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>






 






J’ai stocké les images avec un ‘ImageList’, ça ne fonctionne pas mieux. Ensuite, j’ai réessayé avec les objets ‘stdPicture’ comme tu me l’as préconisé. Et c’est pareil !!!





Je te jure il faut me croire !!! J’ai vraiment l’impression que c’est plus lent dans l’événement ‘Click’ de l’objet ‘Image’ par rapport à l’objet ‘CommandButton’.





Peut-être que je me trompe avec l’objet ‘stdPicture’ ???






 






Voici le code que j’ai écrit et compare par toi-même :






 






‘ Debut ->





Option Explicit






 






Dim intPressure As Integer





Dim strDirectory As String





Dim gphL000 As New StdPicture





Dim gphL010 As New StdPicture





Dim gphL020 As New StdPicture





Dim gphL030 As New StdPicture





Dim gphL040 As New StdPicture





Dim gphL050 As New StdPicture





Dim gphR050 As New StdPicture





Dim gphR060 As New StdPicture





Dim gphR070 As New StdPicture





Dim gphR080 As New StdPicture





Dim gphR090 As New StdPicture





Dim gphR100 As New StdPicture






 







 






Private Sub Form_Load()






 







    intPressure = 0






    strDirectory = App.Path






    Set gphL000 = LoadPicture(strDirectory & "\GL000.bmp")






    Set gphL010 = LoadPicture(strDirectory & "\GL010.bmp")






    Set gphL020 = LoadPicture(strDirectory & "\GL020.bmp")






    Set gphL030 = LoadPicture(strDirectory & "\GL030.bmp")






    Set gphL040 = LoadPicture(strDirectory & "\GL040.bmp")






    Set gphL050 = LoadPicture(strDirectory & "\GL050.bmp")






    Set gphR050 = LoadPicture(strDirectory & "\GR050.bmp")






    Set gphR060 = LoadPicture(strDirectory & "\GR060.bmp")






    Set gphR070 = LoadPicture(strDirectory & "\GR070.bmp")






    Set gphR080 = LoadPicture(strDirectory & "\GR080.bmp")






    Set gphR090 = LoadPicture(strDirectory & "\GR090.bmp")






    Set gphR100 = LoadPicture(strDirectory & "\GR100.bmp")






 







    RedrawBarGraph






   







End Sub






 






Private Sub imgPressureLeft_Click()






 







    If intPressure > 0 And intPressure <= 10 Then






        intPressure = intPressure - 1






        RedrawBarGraph






    End If






 






End Sub






 






Private Sub imgPressureRight_Click()






 







    If intPressure >= 0 And intPressure < 10 Then






        intPressure = intPressure + 1






        RedrawBarGraph






    End If






 






End Sub






 






Private Sub cmdLeft_Click()






   








    If intPressure > 0 And intPressure <= 10 Then






        intPressure = intPressure - 1






  
     RedrawBarGraph






    End If






 






End Sub






 






Private Sub cmdRight_Click()






   








    If intPressure >= 0 And intPressure < 10 Then






        intPressure = intPressure + 1






        RedrawBarGraph






    End If






 






End Sub






 






Private Sub RedrawBarGraph()






 







    If (intPressure = 0) Then






        imgPressureLeft.Picture = gphL000






        imgPressureRight.Picture = gphR050






    ElseIf (intPressure = 1) Then






        imgPressureLeft.Picture = gphL010






        imgPressureRight.Picture = gphR050






    ElseIf (intPressure = 2) Then






        imgPressureLeft.Picture = gphL020






        imgPressureRight.Picture = gphR050






    ElseIf (intPressure = 3) Then






        imgPressureLeft.Picture = gphL030






        imgPressureRight.Picture = gphR050






    ElseIf (intPressure = 4) Then






     
  imgPressureLeft.Picture = gphL040






        imgPressureRight.Picture = gphR050






    ElseIf (intPressure = 5) Then






        imgPressureLeft.Picture = gphL050






        imgPressureRight.Picture = gphR050






    ElseIf (intPressure = 6) Then






        imgPressureLeft.Picture = gphL050






        imgPressureRight.Picture = gphR060






    ElseIf (intPressure = 7) Then






        imgPressureLeft.Picture = gphL050






        imgPressureRight.Picture = gphR070






    ElseIf (intPressure = 8) Then






        imgPressureLeft.Picture = gphL050






        imgPressureRight.Picture = gphR080






    ElseIf (intPressure = 9) Then






        imgPressureLeft.Picture = gphL050






        imgPressureRight.Picture = gphR090






    Else






        imgPressureLeft.Picture = gphL050






        imgPressureRight.Picture = gphR100






    End If






 






End Sub





‘ Fin <-






 
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 juin 2006 à 14:34
j'ai fait le test, et c'est instantané (encore heureux^^)

néanmoins, si on mitraille de clics un objet Image, on sent qu'il y a un problème...

quand DarkSidious marque "

Tu lis un peu ce qu'on t'écrit ?", il a pas tord :

"tu peux peut etre voir a utiliser l'evenement MouseDown, qui survient avant l'evenement Click..."

ce conseil était pourtant judicieux, et permet de venir à bout de cette 'lenteur'...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_IcebergMan Messages postés 41 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 11 décembre 2008
29 juin 2006 à 15:07
Renfield,<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>





Malheureusement, l’utilisateur va ‘mitrailler’ cet objet ‘image’. En fait, Chaque fois qu’il cliquera sur la partie de droite, il va faire monter le ‘bargraph’ et il le diminuera par un clic sur la partie de gauche. Les images ont une taille variant de 18 Ko à 20 Ko au format ‘bmp’ et j’ai même essayé le format ‘jpg’ (1 à 2 Ko), mais ce n’est pas mieux.





J’ai remplacé l’évenement ‘Click’ par ‘MouseDown’ et le résultat est un peu mieux, mais c’est loin d’être satisfaisant par rapport à un objet ‘CommandButton’.





N’y a-t’il pas moyen d’enlever l’effet 3D du bouton, je souhaiterai avoir un bouton plat sans délimitation visible dans lequel je changerai sa propriété ‘Picture’ comme pour les objets ‘Image’.





Enfin, je vous remercie tous les deux (Darksidious et toi) d’être patient avec moi. Mais rassurez-vous, je lis bien ce que vous écrivez et je le test. Je pense que je me suis fait mal comprendre.





Bien à vous,





Ice.

 






P.S. : Est-il possible de vous envoyer mon les images dans un zip, histoire de voir ce que je veux faire avec le ‘bargraph’ ?









 
0
Rejoignez-nous