cs_Chatbour
Messages postés764Date d'inscriptionjeudi 27 juillet 2006StatutMembreDernière intervention 6 septembre 2010
-
12 juil. 2007 à 17:16
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 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
cs_Exploreur
Messages postés4821Date d'inscriptionlundi 11 novembre 2002StatutMembreDernière intervention15 novembre 201615 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...
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
econs
Messages postés4030Date d'inscriptionmardi 13 mai 2003StatutMembreDernière intervention23 décembre 200824 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.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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) ...
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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.
econs
Messages postés4030Date d'inscriptionmardi 13 mai 2003StatutMembreDernière intervention23 décembre 200824 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.
econs
Messages postés4030Date d'inscriptionmardi 13 mai 2003StatutMembreDernière intervention23 décembre 200824 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.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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" ...
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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 !!!
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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 ...