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

Aide sur les Interfaces Graphique Utilisateurs (GUI).
Règles du forum
.
Verrouillé
xerces49
Niveau 1
Niveau 1
Messages : 9
Enregistré le : jeu. 25 avr. 2019 10:23
Status : Hors ligne

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

#1

Message par xerces49 » mer. 29 mai 2019 08:13

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
Modifié en dernier par xerces49 le mar. 04 juin 2019 15:22, modifié 4 fois.

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5850
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#2

Message par mikell » mer. 29 mai 2019 13:10

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 ^^
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

xerces49
Niveau 1
Niveau 1
Messages : 9
Enregistré le : jeu. 25 avr. 2019 10:23
Status : Hors ligne

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

#3

Message par xerces49 » mer. 29 mai 2019 15:09

mikell a écrit :
mer. 29 mai 2019 13:10
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 ^^
@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...

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5850
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#4

Message par mikell » mer. 29 mai 2019 21:07

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
" 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
TommyDDR
Modérateur
Modérateur
Messages : 1800
Enregistré le : mar. 22 juil. 2008 20:55
Localisation : Nantes
Status : Hors ligne

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

#5

Message par TommyDDR » jeu. 30 mai 2019 10:37

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.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5850
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#6

Message par mikell » jeu. 30 mai 2019 15:40

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)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2065
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

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

#7

Message par jchd » jeu. 30 mai 2019 19:43

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")
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5850
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#8

Message par mikell » ven. 31 mai 2019 17:08

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
" 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
TommyDDR
Modérateur
Modérateur
Messages : 1800
Enregistré le : mar. 22 juil. 2008 20:55
Localisation : Nantes
Status : Hors ligne

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

#9

Message par TommyDDR » sam. 01 juin 2019 08:48

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"))
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2065
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

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

#10

Message par jchd » sam. 01 juin 2019 09:29

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
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5850
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#11

Message par mikell » sam. 01 juin 2019 20:51

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 08:48
c'est plus propre sans
c'est indubitablement L'Argument massue, indiscutable et définitif
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

xerces49
Niveau 1
Niveau 1
Messages : 9
Enregistré le : jeu. 25 avr. 2019 10:23
Status : Hors ligne

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

#12

Message par xerces49 » lun. 03 juin 2019 08:52

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...

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2065
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

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

#13

Message par jchd » lun. 03 juin 2019 09:58

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.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5850
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#14

Message par mikell » lun. 03 juin 2019 10:17

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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

xerces49
Niveau 1
Niveau 1
Messages : 9
Enregistré le : jeu. 25 avr. 2019 10:23
Status : Hors ligne

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

#15

Message par xerces49 » lun. 03 juin 2019 11:26

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.
Modifié en dernier par xerces49 le mar. 04 juin 2019 07:58, modifié 2 fois.

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5850
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#16

Message par mikell » lun. 03 juin 2019 13:10

mikell a écrit :
lun. 03 juin 2019 10:17
Il se peut aussi que $Time soit déclarée en Local si la gui est construite dans une fonction
Gagné :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 )

xerces49
Niveau 1
Niveau 1
Messages : 9
Enregistré le : jeu. 25 avr. 2019 10:23
Status : Hors ligne

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

#17

Message par xerces49 » lun. 03 juin 2019 13:13

Donc ?
Pouvez-vous m'expliquer mon erreur ?

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5850
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#18

Message par mikell » lun. 03 juin 2019 18: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...
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

xerces49
Niveau 1
Niveau 1
Messages : 9
Enregistré le : jeu. 25 avr. 2019 10:23
Status : Hors ligne

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

#19

Message par xerces49 » lun. 03 juin 2019 18:30

mikell a écrit :
lun. 03 juin 2019 18: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**

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5850
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#20

Message par mikell » mar. 04 juin 2019 21:03

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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Verrouillé