Ajout donnees uniques dans combobox

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Ajout donnees uniques dans combobox

Message par flaith »

Toujours pour mon projet, j'ai besoin de rentrer des clés de recherches, mais si je rentre plusieurs fois la meme clé, je ne veux pas la voir affichée dans mon combo.

Voici le code permettant de le faire :

Code : Tout sélectionner

EnableExplicit

Enumeration
  #SEARCH_WIN
  #SEARCH_COMBO
  #SEARCH_BUTTON_OK
EndEnumeration

Procedure.i CheckAddItem(__Item.s, List __lKeywords.s())
  Protected.i _posItem = 0, _index = 0, _Found = #False, _indexInList = ListSize(__lKeywords())
  
  If _indexInList > 0
    ForEach __lKeywords()
      If __lKeywords() = __Item
        _Found   = #True
        Break
      EndIf
      _posItem + 1
    Next
    
    If Not _Found
      AddElement(__lKeywords())
        __lKeywords() = __Item
    EndIf
  Else
    ; First time use, need to add
    AddElement(__lKeywords())
      __lKeywords() = __Item
  EndIf
  
  ;Populate the combobox  
  ClearGadgetItems(#SEARCH_COMBO)
  
  ;Get the last 10 max keywords in the combobox
  ResetList(__lKeywords())
  For _index = 1 To 10
    If NextElement(__lKeywords())
      AddGadgetItem(#SEARCH_COMBO, -1, __lKeywords())
    EndIf
  Next

  ; Set the item in the combobox if found
  If _Found : Debug _posItem : SetGadgetState(#SEARCH_COMBO, _posItem) : EndIf
  ProcedureReturn _posItem
EndProcedure

Procedure SearchDB()
  Protected.i _Quit = #False, _PosItem = 0
  Protected.s NewList _lKeywords()

  If OpenWindow(#SEARCH_WIN, 0, 0, 270, 180, "Adding unique value inside ComboBox", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ComboBoxGadget(#SEARCH_COMBO, 10, 10, 220, 21, #PB_ComboBox_Editable|#PB_ComboBox_LowerCase)
      AddGadgetItem(#SEARCH_COMBO, -1, "")
    ButtonGadget(#SEARCH_BUTTON_OK, 230, 9, 30, 23, "Ok")

    SetGadgetState(#SEARCH_COMBO, 0)
    SetActiveGadget(#SEARCH_COMBO)

    Repeat 
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          _Quit = #True
        Case #WM_KEYDOWN
          Select EventwParam()
            Case #VK_RETURN
              _PosItem = CheckAddItem(GetGadgetText(#SEARCH_COMBO), _lKeywords())
              SetActiveGadget(#SEARCH_COMBO)
              Debug GetGadgetItemText(#SEARCH_COMBO, _PosItem)
            Case #VK_ESCAPE
              _Quit = #True
          EndSelect
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #SEARCH_BUTTON_OK
              _PosItem = CheckAddItem(GetGadgetText(#SEARCH_COMBO), _lKeywords())
              SetActiveGadget(#SEARCH_COMBO)
              Debug GetGadgetItemText(#SEARCH_COMBO, _PosItem)
          EndSelect
      EndSelect
    Until _Quit
  EndIf
EndProcedure

SearchDB()
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Ajout donnees uniques dans combobox

Message par Ar-S »

Elle marche bien, j'ajouterai seulement en tout début de procédure une petite vérif supplémentaire
A moins que tu veuilles aussi ajouter des champs vides.

Code : Tout sélectionner

If __Item <> ""

;(....ton code....)

else
   ProcedureReturn 0
endif
~~~~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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Ajout donnees uniques dans combobox

Message par Backup »

flaith a écrit :Toujours pour mon projet, j'ai besoin de rentrer des clés de recherches, mais si je rentre plusieurs fois la meme clé, je ne veux pas la voir affichée dans mon combo.
c'est exactement la methode que j'utilise dans ce code (le dernier posté )
http://www.purebasic.fr/french/viewtopi ... 13#p158713

sauf que je passe par un Goto , ta methode est plus elegante ...
(mais moi j'aime bien Goto :) )

il faut dire que je suis obligé de relancer le generateur aleatoire, au cas ou un doublon se présente .. et ré-analyse de la liste .. d'ou le Goto ;)
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Ajout donnees uniques dans combobox

Message par Ar-S »

Je pense que la plupart des procédures pour gérer des ajouts uniques à une liste se ressemblent.
(Même s'il y a encore des vieux basicars comme Dobro qui utilisent du

Code : Tout sélectionner

10 Cls
20 print "je suis un vieux basicar"
30 goto 10
:mrgreen:

Pour mes radios, voilà ma procédure qui est similaire même si elle est un peu plus longue du fait de plus de vérif et que j'ai 3 éléments à prendre en compte dans une structure.
Je finis aussi par le trie de la liste (SortStructuredList () )

Code : Tout sélectionner

Procedure.b AddRadio ( )
 	
 	Add_Name.s = InputRequester("Ajouter une Radio","Entrer le Nom de la radio (ex : Radio Paradise)","",0)
 	
 	If Add_Name <> ""
 		Add_Url.s = InputRequester("Ajouter une Radio","Entrer l'adresse de la radio (ex : http://stream-dc1.radioparadise.com:80/mp3-128)","http://",0)
 			
 			If Add_Url <> "" And Left (Add_Url,7) = ("http://")
 				Add_Fav = MessageRequester("Ajouter une Radio","Souhaitez vous ajouter cette radio à vos favoris ?",#PB_MessageRequester_YesNo)
 				
 					If Add_Fav = 6 Or Add_Fav = 7
 					
	 					If  Add_Fav = 6 ; Oui
							Add_Fav = 1
						ElseIf 	Add_Fav = 7 ; Non
							Add_Fav = 0
						EndIf	
					
					
					; AJOUT DE LA NOUVELLE RADIO DANS LA LISTE
					
					AddElement ( R() )
					R()\NOM = Add_Name
					R()\URL = Add_Url
					R()\FAV = Str(Add_Fav)
					
					
					; TRIE DE LA LISTE PAR ORDRE ALPHABETIQUE
					SortStructuredList ( R(), #PB_Sort_Ascending|#PB_Sort_NoCase, OffsetOf(InfoRadio\NOM), TypeOf(InfoRadio\NOM ) )
					
					
					ProcedureReturn 1
					
				Else
					SetGadgetText(#AFF, Cancel$)

				EndIf			
					
			Else
 				SetGadgetText(#AFF, Cancel$)
 			
 			EndIf
 			
 	Else
 		SetGadgetText(#AFF, Cancel$)		
 			
 	EndIf	

ProcedureReturn 0	


 EndProcedure
Et si la procédure = 1 alors comme toi j'efface le combo et réecris la liste() dedans
~~~~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
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Ajout donnees uniques dans combobox

Message par flaith »

Merci les gars :D
Sinon j'ai vu une erreur dans mon code, à cause de la position retournée lors de la recherche, celle-ci ne correspond pas au texte lors de l'affichage.
Comme je veux uniquement afficher les 10 derniers mots clés entrés, je dois, je pense, mettre les données dans le combo en partant de la fin de la liste et, ensuite, faire ma recherche :D :wink:
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Ajout donnees uniques dans combobox

Message par Ar-S »

flaith a écrit : Comme je veux uniquement afficher les 10 derniers mots clés entrés, je dois, je pense, mettre les données dans le combo en partant de la fin de la liste et, ensuite, faire ma recherche :D :wink:
Tout à fait. cool que PB ait les commandes pour ça sans avoir à tortiller.
Tu te fous sur le Lastelement() et tu boucles avec un PreviousElement();
~~~~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
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Ajout donnees uniques dans combobox

Message par flaith »

Nouvelle version :

Code : Tout sélectionner

EnableExplicit

#KEEP_MAX_IN_COMBO    = 20

Enumeration
  #SEARCH_WIN
  #SEARCH_COMBO
  #SEARCH_BUTTON_OK
EndEnumeration

Structure CS_KEYWORD
  IndexInList.i
  Keyword.s
EndStructure

Procedure.i CheckAddItem(__Item.s, List __lKeywords.CS_KEYWORD())
  Protected.i _posItem = 0, _index = 0, _Found = #False, _indexInList = ListSize(__lKeywords())
  Protected.s NewList _lTemp.CS_KEYWORD()

  For _posItem = 0 To CountGadgetItems(#SEARCH_COMBO) - 1
    If GetGadgetItemText(#SEARCH_COMBO, _posItem) = __Item
      _Found   = #True
      Break
    EndIf
  Next

  If Not _Found
    AddElement(__lKeywords())
      __lKeywords()\Keyword     = __Item
      __lKeywords()\IndexInList = _indexInList
    AddGadgetItem(#SEARCH_COMBO, -1, __Item)
  EndIf
  SortStructuredList(__lKeywords(), #PB_Sort_Descending, OffsetOf(CS_KEYWORD\IndexInList), TypeOf(CS_KEYWORD\IndexInList))

  ;Get the last #KEEP_MAX_IN_COMBO max keywords in the combobox
  If _indexInList > 0
    ResetList(__lKeywords())
    For _index = 1 To #KEEP_MAX_IN_COMBO
      If NextElement(__lKeywords())
        AddElement(_lTemp())
          _lTemp()\IndexInList = __lKeywords()\IndexInList
          _lTemp()\Keyword     = __lKeywords()\Keyword
      EndIf
    Next

    ;Populate the combobox
    ClearGadgetItems(#SEARCH_COMBO)
    ForEach _lTemp()
      AddGadgetItem(#SEARCH_COMBO, -1, _lTemp()\Keyword)
    Next
  EndIf
  
  ;Need to make a second check with the new items in the combo
  _Found = #False
  For _posItem = 0 To CountGadgetItems(#SEARCH_COMBO) - 1
    If GetGadgetItemText(#SEARCH_COMBO, _posItem) = __Item
      _Found   = #True
      Break
    EndIf
  Next
  
  If Not _Found
    ;Select first item
    SetGadgetState(#SEARCH_COMBO, 0)
  Else
    SetGadgetState(#SEARCH_COMBO, _posItem)
  EndIf
  
  ProcedureReturn _posItem
EndProcedure

Procedure SearchDB()
  Protected.i _Quit = #False, _PosItem = 0
  Protected.s NewList _lKeywords.CS_KEYWORD()

  If OpenWindow(#SEARCH_WIN, 0, 0, 270, 180, "Adding unique value inside ComboBox", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ComboBoxGadget(#SEARCH_COMBO, 10, 10, 220, 21, #PB_ComboBox_Editable|#PB_ComboBox_LowerCase)
      AddGadgetItem(#SEARCH_COMBO, -1, "")
    ButtonGadget(#SEARCH_BUTTON_OK, 230, 9, 30, 23, "Ok")

    SetGadgetState(#SEARCH_COMBO, 0)
    SetActiveGadget(#SEARCH_COMBO)

    Repeat 
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          _Quit = #True
        Case #WM_KEYDOWN
          Select EventwParam()
            Case #VK_RETURN
              _PosItem = CheckAddItem(GetGadgetText(#SEARCH_COMBO), _lKeywords())
              SetActiveGadget(#SEARCH_COMBO)
            Case #VK_ESCAPE
              _Quit = #True
          EndSelect
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #SEARCH_BUTTON_OK
              _PosItem = CheckAddItem(GetGadgetText(#SEARCH_COMBO), _lKeywords())
              SetActiveGadget(#SEARCH_COMBO)
          EndSelect
      EndSelect
    Until _Quit
  EndIf
EndProcedure

SearchDB()
J'ai pas optimisé car j'ai ce projet a terminer et j'ai deja un mois de retard, donc pas encore payé :P
je suis preneur si vous trouvez comment optimisé :wink:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Ajout donnees uniques dans combobox

Message par Kwai chang caine »

Merci FLAITH 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre