Problème avec SetGadgetText(#Output,Str(i))

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
gadjet35
Messages : 190
Inscription : ven. 21/oct./2005 7:49
Localisation : Quelque part en france !

Problème avec SetGadgetText(#Output,Str(i))

Message par gadjet35 »

Salut tout le monde
j'ai encore une question de débutant!
Dans le code ci joint j'ai essayé de réaliser un petit compteur (tempo 1s). Le problème c'est l'affichage des valeurs. Il semblerait que l'instruction "SetGadgetText(#Output,Str(i)) " ne soit effectuée que une fois de retour dans la boucle principale! Pourquoi???
Et surtout comment faire pour défiler cette valeur "i" dans un gadget quelconque???

Code : Tout sélectionner

Enumeration 
#Output 
#Bouton 
EndEnumeration

Global i

OpenWindow(0,0,0,220,130,#PB_Window_SystemMenu | #PB_Window_ScreenCentered,"Compteur") 
CreateGadgetList(WindowID(0)) 
StringGadget(#Output,10,40,200,20,"") 
;DisableGadget(#Output,1) 
ButtonGadget(#Bouton,10,70,200,50,"Lancer") 

 
Procedure Affichage()
Debug "Lancement Affichage"
Debug i
SetGadgetText(#Output,Str(i))
Debug "Fin Affichage"
EndProcedure

Procedure Test()
Debug "Lancement Procedure Test"
For i = 1 To 5
Affichage()
Delay(1000)
Next i
Debug "Fin Procedure Test"
EndProcedure 




Repeat 
  Evenement=WaitWindowEvent() 
  If (Evenement=#PB_Event_Gadget And EventGadgetID()=#Bouton And EventType()=#PB_EventType_LeftClick ) Or EventwParam()=#VK_RETURN 
    Debug "Evenement"
    Test() 
  
  EndIf 
Until Evenement =#PB_Event_CloseWindow 
bonne journer à tous !!!
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

IL faudrait utiliser un Thread... Car là tu quitte la gestion des événements pour rentrer dans une fonction...

Code : Tout sélectionner

Repeat
  Evenement=WaitWindowEvent()
  If (Evenement=#PB_Event_Gadget And EventGadgetID()=#Bouton And EventType()=#PB_EventType_LeftClick ) Or EventwParam()=#VK_RETURN
    Debug "Evenement"
    CreateThread(@Test(),0)
 
  EndIf
Until Evenement =#PB_Event_CloseWindow
:wink:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Bonjour à tous !

La meilleure manière c'est d'utiliser un thread !

Voici ton code modifié :

Code : Tout sélectionner


Global i

Enumeration
  #Output
  #Bouton
EndEnumeration
 
Procedure Affichage() ; Tread
  Repeat
    Debug "Lancement Affichage"
    Debug i
    SetGadgetText(#Output,Str(i))
    Debug "Fin Affichage"
    Delay(1000)
    i+1
  Until i=5
  End
EndProcedure

OpenWindow(0,0,0,220,130,#PB_Window_SystemMenu | #PB_Window_ScreenCentered,"Compteur")
CreateGadgetList(WindowID(0))
StringGadget(#Output,10,40,200,20,"")
ButtonGadget(#Bouton,10,70,200,50,"Lancer")
CloseGadgetList()


Repeat
  Evenement=WaitWindowEvent()
  If (Evenement=#PB_Event_Gadget And EventGadgetID()=#Bouton And EventType()=#PB_EventType_LeftClick ) Or EventwParam()=#VK_RETURN
    Debug "Evenement"
    CreateThread(@Affichage(), 154)    
  EndIf
Until Evenement =#PB_Event_CloseWindow



Denis

Bonne Jounée à tous
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

La meilleure manière c'est d'utiliser un thread !
ben non ! la meilleur maniere c'est d'utiliser les timer ! (c'est fait pour ça!) :D


 Global i

Enumeration
   #Output
   #Bouton
EndEnumeration

Declare TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)

If OpenWindow (0,0,0,220,130, #PB_Window_SystemMenu | #PB_Window_ScreenCentered ," Compteur ")
  Handle = WindowID (0)
   CreateGadgetList (WindowID(0))
   StringGadget ( #Output ,10,40,200,20,"")
   ButtonGadget ( #Bouton ,10,70,200,50," Lancer ")
   CloseGadgetList ()
  
   Repeat
    Evenement= WaitWindowEvent ()
     If (Evenement=#PB_Event_Gadget And EventGadgetID()=#Bouton And EventType()=#PB_EventType_LeftClick ) Or EventwParam()=#VK_RETURN
      
      SetTimer_(Handle, 1, 1000, @TimerProc()) ; envoie un evenement toutes les 1000 millisecondes
      SetTimer_(Handle, 2, 200, @TimerProc()) ; envoie un evenement toutes les 200 millisecondes
      SetTimer_(Handle, 3, 3000, @TimerProc()) ; envoie un evenement toutes les 3000 millisecondes
      
     Endif
   Until Evenement =#PB_Event_CloseWindow
Endif
  
  
  ; ********************* les Procedures ***********************************
  
  
  
Procedure TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
   Select uMsg
     Case #WM_TIMER
       Select idEvent
         Case 1
           Debug " --------------------1 seconde "
          ; Ici, le code à executer toutes les secondes
           SetGadgetText ( #Output ,Str(i))
          i+1
         Case 2
           Debug " 0.2 secondes "
          ; Ici, le code à executer toutes les 200 millisecondes
         Case 3
           Debug " -------------------------------------------3 secondes "
          ; Ici, le code à executer toutes les 3 secondes
       EndSelect
   EndSelect
EndProcedure
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Dobro a écrit : ben non ! la meilleur maniere c'est d'utiliser les timer ! (c'est fait pour ça!) :D
Je suis daccord avec toi dans cet exemple, mais si on a plusieurs opération à faire comme il le fait, ca ne va pas marcher avec un timer.
Ou sinon faut avoir des variables et les comparer avec ElapsedMilli..(), etc et ca devient vite compliqué.
Tandis qu'un petit Thread c pas mal (quoique comme PB3 n'est pas ThreadSafe .. :? )
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Répondre