Page 1 sur 2

Gadgets

Publié : jeu. 15/avr./2004 15:12
par gilles robert
Je suis un débutant sur Pure Basic et voudrai savoir ou trouver des exemples de programmes pour pouvoir me familiariser avec cette langue.
Mon interet va surtout sur les gadgets.

A ce propos une question plus précise:
Comment peut-on recuperer le texte d'un StringGadget et quitter celui-ci après un 'RETURN' sans avoir besoin de l'aide d'un ButtonGadget?

Merci d'avance de votre aide.

Gilles

Publié : jeu. 15/avr./2004 16:31
par Chris
...et quitter celui-ci après un 'RETURN' sans avoir besoin de l'aide d'un ButtonGadget?
Qu'est-ce que tu veux dire par là?

Quitter le gadget pour aller sur un autre, par exemple. tu as plusieurs champs, et à chaque fois que tu tapes Entree, tu vas sur le suivant?

Ou bien, tu ouvres une fenêtre fille avec un champ de saisie, tu récupères le texte, tu l'affiches dans la fenêtre principale, et tu ferme la fenêtre fille?


Chris :)

Publié : jeu. 15/avr./2004 20:14
par nico
Voici un code:

Très important, il faut que le string soit multiligne, sinon on ne récupère pas l'évènement de la touche ENTER.

A chaque appui sur la touche ENTER, on affiche le contenu du STRING dans le debugger.Maintenant, si tu veux en plus donner le focus a un autre Gadget, utilise ActivateGadget(#Gadget) .

Code : Tout sélectionner

  Enumeration
    #Window
    #STRING1
  EndEnumeration

  Procedure ProcedureCallback(WindowID, Message, wParam, lParam) 
    Resultat = #PB_ProcessPureBasicEvents 
    Select Message
      Case #WM_COMMAND
        Select lParam
          Case GadgetID(#STRING1)
          a.l=wParam>>16
            If a=1281
              Debug GetGadgetText(#STRING1)
            EndIf
        EndSelect 
    EndSelect
    ProcedureReturn Resultat 
  EndProcedure 
  
  
  If OpenWindow(#Window,0,0,400,400,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Pure Basic")
    CreateGadgetList(WindowID(#Window))
    StringGadget(#STRING1,8, 10,306,20,"Normal StringGadget...",#PB_String_MultiLine) 
    
    SetWindowCallback(@ProcedureCallback()) 
    
    Repeat
      EventID.l=WaitWindowEvent()
      Select EventID
        
        Case #PB_EventGadget
          Select EventGadgetID()
            Case #STRING1
              ;LE RESTE DU TRAITEMENT ICI
          EndSelect
          
        Case #WM_CLOSE
          Quit=1
      EndSelect 
    Until Quit=1 
  EndIf 
:)

Publié : jeu. 15/avr./2004 20:28
par Chris
...il faut que le string soit multiligne, sinon on ne récupère pas l'évènement de la touche ENTER...
8O

Désolé de te contredire, mais le string n'a pas besoin d'être multiligne, tout au moins sur XP!

voilà un code qui fonctionne, sans multiligne, et sans callback!

Code : Tout sélectionner

;/Constantes Window
Enumeration
  #Window_0
EndEnumeration

;/Constantes Gadget
Enumeration
  #Saisie
EndEnumeration

;- Création de la fenêtre et des gadgets
If OpenWindow(#Window_0, 300, 300, 300, 40, #PB_Window_SystemMenu, "Fenêtre 1",0)
  If CreateGadgetList(WindowID(#Window_0))
    StringGadget(#Saisie,10,10,280,20,"Bienvenue dans le monde de PureBasic")
    ActivateGadget(#Saisie) ; Active le premier champ à l'ouverture
  EndIf
  
  ;- Boucle principale
  Repeat
    Select WaitWindowEvent()
      
      ;- Evenements de clavier
      Case #WM_KEYDOWN; Détecte l'appui sur une touche
        Select EventwParam()
          Case #VK_RETURN; appui sur la touche Entree
            ActivateGadget(#Saisie)
            Debug GetGadgetText(#Saisie)
        EndSelect
        
        ;- Fermeture de la fenêtre
      Case #PB_EventCloseWindow : quit = 1
        
    EndSelect
  Until quit = 1
  End
EndIf
:wink:

Chris :)

Publié : jeu. 15/avr./2004 20:56
par nico
C'est nettement mieux...et je suis heureux de le constater. :wink:

Publié : jeu. 15/avr./2004 21:15
par Chris
Et voilà un deuxième exemple, ou tu récupères le texte que tu as saisi dans une autre fenêtre:

Code : Tout sélectionner

;/Constantes Window
Enumeration
  #Window_0
  #WinSaisie
EndEnumeration

;/Constantes Gadget
Enumeration
  #Result
  #Btn_Saisie
  #Btn_Quit
  #Saisie
  #Btn_Valid
  #Btn_Cancel
EndEnumeration

Procedure OpenMainWindow(); Ouverture de la fenêtre principale
  Handle =OpenWindow(#Window_0, 300, 300, 300, 70, #PB_Window_SystemMenu, "Fenêtre 1",0)
  
  If CreateGadgetList(WindowID(#Window_0))
    StringGadget(#Result,10,10,280,20,"")
    ButtonGadget(#Btn_Saisie, 50, 40, 100, 25, "Saisie")
    ButtonGadget(#Btn_Quit, 150, 40, 100, 25, "Quitter")
  EndIf
  
  ProcedureReturn Handle
EndProcedure

Procedure OpenSaisie(); Ouverture de la fenêtre de saisie
  Handle = OpenWindow(#WinSaisie, 300,200,300,70,#PB_Window_SystemMenu,"Saisie du nom",#Window_0)
  If CreateGadgetList(WindowID(#WinSaisie))
    StringGadget(#Saisie,10,10,280,20,"Bienvenue dans le monde de PureBasic")
    ButtonGadget(#Btn_Valid, 50, 40, 100, 25, "Valider")
    ButtonGadget(#Btn_Cancel, 150, 40, 100, 25, "Annuler")
  EndIf
  ActivateGadget(#Saisie)
  
  ProcedureReturn Handle
EndProcedure

hWnd = OpenMainWindow()

Repeat
  Select WaitWindowEvent()
    ;- Evenements clavier
    Case #WM_KEYDOWN
      Select EventwParam()
        
        Case #VK_RETURN                   ; Détecte l'appui sur la touche "ENTREE"
          If hSaisie >0                   ; Vérifie que la fenêtre de saisie est ouverte
            If GetGadgetText(#Saisie)<>"" ; et que le champ n'est pas vide,
              SetGadgetText(#Result, GetGadgetText(#Saisie)); et renvoie le texte
              CloseWindow(#WinSaisie)     ; puis referme la fenêtre
              ActivateGadget(#Result)
              
            EndIf
          EndIf
      EndSelect
      
    ;- Evenements gadget
    Case #PB_EventGadget
      Select EventGadgetID()
        
        Case #Btn_Saisie; Ouvre la fenêtre de saisie
          hSaisie = OpenSaisie()
          
        Case #Btn_Valid ; La même chose que plus haut, mais avec le bouton
          SetGadgetText(#Result, GetGadgetText(#Saisie))
          CloseWindow(#WinSaisie)
          
        Case #Btn_Cancel; ferme la fenêtre de saisie, sans récupérer le texte
          CloseWindow(#WinSaisie)
          
        Case #Btn_Quit; quitte le programme
          quit = 1
          
      EndSelect
    Case #PB_EventCloseWindow
      Select EventWindowID()
        Case #WinSaisie
          UseWindow(#Window_0)
          CloseWindow(EventWindowID())
        
          Case #Window_0
            quit = 1
            
      EndSelect
      
  EndSelect
Until quit = 1
End
J'espère que ça répond à ta question!

Chris :)

Publié : jeu. 15/avr./2004 21:19
par nico
Je me suis fais avoir parce qu'on ne retrouve pas ce message #WM_KEYDOWN dans le Callback. :?

Si quelqu'un sait pourquoi avant que je ne pose la question dans un autre sujet!

Publié : jeu. 15/avr./2004 21:31
par Chris
Ah bon!!!

Code : Tout sélectionner

;/Constantes Window
Enumeration
  #Window_0
EndEnumeration

;/Constantes Gadget
Enumeration
  #Btn_Quit
EndEnumeration

Procedure CallBack(Hnd,Msg,wParam,lParam)
  Resultat = #PB_ProcessPureBasicEvents
  Select Msg
    Case #WM_KEYDOWN
      Select wParam
        Case #VK_RETURN
          Debug "Touche ENTREE enfoncée"
      EndSelect
  EndSelect
  ProcedureReturn Resultat 
EndProcedure 

If OpenWindow(#Window_0, 300, 300, 300, 200, #PB_Window_SystemMenu, "Fenêtre 1",0)
  If CreateGadgetList(WindowID(#Window_0))
    ButtonGadget(#Btn_Quit, 100, 170, 100, 25, "Quitter")
    StringGadget(1,10,10,280,20,"")
  EndIf
  
  SetWindowCallback(@CallBack())
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_EventGadget
        Select EventGadgetID()
          Case #Btn_Quit : quit = 1
        EndSelect
      Case #PB_EventCloseWindow : quit = 1
    EndSelect
  Until quit = 1
  End
EndIf
:roll:

Chris :)

Publié : jeu. 15/avr./2004 21:42
par nico
Ben non, il se passe rien :cry: et ça ne vient pas du debugger.

J'ai Window XP, est-ce que pour d'autres, c'est pareil ?

Publié : jeu. 15/avr./2004 21:46
par Chris
Pourtant, chez moi, ce code fonctionne!

Sur le debugger uniquement, puisque rien ne renvoie du texte au StringGadget(), mais il fonctionne :?

Chris :)

PS: Si tu tournes avec le debugger, vérifier que ce n'est pas lui qui a le focus, mais la fenêtre du programme. Ca peut arriver si tu modifies la position du debugger avant d'essayer le code, et que tu ne recliques pas sur la fenêtre pour lui redonner le focus. (Je me suis fait avoir une fois,...)

Publié : jeu. 15/avr./2004 21:54
par nico
Bien sûr, j'ai mis un messagebox pour tester sans debugger!

Mais, tu ne m'as pas dit, tu as quel OS ?

Publié : jeu. 15/avr./2004 21:56
par Le Soldat Inconnu

Publié : jeu. 15/avr./2004 21:56
par Chris
XP Home

Chris :)

Publié : jeu. 15/avr./2004 22:02
par Chris
voir ici la solution de Fred
Ca n'a pas de rapport, son problème, c'est qu'il ne récupères pas #WM_KEYDOWN dans la CallBack. :wink:

Chris :)

Publié : jeu. 15/avr./2004 22:03
par nico
Regis, ça n'a rien à voir, c'est pas la touche le problème mais le message
que je reçoit dans le traitement repeat-until et pas dans le callback :!:

Si ça marche pour toi Regis, ça craint...d'où ça peut venir ? 8O