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
re
c'est pas la peine de te tuer dudu
c'est toi qui n’écoute pas regarde pas les captures
je te dis que le principe avec handle pour les combo c'est pas bon sur 2013
c' est pour la simple et bonne raison que le handle donné lors du survol sur la combo
est le XLDESK(le UI de l'application excel)si elle est repliée
et EXCEl7(le visible range +heading) si elle est dépliée
et quand on se promène sur la child c'est c'est F3 mdc Popupxxxx
donc en gros j'ai 3 handle de capté selon si elle est dépliée ou pas
parti de la avec la combo sans faire une usine a gaz de switch ben on s'en sort pas

et faire une usine a gaz façon dudu non je suis pas d'accords
le IAccessible fonctionne très bien
le windowfrompoint c'est des tests pour d'autres travaux mais en même temps pour essayer le même principe
moi ce que j'aimerais car j'ai quand même ouvert cette discussion pour faire avancer mon projet et pas celui de dudu hein
c'est que l'on avance sur le scrollable direct après dropbutton sur la combo et pas que sur la child
j'ai déjà fait un truc qui marche mais ça me plait pas
 
et faire une usine a gaz façon dudu non je suis pas d'accords
Oh @Dudu2, tes usines à gaz on n'en veut pas
1742232979870.gif
.

Ben tiens, une nouvelle version de l'usine qui est capable de scroller les TextBox en Frame ou en MultiPage eux-mêmes scrollés.
Dans ce cas, le TextBox_MouseMove est masqué par le Frame_MouseMove ou le MultiPage_MouseMove.
Le TexBox_MouseMove se déclenche mais n'appelle jamais la fonction qu'il devrait appeler.
Tu le crois mon @patricktoulon ?
Au fond, ce n'est pas si difficile et c'est peu de code, faut juste que l'usine (bien structurée) produise le gaz qui va bien
1742233173672.gif
.

Reste juste ce problème stupide de double ListBox qui n'a probablement rien à voir avec le Scroll.
 
Dernière édition:
Bonjour @ChTi160,
Tu as identifié 2 problèmes:
- Celui de la double ListBox (je sais pas ce que je lui ai fait à cette ListBoxn je vais en changer la taille ou la mettre en IntegralHeight = False)
- Celui de la TexBox Active X qui emporte la feuille dans son Scroll, ce que je pensais avoir protégé ! Mais pas d'un Scroll intense.
 
Hello,
PatrickToulon à force de t'acharner sur ce pauvre Dudu2 tu as raté deux posts importants concernant ta version 3 windowfromPoint :
Le post #210 de Nathe et mon post #214
Tu nous laisses une dernière version avec 2 bugs dont 1 grave :
Quand on sélectionne quelque chose dans la combobox on ne peut plus aller autre part sur la feuille que ce qui est visible :
exemple : on ne peut pas aller dans la ligne 50 ou en colonne AB
Cela a rapport avec ce code :
VB:
ActiveSheet.ScrollArea = holdarea

Ami calmant, J.P
 
Bonjour @ChTi160,
Tu as identifié 2 problèmes:
- Celui de la double ListBox (je sais pas ce que je lui ai fait à cette ListBoxn je vais en changer la taille ou la mettre en IntegralHeight = False)
- Celui de la TexBox Active X qui emporte la feuille dans son Scroll, ce que je pensais avoir protégé ! Mais pas d'un Scroll intense.
Le premier bug m'a l'air d'avoir rapport avec le facteur de mise à l'échelle dans les paramètres d'affichage -> est-il à 100% pour ceux qui ont ce problème ?
A essayer pour enlever la double ListBox : Se mettre en Mode Création, sélectionner la ListBox et cliquer plusieurs fois sur Mode Création.
Et vérifier aussi que la version de FM20.dll est correcte. Une fois je me suis retrouvé avec une version qui datait de 2006 :
Dans l'explorer faire une recherche de FM20.dll. Vérifier la date de celui qui est trouvé et noter où il est trouvé. Dans les versions récentes d' office cela doit être dans un répertoire de Microsoft Office.
Ami calmant, J.P
 
Dernière édition:
Bonjour @jurassic pork
je ne m'acharne pas je dis simplement que ici on travaille sur la version Iaccessible que l'on a mis au point ensemble
ou la windowfrompoint

chez moi celle de dudu déraille un peu en plus de me doubler les listbox et j'ai essayé le integralheight pour voir si c’était ça et ça ne change rien
d'autant plus que il affirme des chose qui ne sont pas
du genre
Or en passant de la ListBox au Frame ou inversement le criter sera toujours valide (= True) et donc il ne détecte pas le changement de Control.

alors que la condition de base est
if actualcontrol is control then exit sub
set actualcontrol=control
et dans le do loop on sort si on a plus le handle et la classe

donc au final au move

si actualcontrol est rien ou un autre le control survolé devient actualcontrol
et dans la boucle le test criter vide la variable actualcontrol et sort

mais c'est avant tout un respect
on fini le boulot et après on peut s'éterniser sur une autre méthode ou autre chose
 
PatrickToulon à force de t'acharner sur ce pauvre Dudu2
T'inquiète, les élucubrations de @patricktoulon concernant mon code ou ma façon de coder ne datent pas d'hier.
Que de batailles vécues avec lui depuis plusieurs années sur des tas de sujets. Mais je connais bien le personnage (il n'a jamais tort et n'accepte pas qu'on fasse des remarques sur sa production même si c'est dans une approche positive) et les "t'as pas compris" ou "ton usine à gaz" (nos façons de coder sont radicalement différentes) dans des posts à rallonge que je ne lis même plus ça me passent au-dessus même si je réponds (en court) par principe.

Ceci dit, pour être tout à fait honnête, j'ai assez souvent tiré profit de ses idées techniques et ici même, la V2 que je dois retravailler, lui doit le principe de boucle qui simplifie ma V1 parfaitement fonctionnelle basée sur les RECT.
 
j'aime bien "élucubration"
je montre avec capture que ça ne fonctionne pas chez moi qu'est ce qui faut de plus
chez moi les handle ont un comportement particulier je ne sais pas si c'est du a la version 2013
mais je vois que les versions sur les quelles on travaillait n’intéresse plus personne
merci dudu pour encore une fois foutre une discussion en l'air et un travail qui m'a pris des heures
tu l'a fait comme a l’accoutumé de la même manière que tu le fait jusque dans les sources
Alors que tu pouvais attendre que les solution 1 et 2 soient fini pour en ajouter un 3 eme
comme on le fait souvent quand on participe a d'autre discussion ou l'on s’éternise
MAIS JAMAIS AVANT QUE LE DEMANDEUR N'AI SA RÉPONSE
bon de toute façon ça fait rien la version IAcessible fonctionne très bien et est de loin une bien meilleure solution
que toute les autres (y compris la tienne) sans faire d'UAG
beaucoup moins lourde et il y a aucun raté et beaucoup plus véloce

c'est seulement que j'aurais voulu une solution 2 pour des PC pauvres en librairies ( et oui il en existent encore)
dans certaines entreprises ou les pc sont bridé à mort
windowfrompoint étant une api de la user32 que l'on peut pas brider

je ne sais pas si tu te rend compte mais pour moi ça c'est arrêté en page 11et même 10 car j'ai compris que tu n'a pas compris mes message
on en est a la page 16
je ne sais pas si pour toi ça s’appelle respect mais chez moi non
à méditer (même si je n'ai pas trop d'espoir sur ce point )
fin de transmission
Ne pas répondre à ce message
 
Mesdames et Messieurs,
Ceci est un long Post que vous pouvez ne pas lire, mais ce serait dommage. Enfin pour ceux qui aiment les usines à gaz !
1742306642034.gif


Voici la version retravaillée pour traiter correctement les TextBoxes ce qui n'est pas simple du tout.
  1. Il est impossible d'obtenir un handle de fenêtre de TextBox UserForm avec l'API WindowFromPoint().
    L'API WindowFromPoint() renvoie le handle parent de la TextBox UserForm (UserForm, Frame ou MultiPage).
    Pour résoudre ce problème, le code conserve le RECT de la TextBox UserForm (voir point 3) et l'utilise pour déterminer si le curseur est à l'intérieur ou à l'extérieur lors du scroll de cette TextBox UserForm.

  2. Toutes les fonctions TexBox_MouseMove() de UserForm sont masquées par leur parent UserFom_MouseMove(), Frame_MouseMove() ou MultiPage_MouseMove().
    Ces fonctions TexBox_MouseMove() sont déclenchées, mais la fonction « Parent de la TextBox » _MouseMove() est appelée à la place.
    Pour résoudre ce problème, le code conserve toutes les Child TextBox directes des UserForm, Frame ou MultiPage scrollés et les utilise pour déterminer si le curseur se trouve sur l'une d'elles pendant le scroll du Parent.

  3. Puisqu'il n'est pas possible d'obtenir une fenêtre de TextBox UserForm il a fallu que je détermine les coordonnées d'un Control de UserForm simplement en le parcourant. Ca n'a pas été facile mais j'ai fini par y arriver.
    La fonction GetUserFormControlRECT() fait ce boulot pour n'importe quel Control de UserForm sans API de Window et elle pourrait vous intéresser pour votre usage personnel. Elle est précise et testée.

  4. Attention ! Il faut se méfier de l'instruction
    VB:
    If TypeOf Object Is UserForm
    car elle rend True pour un UserForm, un Frame ou un MultiPage.

    J'ai utilisé cette petite fonction à la place:
    VB:
    Private Function TypeOfObjectIsUserForm(Object As Object) As Boolean
        If TypeOf Object Is UserForm And Not (TypeOf Object Is Frame Or TypeOf Object Is MultiPage) Then
            TypeOfObjectIsUserForm = True
        End If
    End Function
 

Pièces jointes

Dernière édition:

le textbox obligé de se taper toutes les lignes suivantes ou precedentes la curline pour scroller
sur 4 lignes c'est pas trop grave mais quand on en a un paquet comme dans mon vba indenter par exemple
ça fait un peu beaucoup
j'ai déjà donné l'astuce pour éviter ça

raisonnement
textbox calque prise de la mesure avec integral height(tu connais on a vu ça ensemble pour les listbox me semble t il)
split par les sauts de ligne et comptage des lignes
captage du curline
split a partir du curline
recuperation de ce qui est avant en terme de ligne par un simple split par les saut
tu fait le prorata par raport au nombre de ligne possible par rapport au height
et tu sais donc combien il te faut sauter de ligne en plus ou en moins selon le sens du scroll a ajouter ou a enlever avant le premier cran de roulette tu te laisse une marge de une ligne en moins pour la descente et une en plus pour la remonté
donc au final au permier scroll vers le bas ou vers le haut tu aura max 1 ligne a remonter avant le scroll effectif
terminé
 
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