Les Combo Box ne respectent plus les gens !

cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 - 12 juil. 2007 à 17:16
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 - 13 juil. 2007 à 14:02
Salut à tous !

pourquoi mon Combo Box n'attend pas jusqu'à ce que je choisis un Item, il le fait dès je passe le curseur sur un, pourtant l'évennement qui déclenche la procédure ComboBox1_Click.

En plus, c'est aléatoire : parfois il le fait, parfois non , et ce phénomène

Est-ce que vous êtes familière avec celà ?




Pardonnez le fait que ma question n'est pas idéale clarté, mais vraiment je ne parvient pas à bien décrire cette situation
A voir également:

17 réponses

cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
12 juil. 2007 à 17:21
J'ai oublié d'ajouter que lorsque j'amène la Form en question sous un autre projet, le problème est résolu !

Quels sont les "choses" susceptibles de produir ma situation ?
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
12 juil. 2007 à 18:25
A+
Exploreur

 Linux a un noyau, Windows un pépin


 
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
12 juil. 2007 à 18:26
Le fantôme des commentaires est de retour...Heureusement que j'ai le copier sous la main...

Salut,

Essaye deux choses :

1 - Repose sur ta form un nouveau ComboBox
2 - Si cela ne fonctionne pas ci-dessus, créer une nouvelle FRM avec un nom différent, copie tout tes contrôles et code dans cette nouvelle FRM, supprime l'ancienne(du projet et physiquement sur le disque), renome la nouvelle avec le même nom que l'ancienne et sauvegarde de nouveau ton projet, et essaye...

ATTENTION AVANT TOUTES MANIPES
FAIT UNE SAUVEGARDE DE TON PROJET DANS
UN "COIN" DE TON DISQUE DUR...

A+
Exploreur

 Linux a un noyau, Windows un pépin

 
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
12 juil. 2007 à 18:55
Bonsoir (et salut Exploreur)

lors ? ce n'est semble-t-il plus ComboBox, qu'il faut dire, mais Combo Boxon...
Plaisanteries mises à part :
- tu dois avoir quelque part une instruction au mouse-move
ou alors
- c'est ta souris qui a un problème
0

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

Posez votre question
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
12 juil. 2007 à 22:06
Salut et merci pour vos réponses,

j'ai essayé, auparavant, tous ce vous venez de dire, EN VAIN...

C'est extra-bizare !

il n'existe aucun Mouse_Move, je vous en assure



jmfmarques.




Bon, je me dis "ne t'enerve pas Chatbour, ce n'est qu'un pauvre Combo !.."

Merci les amis pour les réponses. Ce soir c'est moi c'est ou lui ce Combo..
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
12 juil. 2007 à 23:27
Salut,

Evites tant que possible l'évenement
ComboBox1_Click. Préfères-lui

ComboBox1_Change.
J'ai déjà observé des choses extrêmement étranges quand j'utilisais cet évenement.

Par exemple, si vous demandez à faire un Load puis Unload d'un contrôle quelconque sur un evenement ComboBox_Click, l'appli plantera, alors que sur un Form_Click, un TextBox_Click, un ListBox_Click, un MSFlexgrid_Click, .... le même code fonctionne. C'est un peu space.

Sur une feuille, une TextBox, une ListBox, une ComboBox, une PictureBox, un CommandButton nommé Command1 et un autre nommé Command2 (sa propriété Index est à 0)

Private Sub Form_Load()
    List1.AddItem "toto"
    Combo1.AddItem "toto"
    Text1.Text = "toto"
End Sub

Private Sub VasY()
    MsgBox "je passe ici"
    For i = 1 To 3
        Load Command2(i)
        Command2(i).Top = Command2(0).Top + i * Command2(0).Height
        Command2(i).Visible = True
    Next i
    For i = 1 To 3
        Unload Command2(i)
    Next i
End Sub

Private Sub Combo1_Click()
    VasY
End Sub

Private Sub Command1_Click()
    VasY
End Sub

Private Sub List1_Click()
    VasY
End Sub

Private Sub Picture1_Click()
    VasY
End Sub

Private Sub Text1_Click()
    VasY
End Sub

5 évenements Click qui exécutent a priori tous le même code (procédure VasY). Et bien si vous déclenchez l'évenement Combo1_Click, çà plante, et pas pour les autres !







Manu


--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
12 juil. 2007 à 23:36
Bonsoir Econs,

Je viens d'essayer...
C'est vrai et incompréhensible.
Tu viens de me faire découvrir une chose que j'étais loin de soupçonner !!!
C'est un BUG !!!
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
13 juil. 2007 à 00:26
Ouille,

C'est encore plus grave que ce que je pensais !

Tout se passe comme si, lorsque l'on est dans la partie ListBox de la Combo (qui est une espèce d'association de TextBox et de ListBox), VB ne sait plus exactement avec quel DC il se trouve à devoir travailler....
Le même effet sera obtenu si l'on veut décharger la Form elle-même !!!
Ainsi, dans l'exemple d'Econs, remplaçons :
For i = 1 To 3
      Unload Comand2(i)
Next i
par
Unload Me

=>>> plantage également si Vasy est lancé alors que le contrôle actif est la Combobox !!!
Tout se passe comme si VB pensait être dans une autre fenêtre que celle qui est la parente principale (mais laquelle, alors ?.... mystère... je chercherai demain).
Je ne vois pour l'instant pas comment essayer de suivre les événements un par un, mais la chose me turlupine vraiment.
Demain matin, peut-être (à tête plus reposée) ...
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
13 juil. 2007 à 08:12
Hé ben...

J'ai ce matin la tête bien reposée mais celà ne m'a pas servi (je n'ai pas été capable de "tracer" ce qui se passait...)

Pire, en faisant des recherches, j'ai pu voir que MicroSoft signalait cette impossibilité d'invoquer un Unload dans plusieurs situations, la plupart d'entre elles étant liées à la nécessité de redessiner un rectangle (ce qui se passe d'ailleurs au click sur un article d'une ComboBox ...)
http://msdn2.microsoft.com/en-us/library/Aa445638(VS.60).aspx

J'abdique
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 juil. 2007 à 08:26
les Combobox nous cachent des choses...
je pense a la listbox qui nous fais apparaitre les item.

pour pouvoir dépasser au dessus des controles, et au dela de la Form, elle est crée avec un style WS_POPUP.

je pense que pour s'assurer que cette fenetre supplémentaire est bien détruite, VB doit verrouiller le déchargement des controles (et) de la Form...

Une solution serait de faire un appel deferré a la procedure VasY. via SetTimer, ou via un simple Timer, que l'on mettrais à Enabled... comme ca on rend la main aussitot au ComboBox, et VasY est appelé independamment (pour VB) de l'action sur le ComboBox.
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
13 juil. 2007 à 08:31
Pas bête comme procédé, j'essayerai.
Ceci dit, çà reste une rustine, et pour quelqu'un qui code un simple Combo1_Click, çà reste du domaine de l'incompréhensible.
L'évenement devrait gérer çà tout seul, sans qu'on ait besoin de se demander comment il fonctionne.

Manu
--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
13 juil. 2007 à 08:35
jmfmarques> J'ai également eu quelques insomnies en découvrant çà il y a quelques mois. Mais maintenant çà va mieux
"Avec le temps, avec le temps va, tout s'en va"

Manu
--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
13 juil. 2007 à 08:42
Bonjour, Renfield,

Oui, la solution de l'utilisation d'un Timer (VB ou autre) permet de résoudre le problème.
Il y a peut-être d'autres méthodes pour s'en sortir.

Celà ne supprime pas ce qui me turlupine : à savoir ce qui se passe derrière.
Je croyais également hier soir que c'était dû au fait de la présence réelle de deux fenêtres (puisqu'une Combo est une espèce d'association de TextBox et de ListBox). Mais je vois ce matin que ce bug intervient chaque fois que l'on tente de décharger alors qu'un événement de type Paint est impliqué ! Il est vrai qu'un tel événement intervient aussi au click d'une Combo puisque le rectangle de la zone de liste disparaît à ce moment-là.
Mais voilà ! J'ai essayé, dans cette logique, de simplement temporiser, pour laisser à Monsieur VB le temps de détruire ce rectangle (celui de la zone de liste) ===>>> tintin ! le bug persiste.
J'aiu également (toujours après temporisation) envoyé le focus ailleurs, temposisé à nouveau, puis tenté de décharger ===>>> in the baba là aussi ====>> même impossibilité de décharger....

Ta solution d'utilisation d'un Timer n'est applicable que si, au click dans la Combo, on modifie l'état d'une variable que le timer utilise à son tour, un peu plus tard....
Bref... On sait s'en sortir mais on ne connait toujours pas (bien qu'on commence à le deviner) ce qui se passe "derrière" ...

Je jette l'éponge.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
13 juil. 2007 à 10:50
Re quand même !...

C'est tout de même assez curieux car l'événement change seul ne provoque pas l'erreur mais ignore carrément l'instruction :

ainsi
Private Sub Combo1_Change()
   Unload Me ' ===>> pas d'erreur, mais pas de Unload !
End Sub

alors que

Private Sub Combo1_Click()
    Unload Me ' ====>>> erreur 365
End Sub

Je ne sais pas où se trouve le pointeur exactement dans un cas et dans l'azutre (apparemment pas vers la même chose).
On peut par ailleurs observer qu'une ComboBox, contrairement à une ListBox, ne connaît pas l'événement MouseDown ni l'événement MousUp (qui sont en quelque sorte les 2 composantes du Click....
On remarque par contre qu'elle connaît l'événement Keydown
essayons alors :

Private Sub Combo1_KeyDown(KeyCode As Integer, Shift As Integer)
  If KeyCode = 13  Then Unload Me ' et çà marche !...
End Sub

Et celà marche également au KeyUp et au KeyPress ...


Je comprends de moins en moins ce qu'il y a derrière ...


 


Pour RenField (qui cherchait, de son côté) une/des solution(s). En voilà une autre, sans Timer :


Private toto As Boolean


Private Sub Form_Activate()
  For i = 0 To 2
     Combo1.AddItem i
  Next
End Sub
Private Sub Combo1_Click()
  toto = Not toto
End Sub


Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
 If toto Then
   Unload Me
   toto = Not toto
 End If
End Sub

Elle part du principe selon lequel tu as forcément ta main sur la souris et qu'il est impossible que tu ne "trembles" pas du tout. Bien évidemment, si la combo se trouve dans un autre container que la Form, utiliser le MouseMove du dit container en lieu et place de celui de la Form.
Mais tout ceci ne nous explique toujours pas ce qu'il y a derrière !!!




 
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 juil. 2007 à 11:06
Le Change ne se déclenche que si on saisit du texte dans la zone de saisie d'un Combo en mode DropDown.
Si on affiche la listbox et que l'on saisit du texte, on a bien le 365...

"Ta solution d'utilisation d'un Timer n'est applicable que si, au click dans la Combo, on modifie l'état d'une variable que le timer utilise à son tour, un peu plus tard...."
tu peux simplement garder ton Timer éteint tout le long
l'activer au moment voulu


Private Sub Combo1_Click()
Timer1.Enabled = True
End Sub

Private Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 1
End Sub

Private Sub Timer1_Timer()
'Timer1.Enabled = False
Unload Me
End Sub
0
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
13 juil. 2007 à 13:56
Salut,
mon humble question a déclenché 15 réponses, causé des insomnies pour Mr.
jmfmarques  

Est-ce qu'on peut simuler l'évènnement Click d'un ComboBox par les API ? comme ça peut être on va contrôler ce qui se passe derrière ?
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
13 juil. 2007 à 14:02
Ah ....
Bien mon ami... bien...
Tu veux t'y mettre toi aussi ?
C'est bon, alors, car j'y ai perdu toutes mes dents (je n'en ai maintenant plus) ... sans trouver ce qu'il y "avait derrière" ...  (Et j'ai mis tout le paquet et utilisé tout mon arsenal)...
Juste ue info : si tu déclenche l'événement click, par quelque prorocédé que ce soit ===>> kif kif 
Mais je suis content que tu t'y mettes : on va alors peut-être ainsi savoir..
A bientôt, donc

PS : Pour les maux de crâne, fais gaffe dans le choix de tes remèdes : certains médicaments provoquent quelquefois des troubles gastriques, si les doses sont trop fortes. Prends soin de toi, hein ...
0
Rejoignez-nous