[RESOLU] Touche ENTREE (ComboBox)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

[RESOLU] Touche ENTREE (ComboBox)

Message 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
Dernière modification par omega le sam. 07/déc./2019 22:02, modifié 3 fois.
Win7 (x64) 64 bits Pb 5.72
Christophe
Messages : 43
Inscription : lun. 22/oct./2018 19:34
Localisation : Haisnes (62)

Re: Touche ENTREE (ComboBox)

Message 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
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Touche ENTREE (ComboBox)

Message 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.
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Touche ENTREE (ComboBox)

Message 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
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Touche ENTREE (ComboBox)

Message 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
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Touche ENTREE (ComboBox)

Message par Ar-S »

Tu testes avec GetActiveGadget()
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Christophe
Messages : 43
Inscription : lun. 22/oct./2018 19:34
Localisation : Haisnes (62)

Re: Touche ENTREE (ComboBox)

Message 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
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Touche ENTREE (ComboBox)

Message par omega »

Bravo !

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

Merci encore et...
Bonne continuation
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: [RESOLU] Touche ENTREE (ComboBox)

Message par Micoute »

Merci pour le partage et merci pour l'astuce très utile.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre