Clin d’œil de fin d’année : Palme d’Or du Festival XLD

crocrocro

XLDnaute Impliqué
En cette année 2024, la Palme d’Or a été attribuée à @Dudu2 , @patricktoulon et @jurassic pork pour le film Les Tontons Flingueurs
Avec dans les rôles principaux :
@patricktoulon (Raoul Volfoni)
@Dudu2 (Fernand Naudin)
@jurassic pork (Maitre Folace)


Les Meilleurs dialogues du Film (en Version Originale)
Fernand
[…] Y a-t-il une parade à part faire mouliner sans fin une macro pour surveiller le Layout de la Window ?

Raoul
[…] à part un SetTimer (en AddressOf) ou un hook récursif (en AddressOf) ou avec le Timer ocx pour Userform, je vois pas.

Maitre Folace
tu peux essayer avec un hook des événements MoveSizeStart et MoveSizeStop
[…] mais avec ce code je reçois les événements MoveSizeStart et MoveSizeEnd en même temps plutôt quand arrive le MoveSizeEnd. Les événements se produisent aussi sur un Resize. Ne pas oublier d'arrêter l'écoute des événements quand on a fini de faire joujou […]

Raoul
Mais je préfère quand même la solution du SetTimer car la fonction exécutée est en AddressOf
donc indépendante de la gestion proc/mémoire de de l'instance vba car tu utilises Application.Ontime qui elle s'inscrit dans stack(proc/mem) de l'instance de l'application

Maitre Folace

[…] utiliser un Application.Ontime pour avoir moins de chance de plantage car c'est indirect (cela se synchronise avec Excel) . Il me semble qu'en 64 bits j'ai pas mal de plantage quand j'utilise un SetTimer avec un AddressOf.

Fernand
Faut effacer la Collection au stop.

Maitre Folace
A mon avis c'est les LongLong dans SetWinEventHook qui ne sont pas bons.

Raoul
j'ai repris mon hook pour le Scroll des Controls liste et adapté à la circonstance
[…] on pourrait même avec cette méthode concevoir un pseudo Event AfterLayout

Fernand
Si c'est le LongLong alors il faut déclarer le 32bit en Currency.
[…] Sinon, j'ai intégré le code fourni par Maitre Folace dans un module.
Hélas on ne peut pas le mettre directement dans une Classe à cause du AdressOf qui n'a pas de résolution dynamique.
Pour faire suite à la remarque de Maitre Folace sur les Application.OnTime, puisque l'appel de la fonction utilisateur sur l'Event Move est synchrone, j'ai protégé la fonction de "Callaback" d'une double exécution avec un Static car en effet avec ces Hook, on ne sait jamais même si sur un Move la probabilité de simultanéité est minime sauf si la fonction utilisateur appelée dure des plombes.

Raoul

Et alors ?
les pseudos Events ne sont appelés par la MouseProc uniquement si la fenêtre a bougé
sinon ça tourne aucune incidence sur le reste des MousesDown MoveUp sur le reste de l'application
MouseDown et OlLeft sont là pour ça. On est dans le même principe que SetTimer sauf que l'on a la possibilité de détecter à quel moment on démarre le déplacement et à quel moment on arrête.
Faudra voir, les déclarations 64 sont bonnes j'ai un souci avec la tienne chez moi dans le vba7 sur la CopiMemory

Maitre Folace
Ben... en fait un LongPtr fait l'affaire, comme dans le code que j'ai modifié

Fernand
Et oui parce qu'on est en 64 bits.
Mais le problème vient du 32 bits.

Maitre Folace
Oui mais la MouseProc est appelée dès qu'on bouge la souris. Si je fais un point d'arrêt dedans à l'entrée ça me plante mon Excel
C'est pour cela que le LongPtr a été inventé. 64 bits pour Excel 64 bits, 32 bits pour Excel 32 bits.

Raoul
Regarde l'effet avec la tienne ! Regarde le curseur !
Pour tester, je passe tout en VB6 l'api Memory me scrache Excel, la déclaration n'est pas bonne en VB7 pour 32bits office 2013

Fernand
Si ça plante chez Raoul, c'est qu'il lui faut aussi 64bits, donc LongPtr ne va pas si c'est ça la cause.
Et en 32 bits on a une donnée de 64 bits avec Currency. Mais il faut que lui le vérifie.

Raoul
Ce n'est absolument pas pour te critiquer Fernand, mais on a un exemple là manifeste de ce que je n'adhère pas dans tes codes […]
Et tu vas chercher les Pseudo Events analogue dans la classe !
Pourquoi fais-tu ça ? ça ne sert à rien ?
Autant gérer ça dans les Pseudo Events du module, et terminé !
Qu'est-ce que tu pourrais bien faire dans la classe que tu ne puisses pas faire dans les Sub du module ?
Tu as un code Event Window parfaitement fonctionnel et tu lui ajoutes une classe…
Surtout que dans la classe, ce ne sont pas non plus des vrais Events !
Je n'ai vu de RaiseEvent nulle part !

Maitre Folace
Raoul, c'est pas pour être rabat-joie mais si on lance ton programme et que l'on fait autre chose dans l'éditeur VBA chez moi ça a tendance à planter. Par exemple lance ton programme et crée un userform.

Raoul
Ah ! ben, c'est sur l'AddressOf et surtout, le hooking est restrictif, je le sais.
Visiblement Fernand a réussi à bien discerner le StartDrag et le EndDrag avec ta version initiale.
Je vais garder ces 3 versions mais sans module classe, c'est pas la peine, voir même tout mettre dans le ThisWorkBook.
Comme çà, dans l'esprit de la classe à Fernand, je gère les Events natifs et les pseudos au même endroit
si c'est possible avec le AddressOf. J'en doute !

Merci au jury de nous avoir attribué ce prix, mais c’est avant tout le travail de toute une équipe.
Nous tenons à remercier le Metteur en Scène Mr X. El Down, le Producteur Mr Arrondi-Au-Multiple, le Cadreur Mr Alea Entre-Bornes, la Costumière Mme ChooseCols, le Chef-Opérateur, l’Assistant Chef-Opérateur, la Maquilleuse, le Directeur de la Photographie et son appareil Photo, l’Ingénieur du Son et son Son, le PerchMan … la Concierge et son escalier, le mari de la Concierge, les enfants de la Concierge, le chien de la Concierge…

Claude Lelouch a dit « Le Cinéma, c’est mieux que la Vie ! »
Nous sommes heureux de vous apprendre que nous avons réussi à prouver que ce n’était pas vrai.
En voici la démonstration

VB:
Sub Le_cinéma_est_ce_mieux_que_la_vie()
Dim Fin_de_la_séance As Boolean
Dim Heure_de_fin_de_la_séance As Double
Dim Durée_de_la_séance As Integer
Dim le_cinéma As Double
Dim Debut_de_la_vie As Double
Dim la_vie As Double
    Debut_de_la_vie = Timer
    Durée_de_la_séance = 20 ' 20 secondes, le temps de la pub !
    Heure_de_fin_de_la_séance = Timer + Durée_de_la_séance
    While Not Fin_de_la_séance
        le_cinéma = le_cinéma + 1
        la_vie = la_vie + 1 ' et pourquoi on pourrait pas écrire çà ?
        If Timer >= Heure_de_fin_de_la_séance Then
            Fin_de_la_séance = True
        End If
    Wend
    la_vie = la_vie + Timer - Debut_de_la_vie
    If le_cinéma > la_vie Then
        MsgBox "Le Cinéma c'est mieux que la vie !", vbExclamation, "Le Cinéma c'est mieux que la vie ?"
    Else
        MsgBox "C'est pas vrai, Na !", vbExclamation, "Le Cinéma c'est mieux que la vie ?"
    End If
End Sub

Blague à part,
👍👍👍 à vous 3 pour votre niveau XLD toujours aussi impressionnant !

Dans cette discussion , je me suis senti comme Champollion sans sa Pierre de Rosette 🤔🤔🤔
 

patricktoulon

XLDnaute Barbatruc
il est génial ce @crocrocro
joking touche pas a mon poste GIF by C8
 

Statistiques des forums

Discussions
315 124
Messages
2 116 460
Membres
112 748
dernier inscrit
Pboiusquet