Page 1 sur 1

[R] HotKeySet, Func et paramètre

Posté : ven. 09 sept. 2016 11:25
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é ?

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

Posté : ven. 09 sept. 2016 11:56
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

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

Posté : ven. 09 sept. 2016 12:33
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 ?

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

Posté : ven. 09 sept. 2016 15:12
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.

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

Posté : ven. 09 sept. 2016 17:06
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

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

Posté : sam. 10 sept. 2016 01:36
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

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

Posté : sam. 10 sept. 2016 10:22
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:

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

Posté : dim. 11 sept. 2016 21:06
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

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

Posté : mar. 13 sept. 2016 00:12
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.

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

Posté : mar. 13 sept. 2016 00:39
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

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

Posté : mar. 13 sept. 2016 13:41
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.

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

Posté : mer. 14 sept. 2016 14:28
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...

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

Posté : mer. 14 sept. 2016 21:57
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:

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

Posté : jeu. 15 sept. 2016 00:08
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.

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

Posté : jeu. 15 sept. 2016 01:10
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" ?

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

Posté : jeu. 15 sept. 2016 12:24
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.