Page 1 sur 1
[R] Problème de débutant / menu contextuel
Posté : lun. 16 févr. 2009 19:29
par micbar
Bonsoir à tous,
Dans le code ci-dessous, je n'arrive pas à comprendre pourquoi $toto et $msg ne prennent pas la même valeur si je clique sur l'option "toto" du menu.
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstants.au3>
GUICreate("Ma fenetre", 300, 200)
$menu = GUICtrlCreateContextMenu ()
$toto = GUICtrlCreateMenuitem ("Toto", $menu)
GUISetState ()
While 1
sleep(2000)
$msg = GUIGetMsg()
msgbox(0,$msg,$toto)
Wend
Merci par avance d'avoir bien voulu me lire.
Re: [..] Problême de débutant / menu contextuel
Posté : lun. 16 févr. 2009 22:45
par Tlem
Tout simplement parce que la variable
$msg, récupère la valeur de la fonction
GUIGetMsg() qui elle ne peut récupérer que l'ID du contrôle qui à été cliqué.
Avec cet ID, vous pouvez tout simplement lire ça valeur, et là vous aurez son texte.

Re: [..] Problême de débutant / menu contextuel
Posté : lun. 16 févr. 2009 23:56
par Iste
Je ne suis pas sûr qu'il veuille recuperer le texte de $toto
Si c'est bien ce que je pense, le probleme vien du fait qu'il ne faut pas mettre de sleep()
La, ta boucle ne verifi pas si tu clic sur $toto, mais si tu clic sur $toto exactement au moment ou le message s'affiche. Enfin, un peu compliqué a expliquer.
De plus, le sleep() n'est vraiment pas utile
Remarks
This function automatically idles the CPU when required so that it can be safely used in tight loops without hogging all the CPU.
un bon code alors (si j'ai bien compris ce que tu cherche a faire) serait :
Code : Tout sélectionner
#include <GUIConstants.au3>
GUICreate("Ma fenetre", 300, 200)
$menu = GUICtrlCreateContextMenu ()
$toto = GUICtrlCreateMenuitem ("Toto", $menu)
GUISetState ()
While 1
$Msg = GUIGetMsg()
Switch $Msg
Case $GUI_EVENT_CLOSE
Exit
Case $toto
msgbox(0,$msg,$toto)
EndSwitch
WEnd
Re: [..] Problême de débutant / menu contextuel
Posté : mar. 17 févr. 2009 00:25
par Tlem
Effectivement, l'explication est bien plus claire.

M'apprendra à faire 10 trucs en même temps. hihihi
Re: [..] Problême de débutant / menu contextuel
Posté : mar. 17 févr. 2009 12:35
par micbar
Merci à Iste c'est effectivement ce que je voulais faire.
L'inconvénient, c'est qu'en supprimant le sleep(n) le contenu de ma fenêtre clignote comme un arbre de Noël.
Bonne journée à tous.
Re: [..] Problême de débutant / menu contextuel
Posté : mer. 18 févr. 2009 01:43
par Iste
ben, tu ne dois pas creer de bouton/autre dans la boucle.
Tu les cree avant, et dans la boucle tu met une condition pour si tu dois les actualiser, et ne pas les recreer mais utiliser un symple guictrlsetdata() ou guictrlsetstat()
De plus, si tu cree un truc deux foi, oubli pas de le supprimer avant, sinon tu vas vite avoir des centaines de boutons les un sur les autre.
Je suis pas du genre a dire "tu fais pas comme il faut" sans avoir le script complet, mais là ca qui est sur, c'est que tu utilise pas la fonction GUIGetMsg() comme il faut ^^
Pour rappel, un "bon" script simple se presente comme cela
Code : Tout sélectionner
Creation de la GUI
Boucle infini
Conditions qui testent les boutons
Conditions autres (maj de la GUI, ou autre qui ne se passe pas par un clic gauche)
Fin boucle
Apres, si pour une raison ou une autre tu pense etre obligé de faire comme ca, demande sur le forum comment ammeliorer ton script, je suis sûr qu'on pourra t'aider

(peut etre passer au mod evenementiel ?)
Re: [..] Problême de débutant / menu contextuel
Posté : mer. 18 févr. 2009 11:00
par micbar
Voila la partie du code concernée dans laquelle est recherchée en permanence la qté de mémoire disponible:
► Afficher le texte
Code : Tout sélectionner
$progressbar1 = GUICtrlCreateProgress (1,1,80,10,$PBS_SMOOTH )
$lab1 =GUICtrlCreateLabel("xxxxx",30,10)
GUISetState ()
while 1
$msg = guigetmsg()
if $msg = $delete then
ferme()
exitloop(2)
endif
$mem = MemGetStats()
GUICtrlSetData ($progressbar1,$mem[0])
GUICtrlSetData ($lab1,$mem[0] & " %")
wend
Re: [..] Problême de débutant / menu contextuel
Posté : jeu. 19 févr. 2009 04:29
par Iste
hum.. je vois
donc tu dois en permanence actualiser la fenetre
En effet, c'est pas simple ^^
Donc, ce qui est sur, c'est que tu ne peux pas utiliser la meme boucle pour les boutons, et pour l'actualisation des donées
Tu peux donc soit reserver la boucle principal pour l'actualisation et mettre les boutons en func grace a l'option GUIOnEventMode
Ou alors, je sais qu'il y a un moyen pour appeler une fonction periodiquement.
Mais si je sais que c'est possible, je ne sais plus comment faire ^^' Je vais essayer de retrouver... mais la j'espere que quelqu'un d'autre repondra a ma place
Re: [..] Problême de débutant / menu contextuel
Posté : sam. 21 févr. 2009 09:54
par Tlem
Pour rafraîchir la partie ProgressBar, je conseillerais l'utilisation de la fonction AdlibEnable.
Re: [R] Problème de débutant / menu contextuel
Posté : sam. 21 févr. 2009 19:13
par micbar
Merci beaucoup Tlem impeccable.
Franchement je n'aurais pas deviné surtout que "Ad lib Enable" ce n'est pas très parlant.
Bonne soirée à tous.