Page 1 sur 1
[..] Bouton, Case | Comment annuler une autre fonction ?
Posté : mar. 08 mars 2011 10:43
par cbourree
Bonjour,
J'ai appris Autoit grâce à ce tutoriel
http://www.siteduzero.com/tutoriel-3-22 ... utoit.html
Je ne suis pas sur le PC avec mon programme donc vous n'aurez pas de code mais juste des explications :
Imaginons que j'ai deux boutons, je clique sur le premier qui m'envoi donc sur une fonction très longue.
Case $Buton1

fonction_très_longue()
Et je voudrai savoir comment faire pour que le deuxième bouton arrête tout de suite l'autre. Même si les calcules ne sont pas terminés.
Case $Bouton2

stop_bouton1()
Merci d'avance
Re: [..] Bouton, Case | Comment annuler une autre fonction
Posté : mar. 08 mars 2011 15:18
par zeshrek
Si ta fonction tres longue est une boucle, c'est faisable. Il suffit que tu mettes un GUIGetMsg() dedans pour intercepter le clic sur le boutton 2 et que tu fasses un return en cas de clic.
Par contre si ta fonction est linéaire... a part en parsemant ton code de GUIGetMsg() je ne vois pas trop.
Re: [..] Bouton, Case | Comment annuler une autre fonction
Posté : mar. 08 mars 2011 16:11
par cbourree
Je ne suis pas un pro :
"que tu fasses un return en cas de clic." Je ne comprend pas, Késako ? a quoi sa sert ?
Re: [..] Bouton, Case | Comment annuler une autre fonction
Posté : mar. 08 mars 2011 16:45
par sksbir
cbourree a écrit :Je ne suis pas un pro :
"que tu fasses un return en cas de clic." Je ne comprend pas, Késako ? a quoi sa sert ?
Code : Tout sélectionner
func fonction_tres_longue()
for I=1 to 100000000000000000000000000000
; mon calcul
;blablabla ... c'est ton calcul hein...
; interception:
if GUIGetMsg()=$AUTREBOUTON then return
next
endfunc
Re: [..] Bouton, Case | Comment annuler une autre fonction
Posté : mar. 08 mars 2011 16:45
par Iste
Le mode événementiel pourrait il aider ?
Re: [..] Bouton, Case | Comment annuler une autre fonction
Posté : mar. 08 mars 2011 16:51
par cbourree
Donc si j'ai bien compris je doit faire une ligne if pour tous les autres boutons ?
Code : Tout sélectionner
func fonction_tres_longue()
for I=1 to 100000000000000000000000000000
; mon calcul
;blablabla ... c'est ton calcul hein...
; interception:
If GUIGetMsg()=$AUTREBOUTON then return
next
Endfunc
next ? Sa sort de la case ?
Re: [..] Bouton, Case | Comment annuler une autre fonction
Posté : mar. 08 mars 2011 16:53
par sksbir
cbourree a écrit :Donc si j'ai bien compris je doit faire une ligne if pour tous les autres boutons ?
ha.. si tu as d'autres boutons, alors ça se complique..
next ? Sa correspond a un ExitCase ?
Non, "next" correspond au "for" qui est au dessus.
mais sinon, c'est quoi cette fonction très longue au juste ? ça nous aiderait de le savoir pour pas te proposer des solutions un peu au pif...
Re: [..] Bouton, Case | Comment annuler une autre fonction
Posté : mar. 08 mars 2011 16:55
par cbourree
Je n'avais pas vu le for.
J'ai l'impression que personne ne va prendre le temps de m'expliquer alors imaginons que je fasse un bouton stop, cela facilitera les choses ?
Re: [..] Bouton, Case | Comment annuler une autre fonction
Posté : mar. 08 mars 2011 16:59
par GaRydelaMer
Une autre solution
une variable Globale
$bCancel = False
Avec la GUI ajouter : un bouton annuler et GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")
Avec comme code:
Code : Tout sélectionner
Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
#forceref $hWnd, $Msg, $wParam, $lParam
Local $iCtrl = BitAND($wParam, 0x0000FFFF)
If $iCtrl = $Bt_Annuler Then
Local $Msg = "Voulez-vous vraiment arrêter le process ?"
If MsgBox(4 + 32 + 256 + 4096, "Arrêt", $Msg, 10) = 6 Then $bCancel = True
EndIf
EndFunc ;==>_WM_COMMAND
Puis dans ta longue fonction
Si c'est une boucle:
Sinon à toi de tester la variable $bCancel dans la suite de ton programme.
Re: [..] Bouton, Case | Comment annuler une autre fonction
Posté : mar. 08 mars 2011 17:00
par cbourree
Merci beaucoup je n'ai pas mon code donc je peux pas tester mais je pense que sa va marcher.
Re: [..] Bouton, Case | Comment annuler une autre fonction
Posté : mar. 08 mars 2011 17:07
par GaRydelaMer
Dernier point
c'est vrai que sans code c'est pas évident de bien répondre.
Oublie pas, le code que je t'ai donné avant marche très bien avec un While ou un Do, dans le cas d'un For pense à
Return, sortira de la fonction en renvoyant une valeur si besoin est
Dans ta fonction appelante, tu pourras récupérer une erreur
Code : Tout sélectionner
local $Return = TaLonguuuuuuueeeeeeFonctionnnnn()
If @error Then
If $Return = "Annuler" Then
$bCancel = False
MsgBox(0,"", "Vous avez annuler")
Endif
EndIf
Un autre truc c'est un ExitLoop, qui sortira de la boucle et continuera le traitement a la suite de la boucle avant le retour de ta fonction.
Re: [..] Bouton, Case | Comment annuler une autre fonction
Posté : mar. 08 mars 2011 17:10
par sksbir
cbourree a écrit :Je n'avais pas vu le for.
J'ai l'impression que personne ne va prendre le temps de m'expliquer alors imaginons que je fasse un bouton stop, cela facilitera les choses ?
J'ai donné un exemple qui illustre la proposition de zeshrek.( rappel : la proposition , c'est "que tu fasses un return en cas de clic" )
Donc, quand tu vas cliquer, comme ton programme sera dans la boucle de 1 à 1000000000 car en train de calculer ta fonction, GUIGetMsg() va prendre la valeur du truc que t'as cliqué, et si c'est le bon, ça sortira de la fonction.
Et sinon, oui, tu peux faire un test pour chaque bouton potentiellement cliquable dans ton interface au moment de la boucle de calcul.
Re: [..] Bouton, Case | Comment annuler une autre fonction
Posté : mar. 08 mars 2011 17:17
par cbourree
cbourree a écrit :Merci beaucoup je n'ai pas mon code donc je peux pas tester mais je pense que sa va marcher.
Je me cite moi même

Je suis qu'un égocentrique.
Non rien a dire d'autre, merci
Re: [..] Bouton, Case | Comment annuler une autre fonction
Posté : mar. 08 mars 2011 21:56
par timmalos
Je viens au devant : Si cette solution ne marche pas nous aurons besoin de votre code source entier pour pouvoir vous aider, vous nous donnez trop peu d'informations. Merci