Page 1 sur 1

[RESOLU] Touche ENTREE (ComboBox)

Publié : mer. 04/déc./2019 22:24
par omega
Bonsoir,

J'ai cherché partout, mais en vain. Je ne trouve pas ce que je veux. J'ai une combo éditable et un textGadget. Le gadget Combo contient le nom du client et le TextGadget contient son adresse. Quand on sélectionne un client sur le combo, son adresse est automatiquement affichée sur le champs Adresse (TextGadget). Mais parfois l'utilisateur préfère écrire le nom du client (au lieu de le sélectionner), ma question est la suivante: comment savoir si l'utilisateur a fini de saisir le nom du client (pour que le programme puisse afficher son adresse)?

Merci

Code : Tout sélectionner

     Enumeration
  #Client_TxtNom
  #Client_TxtAd
  #Client_Nom
  #Client_Ad
EndEnumeration

Global ExitMenu,wrow

Procedure AfficherAdresse()
  ;code pour afficher l'adresse du client
EndProcedure

ExitMenu=0
OpenWindow(0, 100,100,600,300, "Test", #PB_Window_SystemMenu|#PB_Window_SizeGadget)
wrow=20
TextGadget(#Client_TxtNom,20, wrow, 120, 20, "NOM DU CLIENT:" )
ComboBoxGadget(#Client_Nom, 140, wrow, 200, 20,#PB_ComboBox_Editable | #PB_ComboBox_UpperCase)
wrow=wrow+25
TextGadget(#Client_Txtad,20, wrow, 120, 20, "ADRESSE:" )
StringGadget(#Client_ad, 140, wrow, 200, 20, "",#PB_String_UpperCase)

;---- Pour le test quelques noms 
AddGadgetItem(#Client_Nom,-1,"Bernard")
AddGadgetItem(#Client_Nom,-1,"David")
AddGadgetItem(#Client_Nom,-1,"Paul")
;------ cela devrait suffire 

Repeat
EventId=WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
   ExitMenu=1
EndIf


If EventID = #PB_Event_Gadget
   Select EventGadget()
         Case #Client_nom                
           If EventType()=768
              Debug "l'utilisateur a sélectionné un client ! "
              wrow=GetGadgetState(#Client_nom)
              Client$=GetGadgetItemText(#Client_nom,wrow)
              If Len(Client$)>0 : AfficherAdresse() : EndIf
          EndIf    
   EndSelect
EndIf
Until  exitMenu=1
;
End

Re: Touche ENTREE (ComboBox)

Publié : jeu. 05/déc./2019 9:11
par Christophe
Bonjour omega, j'ai rajouté un raccourci clavier (touche entree) :)

Code : Tout sélectionner

     Enumeration
  #Client_TxtNom
  #Client_TxtAd
  #Client_Nom
  #Client_Ad
  #ToucheEntree
EndEnumeration

Global ExitMenu,wrow

Procedure AfficherAdresse()
  Debug "Affiche Adresse"
  ;code pour afficher l'adresse du client
EndProcedure

ExitMenu=0
OpenWindow(0, 100,100,600,300, "Test", #PB_Window_SystemMenu|#PB_Window_SizeGadget)
wrow=20
TextGadget(#Client_TxtNom,20, wrow, 120, 20, "NOM DU CLIENT:" )
ComboBoxGadget(#Client_Nom, 140, wrow, 200, 20,#PB_ComboBox_Editable | #PB_ComboBox_UpperCase)
wrow=wrow+25
TextGadget(#Client_Txtad,20, wrow, 120, 20, "ADRESSE:" )
StringGadget(#Client_ad, 140, wrow, 200, 20, "",#PB_String_UpperCase)

;---- Pour le test quelques noms
AddGadgetItem(#Client_Nom,-1,"Bernard")
AddGadgetItem(#Client_Nom,-1,"David")
AddGadgetItem(#Client_Nom,-1,"Paul")
;------ cela devrait suffire


AddKeyboardShortcut(0, #PB_Shortcut_Return, #ToucheEntree)

Repeat
EventId=WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
   ExitMenu=1
EndIf

Select EventId
  Case #PB_Event_Menu
    Select EventMenu()
      Case #ToucheEntree
        AfficherAdresse()
    EndSelect
EndSelect
    
If EventID = #PB_Event_Gadget
   Select EventGadget()
         Case #Client_nom               
           If EventType()=768
              Debug "l'utilisateur a sélectionné un client ! "
              wrow=GetGadgetState(#Client_nom)
              Client$=GetGadgetItemText(#Client_nom,wrow)
              If Len(Client$)>0 : AfficherAdresse() : EndIf
            EndIf  
    EndSelect
    
        
EndIf
Until  exitMenu=1
;
End

Re: Touche ENTREE (ComboBox)

Publié : jeu. 05/déc./2019 9:25
par Mesa
L'autocompletion est une solution qui évite l'utilisation de la touche entrée.

Tu peux t'inspirer de ça: (windows seulement)

Code : Tout sélectionner

Procedure AutocompleteComboBox_SearchEdit(hwnd.l, lParam.l)
		Tampon.s = Space(50)
		GetClassName_(hwnd, @Tampon, 50)
		
		If Tampon = "Edit" ; Nom de l'objet recherché
			PokeL(lParam, hwnd)
		EndIf
		
		ProcedureReturn #True
EndProcedure

Procedure AutocompleteComboBox(ComboBox.l)
		
		ComboxEdit = 0
		EnumChildWindows_(GadgetID(ComboBox), @AutocompleteComboBox_SearchEdit(), @ComboxEdit)
		TextTyped.s = UCase (GetGadgetText(ComboBox))
		SendMessage_(ComboxEdit, #EM_GETSEL, @Selection_Start, @Selection_End)
		LenTextTyped = Selection_Start
		LenTextSave = GetGadgetData(ComboBox)
		
		If LenTextTyped <= LenTextSave
			SetGadgetData(ComboBox, LenTextTyped)
		ElseIf LenTextTyped
			MaxItem.l = CountGadgetItems(ComboBox) - 1
			For Item.l = 0 To MaxItem
					ItemText.s = GetGadgetItemText(ComboBox, Item, 0)
					If TextTyped = UCase (Left(ItemText, LenTextTyped))
						SetGadgetState(ComboBox, Item)
						Selection_Start = LenTextTyped
						Selection_End = Len(ItemText)
						SendMessage_(ComboxEdit, #EM_SETSEL, Selection_Start, Selection_End)
						SetGadgetData(ComboBox, LenTextTyped)
						Item = MaxItem
						Break
					EndIf
			Next
		EndIf
	
EndProcedure

; un petit exemple avec une mini-liste de prénoms mis en ordre alphabétique...

LoadFont(3,"arial", 12,#PB_Font_Bold)
SetGadgetFont(#PB_Default,FontID(3))

OpenWindow(0,0,0,400,200,"",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)

			ComboBoxGadget(1, 10,  40, 300, 25, #PB_ComboBox_UpperCase | #PB_ComboBox_Editable)
			AddGadgetItem(1,-1,"Albert"): AddGadgetItem(1,-1,"Antoine"): AddGadgetItem(1,-1,"Aymerick")
			AddGadgetItem(1,-1,"Benoit"): AddGadgetItem(1,-1,"Bernard"): AddGadgetItem(1,-1,"Brunehilde")
			AddGadgetItem(1,-1,"Bruno"): AddGadgetItem(1,-1,"Charles"): AddGadgetItem(1,-1,"Claude")
			AddGadgetItem(1,-1,"Claudine"): AddGadgetItem(1,-1,"Fabien"): AddGadgetItem(1,-1,"Fabrice")
			AddGadgetItem(1,-1,"Fernand"): AddGadgetItem(1,-1,"Georges"): AddGadgetItem(1,-1,"Guy")
			AddGadgetItem(1,-1,"Henri"): AddGadgetItem(1,-1,"Henriette"): AddGadgetItem(1,-1,"Martine")
			SetGadgetText(1,"-----")
			TextGadget(2,10,90,300,25,"-----")
			SetActiveGadget(1)
Repeat
	
	glEvent = WaitWindowEvent()
	glGadget= EventGadget()
	
	If glEvent = #PB_Event_Gadget
		
		Select glGadget
		
			Case 1
				AutocompleteComboBox(1)
			        SetGadgetText(2,GetGadgetText(1));mettre ici l'adresse de la personne...
		EndSelect
		
	EndIf
	
Until glEvent = #PB_Event_CloseWindow
M.

Re: Touche ENTREE (ComboBox)

Publié : jeu. 05/déc./2019 19:28
par omega
Bonsoir Christophe
Bonsoir Mesa

La méthode du raccourci marche bien, merci christophe!

Mesa: je vais tester la méthode d'autocomplétion. Merci à vous deux pour votre aide!

Bonne continuation

Re: Touche ENTREE (ComboBox)

Publié : jeu. 05/déc./2019 19:42
par omega
J'ai encore une question à poser au sujet du raccourci clavier (touche entrée pour un combo). Je reprends le code de Christophe:

Code : Tout sélectionner

Select EventId
  Case #PB_Event_Menu
       Select EventMenu()
            Case #ToucheEntree
                 Debug "l'utilisateur a appuyé sur la touche entrée ! "
       EndSelect
EndSelect
Quand il s'git d'un seul champ (combo) comme notre exemple, ça marche bien. Mais comment savoir si l'utilisateur a appuyé sur la touche entrée au niveau d'un autre gadget (autre que le combo client)??? En supposant que j'ai plusieurs gadget combobox??

Merci

Re: Touche ENTREE (ComboBox)

Publié : ven. 06/déc./2019 0:25
par Ar-S
Tu testes avec GetActiveGadget()

Re: Touche ENTREE (ComboBox)

Publié : sam. 07/déc./2019 9:49
par Christophe
Effectivement avec GetActiveGadget() comme le dit Ar-s

Exemple

Code : Tout sélectionner

     Enumeration
  #Client_TxtNom
  #Client_TxtAd
  #Client_Nom
  #Client_Nom2
  #Client_Ad
  #ToucheEntree
EndEnumeration

Global ExitMenu,wrow

Procedure AfficherAdresse()
  Debug "Affiche Adresse"
  ;code pour afficher l'adresse du client
EndProcedure

ExitMenu=0
OpenWindow(0, 100,100,600,300, "Test", #PB_Window_SystemMenu|#PB_Window_SizeGadget)
wrow=20
TextGadget(#Client_TxtNom,20, wrow, 120, 20, "NOM DU CLIENT:" )
ComboBoxGadget(#Client_Nom, 140, wrow, 200, 20,#PB_ComboBox_Editable | #PB_ComboBox_UpperCase)
ComboBoxGadget(#Client_Nom2,140, wrow+50,200,20,#PB_ComboBox_Editable | #PB_ComboBox_UpperCase)
wrow=wrow+25
TextGadget(#Client_Txtad,20, wrow, 120, 20, "ADRESSE:" )
StringGadget(#Client_ad, 140, wrow, 200, 20, "",#PB_String_UpperCase)

;---- Pour le test quelques noms
AddGadgetItem(#Client_Nom,-1,"Bernard")
AddGadgetItem(#Client_Nom,-1,"David")
AddGadgetItem(#Client_Nom,-1,"Paul")
;------ cela devrait suffire


AddKeyboardShortcut(0, #PB_Shortcut_Return, #ToucheEntree)

Repeat
EventId=WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
   ExitMenu=1
EndIf

Select EventId
  Case #PB_Event_Menu
    Select EventMenu()
      Case #ToucheEntree
        Select GetActiveGadget()
          Case #Client_Nom
            Debug "Touche Entree Combo #Client_Nom"
          Case #Client_Nom2
            Debug "Touche Entree Combo #Client_Nom2"
        EndSelect 
        AfficherAdresse()
    EndSelect
EndSelect
    
If EventID = #PB_Event_Gadget
   Select EventGadget()
         Case #Client_nom               
           If EventType()=768
              Debug "l'utilisateur a sélectionné un client ! "
              wrow=GetGadgetState(#Client_nom)
              Client$=GetGadgetItemText(#Client_nom,wrow)
              If Len(Client$)>0 : AfficherAdresse() : EndIf
            EndIf  
    EndSelect
    
        
EndIf
Until  exitMenu=1
;
End

Re: Touche ENTREE (ComboBox)

Publié : sam. 07/déc./2019 22:01
par omega
Bravo !

Grâce à vous Tous , mon problème est maintenant réglé!

Merci encore et...
Bonne continuation

Re: [RESOLU] Touche ENTREE (ComboBox)

Publié : dim. 08/déc./2019 14:03
par Micoute
Merci pour le partage et merci pour l'astuce très utile.