Page 1 sur 2

Le keyboard sans OpenScreen

Publié : dim. 10/mai/2020 13:38
par SPH
Hi :!:

Je bosse sur un code pour faire un client et un serveur. Je fais un tchat pour etre plus précis.
J'ai fais un bouton ENVOYER :

Code : Tout sélectionner

  ButtonGadget(#Button_02, 240, 250, 80, 20, "Envoyer")
....mais je préférerais envoyer le message par l'appuie de la touche return.
J'ai bien tenté le ExamineKeyboard() mais il faut ouvrir un OpenScreen. Moi, j'utilise un OpenWindow.

Code : Tout sélectionner

  EventID = WaitWindowEvent()
  If EventID = #PB_Event_Gadget
    Select EventGadget()
        
   
  
      Case #Button_02 ; on appuie sur le button envoyer
        If nb_client=1
          SendNetworkString(ConnectionID, pseudo$+" : "+GetGadgetText(#String_02), #PB_UTF8) ; on envoie le message au serveur
          AddGadgetItem(#Editor_02, -1, pseudo$+" : "+GetGadgetText(#String_02), 0, 0)       ; on affiche le message dans l'editor
          SetGadgetText(#String_02, "")                                                      ; on vide le string
        EndIf
        
    EndSelect
  EndIf
Est-ce possible d'utiliser la touche return ?

Thxxx 8)

Re: Le keyboard sans OpenScreen

Publié : dim. 10/mai/2020 13:57
par Marc56
Oui, tout comme on peut utiliser le clavier pour appuyer sur la touche F1 :mrgreen:

AddKeyboardShortcut()

#PB_Shortcut_Return (Entrée)

Oui, la touche Entrée s'utilise comme un raccourci. Cela permet aussi par exemple quand on a une série de champs de faire passer d'un champs à l'autre sans utiliser Tab et aller plus vite. (J'en avais fais un exemple dans un autre topic, mais il a été nettoyé lors de l’allègement du sujet :roll: )

Re: Le keyboard sans OpenScreen

Publié : dim. 10/mai/2020 15:29
par SPH
Merci

Je regarderais ca quand je redémarrerais l'autre ordinateur :P

Re: Le keyboard sans OpenScreen

Publié : lun. 11/mai/2020 12:00
par SPH
Non, je n'y arrive pas. J'ai bien créé AddKeyboardShortcut(#Window_0, #PB_Shortcut_Return, 15) mais je n'ai pas réussi à utiliser la touche ENTRER. J'ai pataugé dans mes codes et j'ai meme failli tout perdre...

Si vous pouviez me donner un coup de main... (ligne 78 je pense) 8O

Code : Tout sélectionner

;- Window Constants
Enumeration
  #Window_0
EndEnumeration

;- gadgets Constants
Enumeration
  #Server_01
  #Editor_01
  #String_01
  #Button_01
EndEnumeration


pseudo$ = InputRequester("pseudo", "choisissez un pseudo", "Serveur")


If InitNetwork() = 0
  MessageRequester("Erreur", "Impossible d'initialiser le réseau !", 0)
  End
EndIf



Port = 6842 ; <--- port a ouvrir sur votre routeur en TCP
*Buffer = AllocateMemory(1000)

If CreateNetworkServer(#Server_01, Port) = 0
  MessageRequester("Erreur", "Impossible de créer le serveur !", 0)
  End
EndIf
MessageRequester("Serveur", "Serveur créé ( Port : "+Str(Port)+" TCP )", 0)

nb_client=0



If OpenWindow(#Window_0, 0, 0, 330, 280, "Serveur", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
  EditorGadget(#Editor_01, 10, 10, 310, 230, #PB_Editor_ReadOnly)
  StringGadget(#String_01, 10, 250, 220, 20, "")
  ButtonGadget(#Button_01, 240, 250, 80, 20, "Envoyer")
EndIf 



AddKeyboardShortcut(#Window_0, #PB_Shortcut_Return, 15) ;       <============== ca, c'est ok apparement


Repeat
  SEvent = NetworkServerEvent()
  If SEvent
    ClientID = EventClient()
    Select SEvent
        
      Case #PB_NetworkEvent_Connect ; verifie si un client se connecte
        If nb_client=0
          AddGadgetItem(#Editor_01, -1, "un client c'est connecter !!!", 0, 0) : nb_client=1
        EndIf
        
      Case #PB_NetworkEvent_Data ; verifie si un client envoie un message
        length = ReceiveNetworkData(ClientID, *Buffer, 1000)
        AddGadgetItem(#Editor_01, -1, PeekS(*Buffer, length, #PB_UTF8), 0, 0)
        
      Case #PB_NetworkEvent_Disconnect ; verifie si un client se déconnecte 
        If nb_client=1
          AddGadgetItem(#Editor_01, -1, "un client c'est déconnecter !!!", 0, 0) : nb_client=0
        EndIf
        
    EndSelect
  EndIf
  
  
  
  EventID = WaitWindowEvent()
  If EventID = #PB_Event_Gadget
    Select EventGadget()
        
      Case #Button_01 ; on appuie sur le button envoyer ;          <=============== mon probleme est ici
        If nb_client=1
          SendNetworkString(ClientID, pseudo$+" : "+GetGadgetText(#String_01), #PB_UTF8) ; on envoie le message au client
          AddGadgetItem(#Editor_01, -1, pseudo$+" : "+GetGadgetText(#String_01), 0, 0)   ; on affiche le message dans l'editor
          SetGadgetText(#String_01, "")                                                  ; on vide le string
        EndIf
    EndSelect
  EndIf
Until EventID = #PB_Event_CloseWindow
CloseNetworkServer(#Server_01)
End


Re: Le keyboard sans OpenScreen

Publié : lun. 11/mai/2020 12:48
par Marc56
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Return, 15) ; <============== ca, c'est ok apparement
Et ton évènement 15 il est où ?

"AddKeyboardShortcut()
...
Remarques
Un raccourci génère un évènement de type menu (comme le ferait un élément de menu)
"

Code : Tout sélectionner

  EventID = WaitWindowEvent()
  
  If EventType() = #PB_Event_Menu
      Select EventMenu()
          Case 15
              ...
:wink:

Re: Le keyboard sans OpenScreen

Publié : lun. 11/mai/2020 12:59
par SPH
Merci beaucoup 8)

(je n'y connais RIEN en WaitWindowEvent) :oops:

Re: Le keyboard sans OpenScreen

Publié : lun. 11/mai/2020 13:27
par SPH
Marche pas... :cry:
(meme pas de "Beep_" donc, on n'entre jamais dans la case 15

Code : Tout sélectionner

  EventID = WaitWindowEvent()
  
  If EventType() = #PB_Event_Menu
    Select EventMenu()
      Case 15
        Beep_(1500,50)
        If nb_client=1
          SendNetworkString(ClientID, pseudo$+" : "+GetGadgetText(#String_01), #PB_UTF8) ; on envoie le message au client
          AddGadgetItem(#Editor_01, -1, pseudo$+" : "+GetGadgetText(#String_01), 0, 0)   ; on affiche le message dans l'editor
          SetGadgetText(#String_01, "")                                                  ; on vide le string
        EndIf
        
    EndSelect
  EndIf
  
  If EventID = #PB_Event_Gadget
    Select EventGadget()
        
      Case #Button_01 ; on appuie sur le button envoyer ;          <=============== mon probleme est ici
        If nb_client=1
          SendNetworkString(ClientID, pseudo$+" : "+GetGadgetText(#String_01), #PB_UTF8) ; on envoie le message au client
          AddGadgetItem(#Editor_01, -1, pseudo$+" : "+GetGadgetText(#String_01), 0, 0)   ; on affiche le message dans l'editor
          SetGadgetText(#String_01, "")                                                  ; on vide le string
        EndIf
    EndSelect
  EndIf
Until EventID = #PB_Event_CloseWindow
CloseNetworkServer(#Server_01)
End


Re: Le keyboard sans OpenScreen

Publié : lun. 11/mai/2020 13:52
par Ollivier
Eh bien...

Je te conseillerai, entre OpenWindow() et
AddKeyboardShortcut() de rajouter
entre les deux
CreateMenu(100, WindowID(#Window_0) )

Re: Le keyboard sans OpenScreen

Publié : lun. 11/mai/2020 13:57
par SPH
Ollivier a écrit :Eh bien...

Je te conseillerai, entre OpenWindow() et
AddKeyboardShortcut() de rajouter
entre les deux
CreateMenu(100, WindowID(#Window_0) )
:?:

La touche RETURN ne marche toujours pas :!:

Re: Le keyboard sans OpenScreen

Publié : lun. 11/mai/2020 14:19
par Ollivier
Poste ton code...

Re: Le keyboard sans OpenScreen

Publié : lun. 11/mai/2020 14:20
par SPH
Ollivier a écrit :Poste ton code...
https://www.purebasic.fr/french/viewtop ... 45#p207645

Re: Le keyboard sans OpenScreen

Publié : lun. 11/mai/2020 15:05
par Mindphazer
Dans ton code tu as ça :

Code : Tout sélectionner

EventID = WaitWindowEvent()
  If EventType() = #PB_Event_Menu
c'est ça qu'il faut écrire :

Code : Tout sélectionner

EventID = WaitWindowEvent()
  If EventID = #PB_Event_Menu
Ca marchera mieux

Re: Le keyboard sans OpenScreen

Publié : lun. 11/mai/2020 15:16
par Marc56
Sans m'occuper de la partie réseau

Code : Tout sélectionner

;- Window Constants
Enumeration
    #Window_0
EndEnumeration

;- gadgets Constants
Enumeration
    #Server_01
    #Editor_01
    #String_01
    #Button_01
EndEnumeration


pseudo$ = InputRequester("pseudo", "choisissez un pseudo", "Serveur")


If InitNetwork() = 0
    MessageRequester("Erreur", "Impossible d'initialiser le réseau !", 0)
    End
EndIf



Port = 6842 ; <--- port a ouvrir sur votre routeur en TCP
*Buffer = AllocateMemory(1000)

If CreateNetworkServer(#Server_01, Port) = 0
    MessageRequester("Erreur", "Impossible de créer le serveur !", 0)
    End
EndIf
MessageRequester("Serveur", "Serveur créé ( Port : "+Str(Port)+" TCP )", 0)

nb_client=0



If OpenWindow(#Window_0, 0, 0, 330, 280, "Serveur", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
    EditorGadget(#Editor_01, 10, 10, 310, 230, #PB_Editor_ReadOnly)
    StringGadget(#String_01, 10, 250, 220, 20, "")
    ButtonGadget(#Button_01, 240, 250, 80, 20, "Envoyer")
    SetActiveGadget(#String_01)
EndIf



AddKeyboardShortcut(#Window_0, #PB_Shortcut_Return, 15) ;       <============== ca, c'est ok apparement

Procedure Envoyer()
    Debug "Envoyer()"
    If nb_client=1
        SendNetworkString(ClientID, pseudo$+" : "+GetGadgetText(#String_01), #PB_UTF8) ; on envoie le message au client
        AddGadgetItem(#Editor_01, -1, pseudo$+" : "+GetGadgetText(#String_01), 0, 0)   ; on affiche le message dans l'editor
        SetGadgetText(#String_01, "")                                                  ; on vide le string
    Else
        AddGadgetItem(#Editor_01, -1, "(Client non connecté !) " + GetGadgetText(#String_01))
        SetGadgetText(#String_01, "")
    EndIf
EndProcedure

Repeat
    SEvent = NetworkServerEvent()
    If SEvent
        ClientID = EventClient()
        Select SEvent
                
            Case #PB_NetworkEvent_Connect ; verifie si un client se connecte
                If nb_client=0
                    AddGadgetItem(#Editor_01, -1, "un client s'est connecté !!!", 0, 0) : nb_client=1
                EndIf
                
            Case #PB_NetworkEvent_Data ; verifie si un client envoie un message
                length = ReceiveNetworkData(ClientID, *Buffer, 1000)
                AddGadgetItem(#Editor_01, -1, PeekS(*Buffer, length, #PB_UTF8), 0, 0)
                
            Case #PB_NetworkEvent_Disconnect ; verifie si un client se déconnecte
                If nb_client=1
                    AddGadgetItem(#Editor_01, -1, "un client s'est déconnecté !!!", 0, 0) : nb_client=0
                EndIf
                
        EndSelect
    EndIf
    
    Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
            End
            
        Case #PB_Event_Menu
            Select EventMenu()
                Case 15
                    Envoyer()
            EndSelect
            
        Case #PB_Event_Gadget
            Select EventGadget()
                Case #Button_01 
                    Envoyer()
            EndSelect
    EndSelect
ForEver

CloseNetworkServer(#Server_01)

End

Re: Le keyboard sans OpenScreen

Publié : lun. 11/mai/2020 15:22
par Zorro
sinon tu peux aussi utiliser les APIS windows :wink:


Code : Tout sélectionner


; reactif si on appuis sur la touche return

Enumeration
  #Win
EndEnumeration

If OpenWindow(#Win, 0, 0, 230, 90, "toto", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  Repeat 
    Event = WaitWindowEvent(10) 	 
    Select EventWindow()					
      Case #Win ;	
        GetCursorPos_(Pos.POINT)
     
        code=13 ; code Ascii du Return <--------------------------------------------------- le code de la touche
		  
        If  GetAsyncKeyState_(code)   
          Debug "touche Return" 
          beep_(440,100)
        Else 
        EndIf		
        Delay(300)
    EndSelect 
  Until Event=#PB_Event_CloseWindow
EndIf
    







Re: Le keyboard sans OpenScreen

Publié : lun. 11/mai/2020 16:11
par Ollivier
Ah, c'est beau... C'est du grand art. C'est admirable. On remercie Marc56 et Zorro qui participent. Mais... Je me demande si le petit rappel de MindPhazer n'est pas déjà d'un grand secours... A suivre...