Что нового

[Элементы GUI] Форма ввода с выпадающим списком (как в поиске Google)

Geqsogen

Новичок
Сообщения
24
Репутация
1
Создаю поле ввода GUICtrlCreateInput - туда вводится адрес сервера (не критично что именно).

Есть массив часто используемых адресов. Как бы его выводить выпадающим списком при вводе начала адреса, чтобы оставались только те, которые подходят по началу значения?

Догадываюсь что надо использовать GUICtrlCreateCombo, но нет мыслей как именно.

Уверен что есть готовые решения, но поиск не дал мне вразумительных результатов.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Geqsogen
Может тебе подойдет такой выпадающий список?

Код:
$hMenu[0 ] = _GUICtrlMenu_CreatePopup()


А само сравнение можно делать множеством способов.
К примеру:
Разбиваем текущий элемент массива и прочитанное с Input на два массива символов.

Код:
For $Idx = 0 To UBound(прочитанный массив)-1 Step 1
    If $твоя_ячейка_разбитая[$Idx] <> $прочитанный массив[$Idx]]
        Не совпало
    EndIf
Next


Если нет несовпадений, то совпало.
Добавляешь в новый массив совпавшую строку и двигаешься к следующей.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Geqsogen
Пример с офф форума:
Код:
#include <WinAPI.au3>
#include <GuiEdit.au3>
#include <GUIListBox.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>

Opt('MustDeclareVars', 1)

Global $hEdit, $hList = 0, $tRECT, $iHeight
Global $aValid[11] = ['Bruce Wayne', 'Bruce Banner', 'Brian Damage', 'Peter Parker', 'Polly Pocket', 'Hugh Janus', 'Zachary Quack', 'Zebedee', 'Billy Hunt', 'Jackson Pollock', 'Clark Kent']

_Main()

Exit

Func _Main()
	Local $hGUI = GUICreate('Daisywheel Combo', 512, 212)
	$hEdit = GUICtrlCreateInput('', 8, 8, 496)
	$hList = GUICtrlCreateList('', 8, 32, 496, 24, $LBS_SORT + $WS_VSCROLL)
	GUICtrlSetOnEvent($hList, '_OnListClick')
	GUICtrlSetState($hList, $GUI_HIDE)
	GUISetState()

	$tRECT = _WinAPI_GetWindowRect(GUICtrlGetHandle($hEdit))
	$iHeight = DllStructGetData($tRECT, 'Bottom') - DllStructGetData($tRECT, 'Top')

	GUIRegisterMsg($WM_COMMAND, '_OnMessage')

	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE
	GUIDelete()
EndFunc   ;==>_Main

Func _OnMessage($hWnd, $iMsg, $wParam, $lParam)
	Local $hWndFrom = $lParam, $iIDFrom = _WinAPI_LoWord($wParam), $iCode = _WinAPI_HiWord($wParam)
	Switch $iMsg
		Case $WM_COMMAND
			Switch $hWndFrom
				Case GUICtrlGetHandle($hEdit)
					Switch $iCode
						Case $EN_CHANGE
							_ShowList()
					EndSwitch
				Case GUICtrlGetHandle($hList)
					Switch $iCode
						Case $LBN_SELCHANGE
							_OnListClick()
						Case $LBN_DBLCLK, $LBN_KILLFOCUS
							GUICtrlSetState($hList, $GUI_HIDE)
							If $iCode = $LBN_DBLCLK Then GUICtrlSetState($hEdit, $GUI_FOCUS)
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>_OnMessage

Func _ShowList()
	Local $sText = GUICtrlRead($hEdit), $i, $j = 0, $sContents = ''
	If $sText <> '' Then
		For $i = 0 To UBound($aValid) - 1
			If StringRegExp($aValid[$i], '(?i)^' & $sText & '.*') Then
				$sContents &= '|' & $aValid[$i]
				$j += 1
			EndIf
		Next
	EndIf
	If $sContents <> '' Then
		ConsoleWrite($j & ' ' & $iHeight * $j & @CRLF)
		GUICtrlSetPos($hList, 8, 8 + $iHeight, 496, $iHeight * $j)
		GUICtrlSetData($hList, $sContents)
		GUICtrlSetState($hList, $GUI_SHOW)
	Else
		GUICtrlSetState($hList, $GUI_HIDE)
	EndIf
EndFunc   ;==>_ShowList

Func _OnListClick()
	ConsoleWrite(GUICtrlRead($hList) & @CRLF)
	GUICtrlSetData($hEdit, GUICtrlRead($hList))
EndFunc   ;==>_OnListClick
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
http://autoit-script.ru/index.php/topic,13743.msg87086.html#msg87086
 
Автор
G

Geqsogen

Новичок
Сообщения
24
Репутация
1
firex - Спасибо, слишком мало инфы)
WSWR - Близко очень, но там надо переделывать под управление стрелками клавиатуры - очень трудно в коде разобраться.
AZJIO Спасибо! Самое то! Воспользовался этим:

http://www.autoitscript.com/forum/topic/146594-comboboxautofillau3-udf-autofill-a-combobox-edit-control/.
Допилить под свои нужды не составило труда. :beer:
 
Верх