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

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

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
Chris

Publié : jeu. 15/avr./2004 21:42
par nico
Ben non, il se passe rien

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