Page 1 sur 1

[RESOLU] Débutants : Affichage de l'heure en temps réel

Posté : mer. 29 mai 2019 09:13
par xerces49
Bonjour à tous,

J'ai créé un petit programme (avec une base modifiée trouvé ici je crois) dont vous trouverez le code ci-dessous et j'ai encore besoin de votre aide.

Dans le footer (en bas à droite) de celui-ci, j'arrive à afficher la date et l'heure sans soucis.
Ce que je voudrais, c'est afficher l'heure en temps réel mais je ne vois pas bien comment faire et mes tests n'ont pas été concluant.

Votre aide sur ce sujet serait grandement apprécié.

Voici le code le plus dépouillé possible :

Code : Tout sélectionner

;-----------------------------------------------------------
; Définition du footer
;-----------------------------------------------------------
$hFooter = GUICtrlCreateLabel($sFooter, 10, $iH - 34, $iW - 20, 17, BitOR($SS_LEFT, $SS_CENTERIMAGE))
GUICtrlSetCursor(-1, 0)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)

;Affichage de la date et l'heure
	;Affichage de la date
$Date = GUICtrlCreateLabel(_DateTimeFormat( _NowCalc(),1), 520, 499, 105, 100, $SS_CENTER) ; La date.
GUICtrlSetFont(-1, 8.5, 100, 0)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)

	;Séparation entre la date et l'heure par un tiret
GUICtrlCreateLabel("-", 630, 499, 10, 20)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)

	;Affichage de l'heure
$Time = GUICtrlCreateLabel (_DateTimeFormat( _NowCalc(),5), 635, 499, 50, 30, $SS_CENTER)  ; L'heure.
GUICtrlSetFont(-1, 8.5, 100, 0) ; Pour la font
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)

;-----------------------------------------------------------
; Déclarer par défaut le panel1
;-----------------------------------------------------------
GUISwitch($aPanel[1])
;Montrer la GUI principale
GUISetState(@SW_SHOW, $hMainGUI)

While 1
Sleep(10)
$nMsg = GUIGetMsg(1)
Switch $nMsg[1]
Case $hMainGUI
Switch $nMsg[0]
Case $GUI_EVENT_CLOSE
Exit
Case $GUI_EVENT_MINIMIZE, $GUI_EVENT_MAXIMIZE, $GUI_EVENT_RESTORE
$aPos = WinGetPos($hMainGUI)
$iW = $aPos[2]
$iH = $aPos[3]
For $i = 0 To $aPanel[0]
WinMove($aPanel[$i], "", $iLeftWidth + 2, $iT, $iW - $iLeftWidth + 2, $iH - $iT - $iB - 20)
Next

Encore merci pour vos futures réponses.

EDIT:

Problème résolu.
Ajout de la commande :

GUICtrlSetData($Time,_DataTimeFormat( _NowCalc(),5))

dans la section Déclarer par défaut le panel 1

Re: [RESOLU] Débutants : Affichage de l'heure en temps réel

Posté : mer. 29 mai 2019 14:10
par mikell
Vaudrait mieux mettre ce GUICtrlSetData dans une fonction lancée 1 fois par seconde avec AdlibRegister, ça serait largement suffisant et consommerait beaucoup moins de ressources ^^

Re: [RESOLU] Débutants : Affichage de l'heure en temps réel

Posté : mer. 29 mai 2019 16:09
par xerces49
mikell a écrit : mer. 29 mai 2019 14:10Vaudrait mieux mettre ce GUICtrlSetData dans une fonction lancée 1 fois par seconde avec AdlibRegister, ça serait largement suffisant et consommerait beaucoup moins de ressources ^^
@mikell :

Ah ba je ne dis pas non si cela est mieux...
Je ne connais pas adlibRegister ;;;;)

Comment puis-je faire ce que tu me dis...

Re: Débutants : Affichage de l'heure en temps réel  

Posté : mer. 29 mai 2019 22:07
par mikell
Ben par exemple, juste avant la boucle While principale, mettre ça
AdlibRegister("_updateTime", 1000)

Et créer en fin de script cette fonction :
Func _updateTime()
   GUICtrlSetData($Time,_DateTimeFormat( _NowCalc(),5))
EndFunc

Re: Débutants : Affichage de l'heure en temps réel

Posté : jeu. 30 mai 2019 11:37
par TommyDDR
Mikell !

AutoIt a évolué depuis ! :)

Préférez :
AdlibRegister(_updateTime, 1000)
(sans les guillemets)

L'effet sera le même, sauf que si vous faites une erreur de frappe et que le nom dans adlibregister ne correspond pas à celui de votre fonction, vous aurez une erreur à la compilation pour vous l'avertir.

Re: Débutants : Affichage de l'heure en temps réel

Posté : jeu. 30 mai 2019 16:40
par mikell
Diable :mrgreen:
Bêtement et avec discipline je suis les consignes du fichier d'aide où ya des guillemets...

Il y a une référence(1) de cette 'évolution' quelque part ?
si ça se trouve on peut aussi enlever les guillemets dans les fonctions *setonevent !


(1): qui ne soit pas référence au MLF (mouvement de libération des fonctions) visant à proscrire ces guillemets restrictifs, patriarcaux et bourgeois qui évoquent fâcheusement les strings (en plus)

Re: Débutants : Affichage de l'heure en temps réel

Posté : jeu. 30 mai 2019 20:43
par jchd
3.3.10.0 (23rd December, 2013) (Release)
...
Added: Functions can now be referenced in variables and the function can be called through the variable.
Added: FuncName().
Added: Built-in functions that take a callback now be passed directly in addition to the old method of passing as a string. Built-in functions can also be passed now (be careful that the function you pass matches what the caller expects).

Code : Tout sélectionner

Global $AD = _DebugArrayDisplay, $CW = @Compiled ? __ConsoleWrite : _ConsoleWrite

Func __ConsoleWrite(ByRef $s)
	Local Static $hCon = __ConsoleInit()
	DllCall("kernel32.dll", "bool", "WriteConsoleW", "handle", $hCon, "wstr", $s & @LF, "dword", StringLen($s) + 1, "dword*", 0, "ptr", 0)
	Return
EndFunc

Func __ConsoleInit()
	DllCall("kernel32.dll", "bool", "AllocConsole")
	Return DllCall("kernel32.dll", "handle", "GetStdHandle", "int", -11)[0]
EndFunc

; Unicode-aware ConsoleWrite
Func _ConsoleWrite($s)
	ConsoleWrite(BinaryToString(StringToBinary($s & @LF, 4), 1))
EndFunc   ;==>_ConsoleWrite
Avec ça :
$CW("tagada")

Re: Débutants : Affichage de l'heure en temps réel

Posté : ven. 31 mai 2019 18:08
par mikell
Ah ok. 2013, en effet ça nous rajeunit pas Image
La mention est quand même vachement discrète, et je pense passée inaperçue auprès de 99% des utilisateurs. D'autant plus que dans le fichier d'aide, les guillemets sont partout et il n'y a nulle part la remarque "quotes are optional" dans les définitions en en-tête, par exemple GUIRegisterMsg ( msgID, "function" )
A part celui cité par TommyDDR, y a-t-il d'autres avantages à ne pas utiliser les guillemets ?
Edit : et l'attribution à une variable comme dans ton exemple bien sûr

Re: Débutants : Affichage de l'heure en temps réel

Posté : sam. 01 juin 2019 09:48
par TommyDDR
Peut-être la rapidité d'exécution, après plusieurs essais, il semblerait qu'un call sans guillemets soit légèrement plus rapide qu'un call avec guillemets (en moyenne : 5600 avec contre 5050 sans)
Local $timer = TimerInit()
For $i = 0 To 2000000
   Call(test)
Next
ConsoleWrite(TimerDiff($timer) & @CRLF)

Func test()
   Local Static $var = 0
   $var += 1
EndFunc
Et sinon, je dirais tout simplement que c'est plus propre sans !
(Tout comme on évite les éval => $test = Execute("$test + 1"))

Re: Débutants : Affichage de l'heure en temps réel

Posté : sam. 01 juin 2019 10:29
par jchd
Oui, et si on se passe du Call, on franchit le mur du çon :

Code : Tout sélectionner

Local $timer = TimerInit()
For $i = 0 To 2000000
    Call("test")
Next
ConsoleWrite('Call("test")' & @TAB & TimerDiff($timer) & @CRLF)

$timer = TimerInit()
For $i = 0 To 2000000
    Call(test)
Next
ConsoleWrite("Call(test)  " & @TAB & TimerDiff($timer) & @CRLF)

$timer = TimerInit()
Local $fct = test
For $i = 0 To 2000000
    $fct()
Next
ConsoleWrite("$fct()      " & @TAB & TimerDiff($timer) & @CRLF)

Func test()
    Local Static $var = 0
    $var += 1
EndFunc

Re: Débutants : Affichage de l'heure en temps réel

Posté : sam. 01 juin 2019 21:51
par mikell
N'en jetez plus :mrgreen:
Même s'il m'arrive plutôt rarement de me préoccuper des millièmes de seconde quand j'appelle 2000000 fois de suite une fonction, je suis convaincu. Surtout que ça
TommyDDR a écrit : sam. 01 juin 2019 09:48c'est plus propre sans
c'est indubitablement L'Argument massue, indiscutable et définitif

Re: Débutants : Affichage de l'heure en temps réel

Posté : lun. 03 juin 2019 09:52
par xerces49
Merci pour l'info mais c'est très bizarre.
Au niveau de ma fonction en fin de script, Scite me dit que celle_ci existe déjà et ensuite qu'elle n'est pas déclaré !!!

warning: $Time: possibly used before declaration
error: $Time: undeclared global variable


Alors que $Time est bien déclaré en amont vu que c'est un label qui affiche l'heure...

Re: Débutants : Affichage de l'heure en temps réel

Posté : lun. 03 juin 2019 10:58
par jchd
Du coup, $Time est une fonction ou un label ? Pas clair ça ...
En fait, je suppose que c'est une variable qui doit être mise à jour par la fonction _updateTime invoquée via AdlibRegister, mais que l'appel à AdlibRegister est situé dans le source avant la déclaration de $Time.

Comme on n'a pas de code on est réduits à des conjectures vaseuses, comme trop souvent.

Re: Débutants : Affichage de l'heure en temps réel

Posté : lun. 03 juin 2019 11:17
par mikell
Difficile de répondre sans voir le code et surtout son organisation
Tu peux toujours essayer "Global $Time" en tête de script mais on n'aura toujours pas d'explication sur le problème

Edit : je viens de voir que jc a dit en gros la même chose ^^
Il se peut aussi que $Time soit déclarée en Local si la gui est construite dans une fonction... etc

Re: Débutants : Affichage de l'heure en temps réel

Posté : lun. 03 juin 2019 12:26
par xerces49
Plop, une partie du code est dans le premier post...

La partie ou j'affiche l'heure sur la GUI :

Code : Tout sélectionner

;Affichage de l'heure
$Time = GUICtrlCreateLabel (_DateTimeFormat( _NowCalc(),5), 635, 499, 50, 30, $SS_CENTER)  ; L'heure.
GUICtrlSetFont(-1, 8.5, 100, 0) ; Pour la font
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)
Et la partie ou j'update l'heure sur la GUI :

Code : Tout sélectionner

-----------------------------------------------------------
; Déclarer par défaut le panel1
;-----------------------------------------------------------
GUISwitch($aPanel[1])
;Montrer la GUI principale
GUISetState(@SW_SHOW, $hMainGUI)

While 1
Sleep(10)
$nMsg = GUIGetMsg(1)


GUICtrlSetData($Time,_DataTimeFormat( _NowCalc(),5))


Switch $nMsg[1]
Case $hMainGUI
Switch $nMsg[0]
Case $GUI_EVENT_CLOSE
Exit
Case $GUI_EVENT_MINIMIZE, $GUI_EVENT_MAXIMIZE, $GUI_EVENT_RESTORE
$aPos = WinGetPos($hMainGUI)
$iW = $aPos[2]
$iH = $aPos[3]
For $i = 0 To $aPanel[0]
WinMove($aPanel[$i], "", $iLeftWidth + 2, $iT, $iW - $iLeftWidth + 2, $iH - $iT - $iB - 20)
Next

EDIT: Suppression du code intégrale.

Re: Débutants : Affichage de l'heure en temps réel

Posté : lun. 03 juin 2019 14:10
par mikell
mikell a écrit : lun. 03 juin 2019 11:17Il se peut aussi que $Time soit déclarée en Local si la gui est construite dans une fonction
Gagné :mrgreen:

Re: Débutants : Affichage de l'heure en temps réel

Posté : lun. 03 juin 2019 14:13
par xerces49
Donc ?
Pouvez-vous m'expliquer mon erreur ?

Re: Débutants : Affichage de l'heure en temps réel

Posté : lun. 03 juin 2019 19:23
par mikell
On sent bien les efforts de compréhension démesurés qui ont été réalisés par l'auteur de cette question :cry:

Donc
1) Une variable (par exemple $Time) créée sans scope dans une fonction (par exemple _MainGui) est locale
" If you declare a variable inside a function it is in local scope and can only be used within that same function. Variables created inside functions are automatically destroyed when the function ends. " (fichier d'aide)
2) error: $Time: undeclared global variable

L'aide dit aussi
" By default when variables are declared using Dim or assigned in a function they have local scope unless there is a global variable of the same name (in which case the global variable is reused). "
Mais j'imagine aisément que le test suggéré
essayer "Global $Time" en tête de script
n'a pas été fait...

Re: Débutants : Affichage de l'heure en temps réel

Posté : lun. 03 juin 2019 19:30
par xerces49
mikell a écrit : lun. 03 juin 2019 19:23 On sent bien les efforts de compréhension démesurés qui ont été réalisés par l'auteur de cette question :cry:

Donc
1) Une variable (par exemple $Time) créée sans scope dans une fonction (par exemple _MainGui) est locale
" If you declare a variable inside a function it is in local scope and can only be used within that same function. Variables created inside functions are automatically destroyed when the function ends. " (fichier d'aide)
2) error: $Time: undeclared global variable

L'aide dit aussi
" By default when variables are declared using Dim or assigned in a function they have local scope unless there is a global variable of the same name (in which case the global variable is reused). "
Mais j'imagine aisément que le test suggéré
essayer "Global $Time" en tête de script
n'a pas été fait...
Bsr,

Euuuuhhh Ok, c'est pas en se congratulant et en se payant la tête d'un débutant que ça va aidé hein (1er script, 1ère prog)...
D’où ma demande: Donc? ... Sinon j'aurais fait un minimum d'effort. (je n'aime pas qu'on se foute de moi..)

En journée, je suis au taf aussi donc je ne peux pas testé tt le temps...
Je testerais donc, mais essayer d'être sympa sans se payer ma tête, ça serait gentils aussi...

De plus, je demandais juste une explication et non pas une solution toute crue. Je ne manges pas de ce pain là., je préfère comprendre mes erreurs...

Bref, très moche comme attitude... Tu as l'air sur les dents pour un modo, prendre l'air te ferais sûrement du bien. C'est un forum d'entraide, pas un repère d'experts en autoIT qui se paie la tête des débutants, à moins que je me trompes ?

EDIT: ça marche avec la seconde méthode... Je n'ai pas vu d'amélioration de perf, ça se joue à un poil de c**

Re: [RESOLU] Débutants : Affichage de l'heure en temps réel

Posté : mar. 04 juin 2019 22:03
par mikell
Bon je vais donc le dire autrement
Entre mon post #16 du lun. 03 juin 2019 14:10 et le tien du lun. 03 juin 2019 14:13, à peine 3 minutes
ça veut dire que tu n'as pas cherché à comprendre (tout ce qu'il fallait pour ça était pourtant présent dans les posts précédents). C'est fatiguant
Alors être débutant, aucun problème. Mais feignant et en plus râleur, là c'est différent, et insulter le modérateur qui te le fait remarquer, c'est un avertissement