Page 1 sur 1

Mon petit InputRequester Perso

Publié : sam. 08/mai/2004 23:09
par Chris
Tout est dans le titre.

Code : Tout sélectionner

Enumeration
  #WinInput
EndEnumeration

Enumeration
  #Btn_No
  #Btn_Ok
  #StrInput
  #TextInput
EndEnumeration

;- Types de caractères dans le champ de saisie
#PB_InputEx_Numeric   = 1 ; Saisie de chiffres uniquement
#PB_InputEx_Password  = 2 ; Etoiles à la place des caractères
#PB_InputEx_LowerCase = 4 ; Tout en minuscules
#PB_InputEx_UpperCase = 8 ; Tout en majuscules

;- Types de boutons possibles. 
#PB_InputEx_Ok        = 16 ; Bouton Valider
#PB_InputEx_Cancel    = 32 ; Bouton Annuler

;- Procedure
Procedure.s InputRequester_Ex(Titre.s, MsgClient.s, MsgDefaut.s, Type.l)
  If Type & #PB_InputEx_Numeric   : Type1 = #PB_String_Numeric    : EndIf
  If Type & #PB_InputEx_Password  : Type2 = #PB_String_Password   : EndIf
  If Type & #PB_InputEx_UpperCase And Type & #PB_InputEx_LowerCase
    MessageRequester("Erreur","Le texte ne peut être à la fois majuscule et minuscule")
    Type3 = #Null
  ElseIf Type & #PB_InputEx_LowerCase : Type3 = #PB_String_LowerCase
  ElseIf Type & #PB_InputEx_UpperCase : Type3 = #PB_String_UpperCase
  EndIf
  
  TypeString = Type1|Type2|Type3
  
  If Type & #PB_InputEx_Ok      : BtnOk = 1 : Else : BtnOk = 0 : EndIf
  If Type & #PB_InputEx_Cancel  : BtnNo = 1 : Else : BtnNo = 0 : EndIf
  If BtnOk = 0 And BtnNo = 1
    MessageRequester("Erreur","Vous ne pouvez pas avoir un bouton "+Chr(34)+"Annuler"+Chr(34)+" si vous n'avez pas le bouton "+Chr(34)+"Ok"+Chr(34))
    BtnOk = 1
  EndIf
  
  
  If OpenWindow(#WinInput, 0,0,300,90,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,Titre)
    If CreateGadgetList(WindowID(#WinInput))
      TextGadget(#TextInput, 10,10,280,15,MsgClient)
      StringGadget(#StrInput, 10,30,280,25,MsgDefaut,TypeString)
      If BtnOk  And BtnNo
        ButtonGadget(#Btn_Ok, (WindowWidth()/2)-105, 60,100,25,"Valider")
        ButtonGadget(#Btn_No, (WindowWidth()/2)+5, 60,100,25,"Annuler")
      Else
        ButtonGadget(#Btn_Ok, (WindowWidth()/2)-50, 60,100,25,"Valider")
      EndIf
    EndIf
  EndIf
  
  While WaitWindowEvent()
    If EventGadgetID() = #Btn_Ok
      ProcedureReturn(GetGadgetText(#StrInput))
      CloseWindow(#WinInput)
    ElseIf EventGadgetID() = #Btn_No
      ProcedureReturn ""
      CloseWindow(#WinInput)
    EndIf
  Wend
EndProcedure


Ret$ = InputRequester_Ex("Message de test", "Saisissez votre code de carte bleue", "Transfert en attente", #PB_InputEx_Cancel|#PB_InputEx_Ok)
MessageRequester("Resultat",Ret$)
Chris :)

Publié : sam. 08/mai/2004 23:15
par cederavic
dommage, il ne bloke pa la fenetre (si on en ouvre une )

Publié : sam. 08/mai/2004 23:18
par Chris
:?: :?: :?:

Tu peux expliquer ?

Chris :)

Publié : sam. 08/mai/2004 23:50
par Chris
Ca y est, j'ai compris :!:

(Qui a dit que j'étais long à la détente???) :lol:

C'est corrigé!

Code : Tout sélectionner

Enumeration
  #WinInput
EndEnumeration

Enumeration
  #Btn_No
  #Btn_Ok
  #StrInput
  #TextInput
EndEnumeration

;- Types de caractères dans le champ de saisie
#PB_InputEx_Numeric   = 1 ; Saisie de chiffres uniquement
#PB_InputEx_Password  = 2 ; Etoiles à la place des caractères
#PB_InputEx_LowerCase = 4 ; Tout en minuscules
#PB_InputEx_UpperCase = 8 ; Tout en majuscules

;- Types de boutons possibles. 
#PB_InputEx_Ok        = 16 ; Bouton Valider
#PB_InputEx_Cancel    = 32 ; Bouton Annuler

;- Procedure
Procedure.s InputRequester_Ex(Titre.s, MsgClient.s, MsgDefaut.s, Type.l)
  hWinForeGround = GetForegroundWindow_()
  
  If Type & #PB_InputEx_Numeric   : Type1 = #PB_String_Numeric    : EndIf
  If Type & #PB_InputEx_Password  : Type2 = #PB_String_Password   : EndIf
  
  If Type & #PB_InputEx_UpperCase And Type & #PB_InputEx_LowerCase
    MessageRequester("Erreur","Le texte ne peut être à la fois majuscule et minuscule")
    Type3 = #Null
  ElseIf Type & #PB_InputEx_LowerCase : Type3 = #PB_String_LowerCase
  ElseIf Type & #PB_InputEx_UpperCase : Type3 = #PB_String_UpperCase
  EndIf
  
  TypeString = Type1|Type2|Type3
  
  If Type & #PB_InputEx_Ok      : BtnOk = 1 : Else : BtnOk = 0 : EndIf
  If Type & #PB_InputEx_Cancel  : BtnNo = 1 : Else : BtnNo = 0 : EndIf
  
  If BtnOk = 0 And BtnNo = 1
    MessageRequester("Erreur","Vous ne pouvez pas avoir un bouton "+Chr(34)+"Annuler"+Chr(34)+" si vous n'avez pas le bouton "+Chr(34)+"Ok"+Chr(34))
    BtnOk = 1
  ElseIf BtnOk = 0 And BtnNo = 0
    MessageRequester("Erreur","Vous devez avoir au moins le bouton "+Chr(34)+"Valider"+Chr(34))
    BtnOk = 1
  EndIf
  
  If OpenWindow(#WinInput, 0,0,300,90,#PB_Window_TitleBar|#PB_Window_ScreenCentered,Titre)
    If CreateGadgetList(WindowID(#WinInput))
      TextGadget(#TextInput, 10, 10, 280, 15, MsgClient)
      StringGadget(#StrInput, 10,30,280,25, MsgDefaut, TypeString)
      If BtnOk  And BtnNo
        ButtonGadget(#Btn_Ok, (WindowWidth()/2)-105, 60,100,25,"Valider")
        ButtonGadget(#Btn_No, (WindowWidth()/2)+5, 60,100,25,"Annuler")
      Else
        ButtonGadget(#Btn_Ok, (WindowWidth()/2)-50, 60,100,25,"Valider")
      EndIf
    EndIf
    
    EnableWindow_(hWinForeGround, #False)
    
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_Gadget
          Select EventGadgetID()
            Case #StrInput
              If GetGadgetText(#StrInput)<> "" And EventType() = #PB_EventType_Focus
                SendMessage_(GadgetID(#StrInput),#EM_SETSEL,0,-1)
              EndIf
              
            Case #Btn_Ok
              EnableWindow_(hWinForeGround, #True)
              ProcedureReturn(GetGadgetText(#StrInput))
              
            Case #Btn_No
              EnableWindow_(hWinForeGround, #True)
              ProcedureReturn ""
          EndSelect
      EndSelect
    ForEver
    CloseWindow(#WinInput)
  EndIf
EndProcedure
    
Ret$ = InputRequester_Ex("Boite de saisie", "Saisissez votre nom", "", #PB_InputEx_Ok|#PB_InputEx_Cancel)
MessageRequester("Resultat",Ret$)
Chris :)

*** Ajouté ***

J'ai ajouté la selection du texte quand on clique dans la zone de saisie.

*** Ajouté ***

Nouvelle correction : Un bug qui fait que la boîte se fermait directement quand on cherchait à l'ouvrir alors que la zone de saisie était vide.
Ca venait de la boucle.

Publié : dim. 09/mai/2004 18:36
par Chris
Bon, finalement, j'ai refait ce gadget, parce que je me demande encore pourquoi j'étais parti à redéfinir les constantes. Si quelqu'un peut me le dire... :lol:

Alors voilà la version finale, maintenant, je n'y touches plus.

Caractéristique :
- Le message à l'utilisateur est multiligne, la boite est automatiquement redimensionnée en fonction du nombre de lignes
- Choix de l'alignement du message à l'utilisateur : Droite, Gauche, Centré
- Choix entre les boutons Annuler, Valider, ou les deux.

Version minimum de PB : 3.90

Code : Tout sélectionner

Enumeration 
  #WinInput 
EndEnumeration 

Enumeration 
  #Btn_Cancel 
  #Btn_Valid 
  #StrInput 
  #TextInput 
EndEnumeration 

Global Retour.s

;- Constantes possibles pour le champ de saisie (Constantes du StringGadget) 
; #PB_String_Numeric 
; #PB_String_Password 
; #PB_String_UpperCase 
; #PB_String_LowerCase 

;- Constantes possibles pour l'alignement du message (Constantes du TextGadget) 
; #PB_Text_Center 
; #PB_Text_Right 

;- Types de boutons possibles. 
#PB_Button_Valid    = 320    ; Bouton Valider 
#PB_Button_Cancel   = 1280   ; Bouton Annuler 

;- Procédures 
ProcedureDLL.s InputRequester_Ex(Titre.s, MsgClient.s, MsgDefaut.s, Type.l, TextAlignment.l) 
  Resultat = CountString(MsgClient, Chr(10)) 
  hText = 15 * (Resultat+1) 
  
  hWinForeGround = GetForegroundWindow_() 
  
  If Type & #PB_String_Numeric   : Type1 = #PB_String_Numeric    : EndIf 
  If Type & #PB_String_Password  : Type2 = #PB_String_Password   : EndIf 
  
  If Type & #PB_String_UpperCase And Type & #PB_String_LowerCase 
    MessageRequester("Erreur","Le texte ne peut être à la fois majuscule et minuscule") 
    Type3 = #Null 
  ElseIf Type & #PB_String_LowerCase : Type3 = #PB_String_LowerCase 
  ElseIf Type & #PB_String_UpperCase : Type3 = #PB_String_UpperCase 
  EndIf 
  
  TypeString = Type1|Type2|Type3 
  
  If Type & #PB_Button_Valid      : BtnOk = 1 : Else : BtnOk = 0 : EndIf 
  If Type & #PB_Button_Cancel  : BtnNo = 1 : Else : BtnNo = 0 : EndIf 
  
  If BtnOk = 0 And BtnNo = 1 
    MessageRequester("Erreur","Vous ne pouvez pas avoir un bouton "+Chr(34)+"Annuler"+Chr(34)+" si vous n'avez pas le bouton "+Chr(34)+"Ok"+Chr(34)) 
    BtnOk = 1 
  ElseIf BtnOk = 0 And BtnNo = 0 
    MessageRequester("Erreur","Vous devez avoir au moins le bouton "+Chr(34)+"Valider"+Chr(34)) 
    BtnOk = 1 
  EndIf 
  
  If TextAlignment& #PB_Text_Center And TextAlignment & #PB_Text_Right 
    TextAlignment = #Null 
  EndIf 
  
  If OpenWindow(#WinInput, 0,0,300,90+(hText-20),#PB_Window_TitleBar|#PB_Window_ScreenCentered,Titre) 
    If CreateGadgetList(WindowID(#WinInput)) 
      TextGadget(#TextInput, 10, 10, 280, hText, MsgClient, TextAlignment) 
      StringGadget(#StrInput, 10,10 +hText,280,25, MsgDefaut, TypeString) 
      If BtnOk  And BtnNo 
        ButtonGadget(#Btn_Valid, (WindowWidth()/2)-105, 10 + hText+30,100,25,"Valider") 
        ButtonGadget(#Btn_Cancel, (WindowWidth()/2)+5, 10 + hText+30,100,25,"Annuler") 
      Else 
        ButtonGadget(#Btn_Valid, (WindowWidth()/2)-50, 10 + hText+55,100,25,"Valider") 
      EndIf 
    EndIf 
    
    EnableWindow_(hWinForeGround, #False) 
    
    Repeat 
      Select WaitWindowEvent() 
        Case #PB_Event_Gadget 
          Select EventGadgetID() 
            Case #StrInput 
              If GetGadgetText(#StrInput)<> "" And EventType() = #PB_EventType_Focus 
                SendMessage_(GadgetID(#StrInput),#EM_SETSEL,0,-1) 
              EndIf 
              
            Case #Btn_Valid
              Retour = GetGadgetText(#StrInput)
              EnableWindow_(hWinForeGround, #True)
              CloseWindow(#WinInput)
              ProcedureReturn Retour
              
            Case #Btn_Cancel 
              EnableWindow_(hWinForeGround, #True)
              CloseWindow(#WinInput)
              ProcedureReturn ""
              
          EndSelect 
      EndSelect 
    ForEver 
  EndIf 
EndProcedure 

;Test 
Ret$ = InputRequester_Ex("Boite de saisie", "Saisissez votre nom"+Chr(10)+"en entier"+Chr(10)+"sinon, ca ne vas"+Chr(10)+"pas aller."+Chr(10)+Chr(10)+"Avez vous compris ?", "", #PB_Button_Valid|#PB_Button_Cancel,#PB_Text_Center) 
MessageRequester("Resultat",Ret$)
Chris :)

*** Modifié le 14/05/2004 ***

Stockage de la valeur de retour dans une variable, et retour du contenu de la variable plutot que du contenu du StringGadget qui est détruit lors de la fermeture de la fenêtre.
Du coup, ProcedureReturn ne retournait rien!
Ca m'apprendra à vérifier les retours avec le debugger, plutot qu'avec un MessageRequester :lol: