Page 1 sur 1
[R] Combo avec Auto-Suggestion
Posté : lun. 15 mars 2010 19:48
par DJSIR
Bonjour Tout le monde !
(Bonjour Dr. Nick)
J'ai un petit problème aujourd'hui qui n'embête bien.
Regardez l'image ci-dessous :

C'est un exemple de ce que je veux.
Regardez, le Combo est vide au départ mais il est rempli dans le menu déroulant (flèche à coté).
Je commence à taper un des termes (du menu déroulant du combo), et il me suggère, gràce au début de ce que j'ai écrit, un terme du menu sans que j'ai tout à écrire...
Voyez ?
Merci !
Re: [..] Combo avec Auto-Suggestion
Posté : lun. 15 mars 2010 23:09
par Tlem
Je dirais :
- A la saisie de chaque caractère, on regarde à l'aide de fonction Stringxxxx dans la liste des éléments du combo, celui qui correspond en premier le mieux, puis on l'affiche.

Re: [..] Combo avec Auto-Suggestion
Posté : mar. 16 mars 2010 13:14
par DJSIR
Plus complexe que j'aurai pensé mais c'est une bonne idée, Merci !
Re: [R] Combo avec Auto-Suggestion
Posté : mar. 16 mars 2010 13:22
par Yogui
J'ai recherché la même chose et j'utilise un bout de code trouvé sur le forum anglais :
http://www.autoitscript.com/forum/index ... ntry530538
Re: [R] Combo avec Auto-Suggestion
Posté : mar. 16 mars 2010 13:26
par DJSIR
à Moins que je n'ai pas vraiment compris l'utilité réelle de ce code, je ne pense pas qu'il réponde a mon problème
Re: [R] Combo avec Auto-Suggestion
Posté : mar. 16 mars 2010 13:29
par Yogui
faudrait que je fasse un exemple je repasse dans 5 - 10 minutes
Re: [R] Combo avec Auto-Suggestion
Posté : mar. 16 mars 2010 13:40
par Yogui
donc voilà un exemple fonctionnel (aucune chance effectivement avec mon lien c'était pas le bon)
Donc pour me faire pardonner :
► Afficher le texte
Code : Tout sélectionner
#Region Include
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GuiCombobox.au3>
#include <GuiConstants.au3>
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#EndRegion Include
#Region Variables
Dim $Reputil = "c:"
Global $hwnd, $msg
Dim $FileCount1 = 0
Global $Dirlist = ""
Global $Combo, $Btn_Exit, $File, $Search
Global $DebugIt = 1
Global $Status, $msg, $ret, $old_string = ""
#EndRegion Variables
#Region param
_ScanMachine($Reputil)
#EndRegion param
#Region ### START Koda GUI section ### Form=
$hwnd = GUICreate("test :", 301, 145, 193, 125)
$Combo = GUICtrlCreateCombo("", 160, 24, 103, 25)
GUICtrlSetData(-1, $Dirlist, "")
GUISetState()
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
#EndRegion ### END Koda GUI section ###
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
Exit
EndSelect
WEnd
Exit
#Region fonction
#Region gestion combo
Func _Combo_Changed()
;~ dim $DebugIt
;----------------------------------------------------------------------------------------------
If $DebugIt Then ConsoleWrite(_DebugHeader("Combo Changed:" & GUICtrlRead($Combo)))
;----------------------------------------------------------------------------------------------
_AutoComplete($Combo, $old_string)
EndFunc ;==>_Combo_Changed
Func _AutoComplete($Combo, ByRef $old_string)
If _IsPressed('08') Then;backspace pressed
$old_string = GUICtrlRead($Combo)
Else
If $old_string <> GUICtrlRead($Combo) Then
Local $ret, $s_text, $s_data
$s_data = GUICtrlRead($Combo)
$ret = _GUICtrlComboBox_FindString($Combo, GUICtrlRead($Combo))
If ($ret <> $CB_ERR) Then
_GUICtrlComboBox_GetLBText($Combo, $ret, $s_text)
GUICtrlSetData($Combo, $s_text)
_GUICtrlComboBox_SetEditSel($Combo, StringLen($s_data), StringLen(GUICtrlRead($Combo)))
EndIf
$old_string = GUICtrlRead($Combo)
EndIf
EndIf
EndFunc ;==>_AutoComplete
Func MY_WM_COMMAND($hwnd, $msg, $wParam, $lParam)
Local $nNotifyCode = _HiWord($wParam)
Local $nID = _LoWord($wParam)
Local $hCtrl = $lParam
Switch $nID
Case $Combo
Switch $nNotifyCode
Case $CBN_EDITUPDATE, $CBN_EDITCHANGE
_Combo_Changed()
Case $CBN_SELCHANGE
_Combo_Changed()
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>MY_WM_COMMAND
Func _DebugHeader($s_text)
Return _
"!===========================================================" & @LF & _
"+===========================================================" & @LF & _
"-->" & $s_text & @LF & _
"+===========================================================" & @LF
EndFunc ;==>_DebugHeader
Func _HiWord($x)
Return BitShift($x, 16)
EndFunc ;==>_HiWord
Func _LoWord($x)
Return BitAND($x, 0xFFFF)
EndFunc ;==>_LoWord
#EndRegion gestion combo
Func _ScanMachine($SourceFolder)
Local $FileAttributes
Local $FullFilePath
$Search = FileFindFirstFile($Reputil & "\*.*")
While 1
If $Search = -1 Then
ExitLoop
EndIf
$File = FileFindNextFile($Search)
If @error Then ExitLoop
$FullFilePath = $SourceFolder & "\" & $File
$FileAttributes = FileGetAttrib($FullFilePath)
If StringInStr($FileAttributes, "D") Then
$FileCount1 += 1
$Dirlist = $Dirlist & "|" & $File
EndIf
WEnd
FileClose($Search)
EndFunc ;==>_ScanMachine
#EndRegion fonction
Ce script ne fait pas grand chose il liste les repertoires à la racine du C (oui il faut bien une liste de truc à mettre dans la combo) il auto remplit la combo suivant la ou les lettres saisis par l'utilisateur.
Avantage de ce script il s'auto débug
Re: [R] Combo avec Auto-Suggestion
Posté : mar. 16 mars 2010 13:53
par DJSIR
Merci bcp

Re: [R] Combo avec Auto-Suggestion
Posté : lun. 23 janv. 2012 23:50
par benjahinfo
Bonjour et merci pour ces fonctions.
J'ai un problème concernant la fonction "_GUICtrlComboBox_SetEditSel($Rechercher, StringLen($s_data), -1)".
Elle me retourne "True", mais la sélection se fait toujours entièrement.
Votre exemple marche pourtant très bien chez moi.
Sauriez-vous pourquoi ?
Qu'est-ce qui pourrait gêner cette fonction dans mon script ?
Re: [R] Combo avec Auto-Suggestion
Posté : mar. 24 janv. 2012 00:09
par jchd
Bienvenue au cimetière : tu viens de déterrer un machab de près de deux ans...
Pour répondre à ta question: certainement le reste de ton code que tu as omis de poster.
Décidément, ce fil navigue en eaux troubles : on passe outre-tombe de l'hypnose à la divination.
Après qui se plaindra de lire qu'AutoIt est un truc de charlatan ?
Re: [R] Combo avec Auto-Suggestion
Posté : mar. 24 janv. 2012 00:48
par benjahinfo
jchd a écrit :Bienvenue au cimetière : tu viens de déterrer un machab de près de deux ans...
Pour répondre à ta question: certainement le reste de ton code que tu as omis de poster.
Décidément, ce fil navigue en eaux troubles : on passe outre-tombe de l'hypnose à la divination.
Après qui se plaindra de lire qu'AutoIt est un truc de charlatan ?
Bonjour, et oui désolé d'avoir déterré ce topic....
Je suis débutant en autoit et c'est un language que j'apprécie.
Actuellement il fait 3676 lignes, et cela m'embête de le poster en ligne à la vu de tous...
Que dois-je faire ?
Re: [R] Combo avec Auto-Suggestion
Posté : mar. 24 janv. 2012 01:29
par jchd
Comme il se doit, indépendament du langage : rogner ton code jusqu'à n'en laisser qu'un tout petit trognon véreux qui démontre le problème de la façon la plus dépouillée possible.
NB : pour _GUICtrlComboBox_SetEditSel les positions démarrent à zéro.
Re: [..] Combo avec Auto-Suggestion
Posté : jeu. 12 juil. 2012 03:01
par benjahinfo
Ah cette méthode je vais m'en souvenir, je vous remercie !!!
En réduisant le code au maximum j'ai pu ciblé ce qui n'aillait pas !
Donc pour mon problème ou la sélection se faisait entièrement,
voici le code rogné qui démontre le bug:
► Afficher le texte
Code : Tout sélectionner
#NoTrayIcon
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GuiCombobox.au3>
#include <GuiConstants.au3>
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Global $DebugIt = 0
Global $msg, $ret, $old_string = "", $hwnd
#region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("XXX", 567, 446, -1, -1, -1)
Global $mm7 = GUICtrlCreateMenu("X1")
Global $mm1 = GUICtrlCreateMenu("X2")
Global $zz1 = GUICtrlCreateMenuItem("XXX1", $mm1)
Global $zz2 = GUICtrlCreateMenuItem("XXX2", $mm1)
Global $zz3 = GUICtrlCreateMenuItem("XXX3", $mm1)
Global $mm5 = GUICtrlCreateMenu("X3")
Global $xx1 = GUICtrlCreateMenu("X4")
Global $xx2 = GUICtrlCreateMenuItem("XXXX4", $xx1)
Global $xx3 = GUICtrlCreateMenuItem("XXXX5", $xx1)
Global $xx4 = GUICtrlCreateMenuItem("XXXX6", $xx1)
Global $Tab1 = GUICtrlCreateTab(13, 21, 540, 328)
Global $TabSheet1 = GUICtrlCreateTabItem("X")
Global $Group1 = GUICtrlCreateGroup("XXX", 22, 55, 520, 95)
Global $Rechercher = GUICtrlCreateCombo("", 43, 114, 364, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateTabItem("")
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
$new = "Rastafari|Babylon|Zion|IandI|Jah|Roots"
GUICtrlSetData($Rechercher, $new, "")
While 1
$nMsg = GUIGetMsg(1)
Switch $nMsg[0]
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
#region gestion combo
Func _Combo_Changed()
;~ dim $DebugIt
If $DebugIt Then ConsoleWrite(_DebugHeader("Combo Changed:" & GUICtrlRead($Rechercher)))
_AutoComplete($Rechercher, $old_string)
EndFunc ;==>_Combo_Changed
Func _AutoComplete($Rechercher, ByRef $old_string)
If _IsPressed('08') Then;backspace pressed
$old_string = GUICtrlRead($Rechercher)
Else
If $old_string <> GUICtrlRead($Rechercher) Then
Local $ret, $wmtext, $s_data
$s_data = GUICtrlRead($Rechercher)
$ret = _GUICtrlComboBox_FindString($Rechercher, GUICtrlRead($Rechercher))
If ($ret <> $CB_ERR) Then
_GUICtrlComboBox_GetLBText($Rechercher, $ret, $wmtext)
GUICtrlSetData($Rechercher, $wmtext)
_GUICtrlComboBox_SetEditSel($Rechercher, StringLen($s_data), -1)
EndIf
$old_string = GUICtrlRead($Rechercher)
EndIf
EndIf
EndFunc ;==>_AutoComplete
Func MY_WM_COMMAND($hwnd, $msg, $wParam, $lParam)
Local $nNotifyCode = BitShift($wParam, 16)
Local $nID = BitAND($wParam, 0xFFFF)
Local $hCtrl = $lParam
Switch $nID
Case $Rechercher
Switch $nNotifyCode
Case $CBN_EDITUPDATE, $CBN_EDITCHANGE
_Combo_Changed()
Case $CBN_SELCHANGE
_Combo_Changed()
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>MY_WM_COMMAND
Func _DebugHeader($wmtext)
Return _
"!===========================================================" & @LF & _
"+===========================================================" & @LF & _
"-->" & $wmtext & @LF & _
"+===========================================================" & @LF
EndFunc ;==>_DebugHeader
#endregion gestion combo
Il semblerait que ce soit les menus qui bloque.
Parce-que ce code-ci fonctionne:
► Afficher le texte
Code : Tout sélectionner
#NoTrayIcon
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GuiCombobox.au3>
#include <GuiConstants.au3>
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Global $DebugIt = 0
Global $msg, $ret, $old_string = "", $hwnd
#region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("XXX", 567, 446, -1, -1, -1)
Global $Tab1 = GUICtrlCreateTab(13, 21, 540, 328)
Global $TabSheet1 = GUICtrlCreateTabItem("X")
Global $Group1 = GUICtrlCreateGroup("XXX", 22, 55, 520, 95)
Global $Rechercher = GUICtrlCreateCombo("", 43, 114, 364, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateTabItem("")
Global $mm7 = GUICtrlCreateMenu("X1")
Global $mm1 = GUICtrlCreateMenu("X2")
Global $zz1 = GUICtrlCreateMenuItem("XXX1", $mm1)
Global $zz2 = GUICtrlCreateMenuItem("XXX2", $mm1)
Global $zz3 = GUICtrlCreateMenuItem("XXX3", $mm1)
Global $mm5 = GUICtrlCreateMenu("X3")
Global $xx1 = GUICtrlCreateMenu("X4")
Global $xx2 = GUICtrlCreateMenuItem("XXXX4", $xx1)
Global $xx3 = GUICtrlCreateMenuItem("XXXX5", $xx1)
Global $xx4 = GUICtrlCreateMenuItem("XXXX6", $xx1)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
$new = "Rastafari|Babylon|Zion|IandI|Jah|Roots"
GUICtrlSetData($Rechercher, $new, "")
While 1
$nMsg = GUIGetMsg(1)
Switch $nMsg[0]
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
#region gestion combo
Func _Combo_Changed()
;~ dim $DebugIt
If $DebugIt Then ConsoleWrite(_DebugHeader("Combo Changed:" & GUICtrlRead($Rechercher)))
_AutoComplete($Rechercher, $old_string)
EndFunc ;==>_Combo_Changed
Func _AutoComplete($Rechercher, ByRef $old_string)
If _IsPressed('08') Then;backspace pressed
$old_string = GUICtrlRead($Rechercher)
Else
If $old_string <> GUICtrlRead($Rechercher) Then
Local $ret, $wmtext, $s_data
$s_data = GUICtrlRead($Rechercher)
$ret = _GUICtrlComboBox_FindString($Rechercher, GUICtrlRead($Rechercher))
If ($ret <> $CB_ERR) Then
_GUICtrlComboBox_GetLBText($Rechercher, $ret, $wmtext)
GUICtrlSetData($Rechercher, $wmtext)
_GUICtrlComboBox_SetEditSel($Rechercher, StringLen($s_data), -1)
EndIf
$old_string = GUICtrlRead($Rechercher)
EndIf
EndIf
EndFunc ;==>_AutoComplete
Func MY_WM_COMMAND($hwnd, $msg, $wParam, $lParam)
Local $nNotifyCode = BitShift($wParam, 16)
Local $nID = BitAND($wParam, 0xFFFF)
Local $hCtrl = $lParam
Switch $nID
Case $Rechercher
Switch $nNotifyCode
Case $CBN_EDITUPDATE, $CBN_EDITCHANGE
_Combo_Changed()
Case $CBN_SELCHANGE
_Combo_Changed()
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>MY_WM_COMMAND
Func _DebugHeader($wmtext)
Return _
"!===========================================================" & @LF & _
"+===========================================================" & @LF & _
"-->" & $wmtext & @LF & _
"+===========================================================" & @LF
EndFunc ;==>_DebugHeader
#endregion gestion combo
J'ai juste inversé la partie création des menu et la partie création du reste...
- Tout redevient normal aussi quand je place l'imput $Rechercher dans la GUI seule, sans le volet et sans le group. En fait si je retire l'un des deux cela remarche aussi.
Voila... je ne comprend pas vraiment d'où vient le problème, j'aimerais bien savoir, même si le problème n'est qu'à moitié résolu...
Est-ce un bug d'AutoIt, ou de Koda , un cas particulier?