Autres toutes versions tester le scrool avec la roulette sans passer par un hooking en addressof

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
la principal raison des crash excel quand on utilise le hooking de la souris pour avoir le mouse wheel(la roulette)
c'est que le looping avec le (CallnextHook)est asynchrone avec le captage du message de la souris
donc quand une erreur se produit(on va trop vite ou autre)
le looping lui continue parfois au moins une fois même en erreur
résultat comme on déplace le block type du message en mémoire ça crash

je vous propose de tester ceci
ici on va rester dans un do/loop vba classique et le message de la souris sera récupéré par un peekmessage
si il y a une erreur (du au message de la souris non conforme) normalement on a une erreur vba classique
et donc le do/loop est interrompu
donc pas de relance avec un message de la souris erroné donc pas de crash
Vous constaterez que j'augmente l'allocation de la mémoire aussi (64 bits double (longlong ou longPtr))(+2&)

d'autant plus que la dans cette démo je met tout dans le userform
ce qui n'est pas possible avec un code de hooking bien entendu
et ça peut avoir un avantage lorsque l'on veut distribuer un interface(userform) sans devoir l'accompagner de x modules

toujours pareil pour déterminer le rectangle je me sert de ma fonction perso du calendar que j'ai modifié pour ce besoins
donc testez et si ça fonctionne je ferais une ressource au propre

merci d'avance pour votre participation

j'en connais un qui vas ouvrir grand les yeux 🤣

Patrick
 

Pièces jointes

Solution
Bonjour @jurassic pork , @Dudu2 , @Nathe
j'ai mis le controlrelease en optionnel dans la démo (fonctionne aussi dans userform)
j'en ai profité pour mettre un multipage
et dans la page 1 du multipage j'ai mi un label violet
et c'est lui qui pilote le scroll de la page
comme ca on peut mettre un fond sur chaque page vu que ce control n'a pas de propertie backcolor
bien évidemment j'ai ajouté le textbox
dans cette démo donc on a le controlrelease optionnel
et le scroll piloté par un autre control
voila comme ça on est au même niveau que la V 3.0 avec iaccessible (All control working)

patrick
J'ai bloqué le scroll de la feuille uniquement pour la TextBox car chez moi, les autres ActiveX Controls ne scrollent pas la feuille.
Mais si chez toi tous les ActiveX Controls scrollent la feuille, je vais tous les bloquer.

le textbox obligé de se taper toutes les lignes suivantes ou precedentes la curline pour scroller
j'ai déjà donné l'astuce pour eviter ça
Ok, je ne connais pas cette astuce. Qu'est-ce ?
 
re
 
Le problème avec les TextBox, c'est que la première fois où tu entres dedans, elle se positionne tout à fait à la fin du texte, tout en bas.
Et ça n'a rien à voir avec le Scroll. C'est du standard TextBox.

Dans ma ressource de Scroll avec hook, j'ai traité ce problème en gérant un table des TextBox connues et quand elle ne sont pas connues (avant de la mettre en table) je repositionne le CurLine à 0 pour ne pas subir l'effet 1ère entrée.
A part une table, il n'y a aucun moyen de savoir si c'est la 1ère entrée dans une TextBox.

je n'ai pas reproduit ça ici, ça me parait un peu lourd juste pour éviter ce phénomène.

Sinon j'ai pas trop compris ton affaire de split. Si tu as un code quelque part...
 
j'oubliais
pour enlever le doublage de control j'ai supprimer et remis une listbox tout simplement
c'est donc bien un soucis de l'OCX ou dans la FM20.dll
je parierais que ta version a été mise sur une autre ou en mise ajour et tu dois avoir dans le registre les deux clisD
 
désinstalle tout correctement avec l'outil de microsoft
et reinstalle au propre ta version excel
c'est tout
depuis la version 2019 l'installation ne nettoie plus les versions antérieures a 2019
comme certai cle de registre sont au même endroit ca va elle sont remplacer mais celle qui ne l'etaient pas ben elle restent
sauf que pour chaque cle il y a une autre cle dans le group de cle "CLISD"
va savoir la quelle toi maintenant qu'il n'y a plus les correspondantes
donc
 
il y a aussi la possibilité que tu ai rechargé un iso de office
et acheté une licence de min 1€ à x€ sur le web ,mais que cette licence ne correspondent pas a la version installée
ex: OEM/clicktorun
tu reçois donc les mises a jour pour les deux a chaque fois ,c'etait beaucoup le cas sur les version 2016 un vrai casse tête pour trouver les licences correspondantes
je t'en parle même pas si c'est une version retail
maintenant c'est on line donc .....
 
J'ai simplement désinstallé Office via les paramètres et installé la version 2016 64 bits.
Puis recréé la ListBox, mais rien ne garantit que ça règle le problème.

J'ai fait une petite table des ActiveX TextBox pour prévenir ce phénomène stupide qui fait qu'Excel positionne la TextBox à la fin du texte à la 1ère entrée.
Pour les TextBox ActiveX c'est facile car elle sont permanentes.
Pour les TextBox UserForm il faudrait que je puisse eraser la table à la fermeture du UserForm mais je ne sais pas quand ça arrive.

Edit: encore qu'un même Control d'un UserForm est différent (en tant que Control) d'une instance à l'autre du UserForm. A exploiter !
 

Pièces jointes

Dernière édition:
1742327028442.png
 
a tu essayé ceci avant de bricoler un retour au textbox child
VB:
Private Sub TextBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
nomdetafonctionmousewheel TextBox1.Parent.Controls("Textbox1")
End Sub
😉
 
en testant ca dans un userform avec deux textbox dans une frame ,tu comprendra mieux
Code:
Private Sub TextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
MsgBox ActiveControl.Name
End Sub

Private Sub TextBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
MsgBox TextBox2.Parent.Controls("Textbox2").Name
End Sub
et même ça d'ailleurs
Code:
Private Sub TextBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
MsgBox TextBox2.Parent.ActiveControl.Name
End Sub
 
Ce que j'ai fait ça fonctionne mais c'est biaisé parce que mon code ne détectait pas le MouseMove d'où de la complexité supplémentaire.
J'essaie de recoder mais je rame !

Je reprendrai demain matin.
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

P
Réponses
1
Affichages
834
P
Retour