XL 2016 SetTimer incompatible version excel

carlos

XLDnaute Impliqué
Supporter XLD
Bonjour,
en désinstallant excel 2007 pour excel 2016 mes fichier utilisant la déclaration suivante ne marchent plus : TimerID = SetTimer(0, 0, Interval, AddressOf Chrono)
1576157419894.png

J'ai beau mettre ptrsafe et longptr cela ne résout rien.
Auriez vous une proposition?
Carlos
 

Pièces jointes

  • Chronometrer une classe V 1.2.xls
    100.5 KB · Affichages: 16

Dranreb

XLDnaute Barbatruc
Que les chose soit claires un handle Windows est un handle Windows un point c'est tout.
Et si les développeur d'Excel ont décidé de laisser à Long celui de l'application, c'est qu'ils n'ont pas lieu d'être à LongLong.
Et ça implique que toutes les doc, même celles de Microsoft qui disent le contraire disent des conneries.
 

Dranreb

XLDnaute Barbatruc
Testez tout particulièrement aussi le bouton Démo UFmProg: cet Userform utilise en effet l'API GetForegroundWindow, mais déclaré comme renvoyant un Long et non pas un LongPtr, et les API GetWindowLongA et SetWindowLong demandant aussi un hWind en Long et non pas en LongPtr.
 

carlos

XLDnaute Impliqué
Supporter XLD
Bonsoir,
Danreb, bravo pour ce fichier très intéressant . Il me sera tres utile pour la suite (En particulier les formats aussi).
j'ai teste ton fichier progression et il fonctionne correctement .
Je suis un peu perdu dans tout cela.
Avez vous réussi à le faire fonctionner sous excel 2016 ou plus?
 

Dranreb

XLDnaute Barbatruc
Oui, j'ai Excel 2016, il fonctionnez chez moi, Windows 10 à 64 bits, mais Office 32 bits, pas 64 bits.
Comme d'une part cette programmation d'un timer est un peu délicate, que d'autre part c'est mal commode de l'utiliser dans un objet tel qu'un UserForm, j'ai créé un objet Rythmeur qui sert à ça. Lisez les commentaires d'utilisation dans le module de classe de ce nom. Il utilise un module standard MRythmeur qui n'a pas vocation d'être utilisé par le programmeur d'application.
Recherchez des utilisation d'objets Rythmeur dans le Progression.xlsm. L'exemple le moins chargé c'est dans le module de classe ShapeGlissant: code court, juste un seul Rythmeur appelé R.
Observez y les instruction suivantes :
Private …, WithEvents R As Rythmeur
Set R = New Rythmeur
R.Lancer 25
Private Sub R_Intervient(ByVal Tic As Long)
R.Stopper
C'est simple à utiliser.
 

carlos

XLDnaute Impliqué
Supporter XLD
Bonjour Dranreb,
merci pour tes explications.
Si j'ai bien compris, je ne pourrais pas faire marcher mon fichier simplement en déclarant différemment les variables.
J'ai utilisé ce type de code dans une quinzaine de fichiers qui sont actuellement bloqués.
Mais bon si j'ai pas le choix je vais les reprendre un par un.
Une petite question, que veut dire :
"MRythmeur qui n'a pas vocation d'être utilisé par le programmeur d'application "
Merci beaucoup
Karl
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Regardez ce module standard : Il a juste un procédure StopperTous qui permettrait, si besoin était, d'arrêter tous ceux qui existent, où qu'ils soient, mais :
Rem. En principe vous ne devriez pas avoir besoin de cette procédure, qui désactive tous les objets Rythmeur.
Le reste n'est invoqué que par ces derniers. Il est clairement dit :
Rem. Ne pas utiliser ces autres procédures: elles sont à l'usage exclusif des objets Rythmeur.
C'est le même principe pour le module MPlanificateur, qui n'a qu'une procédure DéplanifierTout, le reste étant à usage exlusif des objets Planification. C'est un module de service mais qui n'est pas à votre service à vous mais à celui des objets Rythmeur. Avez vous bien regardé surtout ce module de classe Ryrhmeur ? C'est celui là qui est documenté pour votre usage dans des UserForm. Il est simple d'emploi: il n'a que deux méthodes, Lancer et Stopper, une propriété Lancé en lecture seule et un évènement Intervient.
 

Dranreb

XLDnaute Barbatruc
Il aurait mieux valu le glisser/déplacer tel qu'il était, à mon avis.
Comme exemples de son utilisation il y a la Worksheet_SelectionChange de la WshDémo et les procédures attachées aux boutons de formulaire de la feuille "Histoires de temps" qui sont dans le module standard ADémo. Avez vous vu qu'il y a aussi un autre système, que j'aurais cru plus adapté à votre besoin, dans la feuille "Autre solution chrono" ?
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour
@Dranreb il y a une seule chose qui m’intéresse même beaucoup dans ton exemple
c'est l’événement intervient qui semble être créé de tout pièce
pourrais tu développer voir un exemple simple sans timer et autre cochonnerie Svp
j'ai bien vu le code "event..." dans la classe et la private sub dans l'usf mais je pige pas son fonctionnement
 

Dranreb

XLDnaute Barbatruc
Bonsoir patricktoulon
Il y a peu de choses à savoir en plus de ce qu'il faut savoir pour tout objet, en fait :
1) — L'instruction Event permet de déclarer un évènement dans de module de classe ou l'UserForm,
2) — Dans le code l'instruction RaiseEvent décrète l'évènement, ce qui peut avoir pour effet de déclencher l'exécution d'une éventuelle procédure de prise en charge de cet évènement dans le module objet utilisateur.
3) — Dans le module objet utilisateur, la variable objet exemplaire du type doit être globale et déclarée avec l'attribut WithEvents
4) — La procédure de prise en charge de l'évènement doit avoir un un nom formé du nom de la variable suivi d'un '_' suivi du nom de l'évènement et porter les paramètres appropriés. D'ailleurs à partir du moment où il est déclaré avec l'attribut WithEvents, il figure dans la liste de gauche qui surmonte la fenêtre de code, et un modèle de procédure correct peut être installé en choisissant l'évènement dans la liste de droite, exactement comme pour tout évènement d'objet implanté par l'application hôte notamment.
Il y a plein d'exemples d'évènements créés de toute pièce dans ma ressource :
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
oui l'implantation j'ai pigé mais je me perd dans tes codes
j'aurais aimé un exemple simple sans toute cette conn.......... de timer qui m'intéresse pas du tout (j'ai déjà ca pour 32 et 64)
je ferais une recherche avec des exemples simples pour en comprendre le fonctionnement
merci quand meme ;)
 

Dranreb

XLDnaute Barbatruc
Essaie de le faire toi même ton exemple simple, tu devrais y arriver, et sinon je te le finirai par ce qu'il faut.
Dans mon Progression.xlsm ce n'est pas compliqué: c'est la TimerProc qui retrouve à l'aide de l'Idt indiquée par Windows l'exemplaire concerné dans le tableau TRythmeurs et appelle sa MéthodeRésevéeÀTimerProc. Celle ci se borne à exécuter le fameux RaiseEvent Intervient(Tic - Tac)
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
ben j'ai essayé figure toi
mai rien n'est declenché j'ai tout virer a la poubelle
en fait je voudrais faire une expérience
je voudrais faire une simple bascule entre methodereservé... event intervient et private sub intervient pour voir si c'est non bloquant (((( sans doevents!!!!!!)))) comme avec ma classe faux timer avec event commandbars
si ca fonctionnait on aurait trouvé le grall ;)
en gros intervient déclencherait intervient
un peu comme dans un control _change en changeant la valeur ca re déclencherait le change
j'arrive a faire ca avec commandbars si on pouvait faire ca avec un event créé de tout piece avec le meme comportement que mon astuce commandbars se serait top ;)
 

Statistiques des forums

Discussions
312 231
Messages
2 086 450
Membres
103 214
dernier inscrit
MASSA1616