[R] HotKeySet, Func et paramètre

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

[R] HotKeySet, Func et paramètre

#1

Message par jpascal »

Bonjour,

Code : Tout sélectionner

HotKeySet("{F9}", "Test")

Test(True)

While 1
	Sleep(10)
WEnd

Func Test($bTest = False)
	ConsoleWrite($bTest & @CRLF)
EndFunc
Lorsque je lance ce script et que j'appuie sur F9, j'obtiens l'erreur :

Code : Tout sélectionner

Test Func Hotkey.au3" (10) : ==> Variable used without being declared.:
ConsoleWrite($bTest & @CRLF)
ConsoleWrite(^ ERROR
Comment dois-je coder pour obtenir le résultat escompté ?
Modifié en dernier par jpascal le lun. 18 févr. 2019 17:14, modifié 1 fois.
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] HotKeySet, Func et paramètre

#2

Message par TommyDDR »

En général je créé une fonction HK_Xxx qui appelera xxx.
HotKeySet("{F9}", "HK_Test")

Test(True)

While 1
   Sleep(10)
WEnd

Func HK_Test()
   Test()
EndFunc

Func Test($bTest = False)
   ConsoleWrite($bTest & @CRLF)
EndFunc
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] HotKeySet, Func et paramètre

#3

Message par jpascal »

Merci.
Je pensais faire la même chose mais je me demandais s'il n'y avait pas une syntaxe particulière.

Est-ce donc une limitation du langage ?
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] HotKeySet, Func et paramètre

#4

Message par orax »

Oui, je pense qu'on peut considérer ça comme une limitation du langage. Il n'y a pas une syntaxe particulière, ce n'est juste pas possible.

On peut aussi utiliser la macro @HotKeyPressed pour contourner cette limitation :
HotKeySet("{F8}", "Test")
HotKeySet("{F9}", "Test")

While 1
   Sleep(1000)
WEnd

Func Test()
   ConsoleWrite(@HotKeyPressed & @CRLF)
   Local $bTest
   Switch @HotKeyPressed
      Case "{F8}"
         $bTest = True
      Case "{F9}"
         $bTest = False
   EndSwitch
   ConsoleWrite($bTest & @CRLF)
EndFunc   ;==>Test
Mais ça ne change rien au fait que lorsque la fonction Test() est appelée par HotKeySet, les paramètres de celle-ci sont ignorés.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] HotKeySet, Func et paramètre

#5

Message par jguinch »

Je pense plus à une mauvaise utilisation du langage qu'à une limitation.
Autre possibilité :
HotKeySet("{F9}", "Test")

Test(True)

While 1
   Sleep(10)
WEnd

Func Test($bTest = False)
   If @NumParams Then
      $cTest = $bTest
   Else
      Local $cTest = False
   EndIf
   ConsoleWrite($cTest & @CRLF)
EndFunc
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] HotKeySet, Func et paramètre

#6

Message par Tlem »

Bonsoir.
A quoi cela sert il de créer une fonction avec paramètre(s) alors que celle-ci est appelée par une commande qui ne peut pas en envoyer ?

Envoyé de mon appareil mobile avec Tapatalk
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] HotKeySet, Func et paramètre

#7

Message par mikell »

J'imagine que c'est pour que la fonction puisse avoir des retours différents selon le déroulement du script ou autre
La situation est la même en mode événementiel (où la question se pose souvent)
Thierry ça fait longtemps que tu n'as pas codé ? :mrgreen:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] HotKeySet, Func et paramètre

#8

Message par Tlem »

Pour pouvoir coder, il faut un peu de temps. Depuis un bon moment, cette denrée me fait cruellement défaut. ^^

Concernant l'argument de la fonction, si celles-ci est utilisée en dehors du HotKeySet ok, sinon, aucun intérêt.
A ce moment là, le passage de valeur peut simplement ce faire par variable globale. ;)

Envoyé de mon appareil mobile avec Tapatalk
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] HotKeySet, Func et paramètre

#9

Message par TommyDDR »

jguinch a écrit :Je pense plus à une mauvaise utilisation du langage qu'à une limitation.
Autre possibilité :
HotKeySet("{F9}", "Test")

Test(True)

While 1
   Sleep(10)
WEnd

Func Test($bTest = False)
   If @NumParams Then
      $cTest = $bTest
   Else
      Local $cTest = False
   EndIf
   ConsoleWrite($cTest & @CRLF)
EndFunc
Je ne suis pas d'accord, on défini clairement que $bTest doit être égal à false si non renseigné, avec le if/else en exemple on doit le définir 2 fois, ce qui ne me semble pas logique. Et l'écriture "paramètre optionnel" devient même inutile avec cette technique.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] HotKeySet, Func et paramètre

#10

Message par orax »

En effet.
HotKeySet("{F9}", "Test") ; écrit "0 False" quand F9 est pressé

Test()    ; écrit "-1 False"
Test(True) ; écrit "-1 True"

While 1
   Sleep(10)
WEnd

Func Test($bTest = False)
   Local $cTest
   If @HotKeyPressed Then
      $cTest = False
   Else
      $cTest = $bTest
   EndIf
   ConsoleWrite(IsDeclared("bTest") & @TAB & $cTest & @CRLF) ; IsDeclared retourne -1 quand la variable a une portée locale (Local), et 0 quand elle n'est pas déclarée
EndFunc   ;==>Test
Ou...
#include <AutoItConstants.au3>
HotKeySet("{F9}", "Test")

Test()
Test(True)

While 1
   Sleep(10)
WEnd

Func Test($bTest = False)
   If @HotKeyPressed Then
      Assign("bTest", False, $ASSIGN_FORCELOCAL)
   EndIf
   ConsoleWrite($bTest & @CRLF)
EndFunc   ;==>Test
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] HotKeySet, Func et paramètre

#11

Message par jchd »

Une utilisation plus souple :

Code : Tout sélectionner

HotKeySet("{Esc}", "_Exit")
HotKeySet("{F9}", Test)

Test()
Test(False)
Test(True)

While 1
	Sleep(10)
WEnd

Func Test($bTest = Default)
	Static $cTest = False
	ConsoleWrite("Invocation de Test " & (@NumParams ? "avec " & $bTest : "sans argument.") & @CRLF)
	If @NumParams Then
		$cTest = $bTest
	Else
		$cTest = Not $cTest
	EndIf
	ConsoleWrite("La variable statique est maintenant " & $cTest & @CRLF)
EndFunc

Func _Exit()
	Exit
EndFunc
Pour la démo je fais la négation de la variable statique lorsque la fonction est appelée sans argument, mais on est libre d'adapter à tout autre chose.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] HotKeySet, Func et paramètre

#12

Message par jguinch »

Voià ce que dit la doc pour HotKeySet:
The called function can not be given parameters. They will be ignored.
@HotKeyPressed macro can be used inside the function to handle several keys in the same function.

Donc pour moi c'est très clair.
Le comportement est le même pour d'autres fonctions, comme AdlibRegister ou GUICtrlSetOnEvent, et c'est à chaque fois expliqué dans la doc : You can not call a function using parameters.
Donc à partir du moment où on est prévenu, je ne pense pas qu'on puisse dire que c'est un bug.

Par contre, je suis entièrement d'accord avec le fait que le paramètre optionnel pourrait/devrait prendre la valeur par défaut. Mais dans ce cas, qu'en sera t-il si le paramètre n'est pas optionnel ? Donc l'utilisation @NumParams ne me paraît pas mauvaise...
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] HotKeySet, Func et paramètre

#13

Message par mikell »

Tlem a écrit :Concernant l'argument de la fonction, si celles-ci est utilisée en dehors du HotKeySet ok, sinon, aucun intérêt.
A ce moment là, le passage de valeur peut simplement ce faire par variable globale.
Absolument d'accord. Et ça évite les prises de tête à essayer à toute force de faire rentrer une forme carrée dans un trou rond - ce qui est toujours possible avec un bon marteau :roll:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] HotKeySet, Func et paramètre

#14

Message par jchd »

Désolé, mais l'utilisation de variables globales dans ce cas précis n'est pas la solution la plus propre. Les variables statiques sont bien plus "propres" et ce paradigme s'applique correctement dans du code complexe, où le foisonnement des variables globales devient vite rédhibitoire.

Par ailleurs il n'y a aucun problème à invoquer par HotKeySet, AdLibRegister, ... une fonction spécifiant des paramètres optionnels.

Valik était un fervent supporter (dans le genre "ultra") de ces pratiques et je suis tout à fait de son avis.
Même si AutoIt n'est pas un design "OO" à la base, il est de beaucoup préférable de disposer de fonctions agissant comme des méthodes pour ce type d'opération. Le code nécessaire est à peine plus lourd et la manipulation de variables "internes" est rendue étanche à l'eau et aux poussières.

Bon, je dis ça mais il ne faut pas non plus s'arc-bouter sur une idée fixe et vouloir, par exemple, "objettiser" toute une GUI AutoIt complexe pour le plaisir. Mais si une façon simple et robuste de coder est disponible sans contorsion particulière, autant l'utiliser. C'est quand même mieux que du Basic des années 70, avec 4317 variables forcément globales et un seul sac de 13504 lignes de nouilles à GOTOs pour fil d'Ariane.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] HotKeySet, Func et paramètre

#15

Message par TommyDDR »

@jchd : Pourquoi ne pas simplement affecter les valeurs par défaut des paramètres optionnels ?
Est-ce une réelle contrainte de code derrière ou cela pourrait-il être fait "facilement" ?
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] HotKeySet, Func et paramètre

#16

Message par jchd »

Je n'ai aucune vue sur les implications de ce changement et ça fait partie du jardin privé de Jon, seul développeur à l'heure actuelle et fort occupé à fouetter d'autres chats. Ceci dit je ne crois pas que ça serait aussi simple que ça sauf dans le cas de variables "plates" (local, copy on write ou référence).

Il faut bien voir qu'AutoIt n'a pas été développé à la base comme un projet de langage ambitieux et bien structuré, mais plutôt comme une chouette bidouille permettant de simplifier des tâches d'administration et qui a connu un développement en spirale, parfois un poil anarchique. Du coup et à défaut d'un plan bien clair, il y a beaucoup de choix qui mériteraient d'être revisités. Cela ne pourrait se faire qu'avec une révision majeure type AU4 et nombre de "code breaking changes" et ce n'est pas prêt d'arriver.

On peut percevoir AutoIt comme en phase préliminaire de sclérose, mais il faut tout de même lui reconnaître une belle efficacité dans nombre de cas d'utilisation. Donc vivre avec en bonne intelligence avec ses creux et ses bosses ou faire le choix d'une autre plate-forme plus carrée.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre