Что нового

Поиск в "List"

GUIMish

Знающий
Сообщения
122
Репутация
12
Версия AutoIt: 3.3.8.1

Описание:
Мне нужно чтобы вносишь в input букву, допустим "A" и нажимаем на поиск, а оно показывает в input слова, которые начинаются в этой буквы, добавляешь еще "u" и он показывает только те которые начинаются с "Au"

Код:
$Window = GUICreate("Поиск", 195, 200, -1, -1, 532479, 0)

$Button = GUICtrlCreateButton("Поиск", 140, 5, 40, 20)
$St = GUICtrlCreateInput("", 10, 5, 125, 20)
GUICtrlSetState(-1, 256)

$List = GUICtrlCreateList("", 10, 30, 170, 140, 2097154)
   GUICtrlSetData(-1, "Autoit info|Я Люблю Autoit|Autoit за рулем|Autoit это просто|Bridge to Autoit|Autoit Для Чайников|Autoit Для Профессионалов|Уроки Для Профессионалов|Профессиональный Autoit|О Autoit|Словарь Autoit|Книга по Autoit|Возможности Autoit|Окно в Autoit|Input в Autoit|Поиск в Autoit|Видео в Autoit|GUICreate|While in Autoit")

GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            ExitLoop
    EndSwitch
WEnd
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
GUIMish
Можно так, но есть проблемы с кириллицей:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <Array.au3>

$Window = GUICreate("Поиск", 195, 200)

$Button = GUICtrlCreateButton("Поиск", 140, 5, 40, 20)
$St = GUICtrlCreateInput("", 10, 5, 125, 20)
GUICtrlSetState(-1, 256)

$Edit = GUICtrlCreateEdit("", 10, 30, 170, 140, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_NOHIDESEL + $ES_WANTRETURN)
GUICtrlSetData(-1, "Autoit info"&@CRLF&"Я Люблю Autoit"&@CRLF&"Autoit за рулем"&@CRLF&"Autoit это просто"&@CRLF&"Bridge to Autoit"&@CRLF&"Autoit Для Чайников"&@CRLF _
&"Autoit Для Профессионалов"&@CRLF&"Уроки Для Профессионалов"&@CRLF&"Профессиональный Autoit"&@CRLF&"О Autoit"&@CRLF&"Словарь Autoit"&@CRLF _
&"Книга по Autoit"&@CRLF&"Возможности Autoit"&@CRLF&"Окно в Autoit"&@CRLF&"Input в Autoit"&@CRLF&"Поиск в Autoit"&@CRLF&"Видео в Autoit"&@CRLF&"GUICreate"&@CRLF _
&"While in Autoit")

GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button
			_Poisk()
	EndSwitch
WEnd

Func _Poisk()

	If GUICtrlRead($St) = '0' Then Return

	$Shabl = StringRegExpReplace(GUICtrlRead($St), '\s', '')
	$aText = StringRegExp(GUICtrlRead($Edit), '([^\r].*?)\s', 3)
	$aSovp = StringRegExp(_ArrayToString($aText, ' '), '(?i)\s('&$Shabl&'.*?)\s', 3)

		If Not IsArray($aSovp) Then
			GUICtrlSetData($St, 'Совпадений нет')
		Else
			GUICtrlSetData($St, _ArrayToString($aSovp, ' '))
		EndIf

EndFunc
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
InnI

Если имеется в виду принцип на который указал AZJIO, то в моем случае

GUIMish сказал(а):
Мне нужно чтобы вносишь в input букву, допустим "A" и нажимаем на поиск, а оно показывает в input слова, которые начинаются с этой буквы

У меня работает по такому принципу, а у кириллицы проблемы с заглавными буквами(
Не воздействует флаг (?i) на кириллицу.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
ivsatel
Я не внимательно прочитал задание... не обратил внимание на input... посчитал, что нужна фильтрация списка. Беру свои слова обратно :-[
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
GUIMish,
Мой пробный вариант. (тестовый файл test.txt с никами всех пользователей нашего форума :smile: в прикрепленном архиве)
Код:
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ListBoxConstants.au3>
#include <StaticConstants.au3>

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $hGUI, $nCombo, $nList, $nDummy, $nCheckBox, $nLabel, $iMaxLen, $sTextList, $hEdit, $fNoCasesense = True, $sOldText, $sFile, $nBtn, $nLabelFile

If WinExists(@ScriptName & '{[/@$@\]}') Then Exit
AutoItWinSetTitle(@ScriptName & '{[/@$@\]}')

$hGUI = GUICreate('ListBox & ComboBox', 300, 600)
$nLabelFile = GUICtrlCreateLabel(@ScriptDir & '\test.txt', 5, 5, 265, 20, $SS_CENTERIMAGE)
GUICtrlSetBkColor(-1, 0xFFFFFF)
$nBtn = GUICtrlCreateButton('...', 272, 4, 22, 22)
$nCheckBox = GUICtrlCreateCheckbox('Учитывать регистр', 75, 30, 150, 20)
$nCombo = GUICtrlCreateCombo('', 75, 55, 150, 190, BitOR($CBS_AUTOHSCROLL, $WS_VSCROLL, $CBS_SIMPLE))
__GetComboEdit($nCombo, $hEdit)
GUICtrlCreateLabel('№ строки: ', 75, 245, 75, 20, BitOR($SS_RIGHT, $SS_CENTERIMAGE))
$nLabel = GUICtrlCreateLabel('', 150, 245, 50, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetBkColor(-1, 0xFFFFFF)
$nList = GUICtrlCreateList('', 50, 270, 200, 320)
$nDummy = GUICtrlCreateDummy()
GUISetState()

ConsoleWrite('1 __Set_FileText_to_ListBox: ' & __Set_FileText_to_ListBox($nList, $nCombo, @ScriptDir & '\test.txt', $sTextList, $iMaxLen) & @LF)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nBtn
			$sFile = FileOpenDialog('Выберите файл', @ScriptDir & '\', 'Текстовый файл (*.txt)', 3, '', $hGUI)
			If @error Then ContinueLoop
			ConsoleWrite('2 __Set_FileText_to_ListBox: ' & __Set_FileText_to_ListBox($nList, $nCombo, $sFile, $sTextList, $iMaxLen) & @LF)
		Case $nCheckBox
			$fNoCasesense = (BitAND(GUICtrlRead($nCheckBox), $GUI_CHECKED) = 0)
			$sOldText = ''
			ConsoleWrite('2 __Set_Combo_Lines: ' & __Set_Combo_Lines($nCombo, $hEdit, $sTextList, $iMaxLen, $fNoCasesense, $sOldText) & @LF)
		Case $nDummy
			GUICtrlSetData($nLabel, '')
			Switch GUICtrlRead($nDummy)
				Case 1
					ConsoleWrite('1 __Set_Combo_Lines: ' & __Set_Combo_Lines($nCombo, $hEdit, $sTextList, $iMaxLen, $fNoCasesense, $sOldText) & @LF)
				Case 2
					ConsoleWrite(' __Select_List: ' & __Select_List($nCombo, $hEdit, $nList, $nLabel, $sOldText) & @LF)
			EndSwitch
	EndSwitch
WEnd

Func __Select_List($n_Combo, $h_Edit, $n_List, $n_Label, $s_OldText)
	Local $s_Text, $i_Len, $i_Tmp

	$s_Text = GUICtrlRead($n_Combo, 1)
	$i_Len = StringLen($s_Text)
	If $i_Len Then
		$i_Tmp = GUICtrlSendMsg($n_List, $LB_SELECTSTRING, -1, $s_Text)
		If $i_Tmp >= 0 Then GUICtrlSetData($n_Label, $i_Tmp + 1)
	Else
		DllCall('user32.dll', 'bool', 'SetWindowTextW', 'hwnd', $h_Edit, 'wstr', $s_OldText)
		$i_Len = StringLen($s_OldText)
	EndIf
	GUICtrlSetState($n_Combo, $GUI_FOCUS)
	GUICtrlSendMsg($n_Combo, $CB_SETEDITSEL, 0, BitOR(BitShift($i_Len, -16), BitAND($i_Len, 0xFFFF)))
	Return (GUICtrlSendMsg($n_Combo, $CB_SETEDITSEL, 0, BitOR(BitShift($i_Len, -16), BitAND($i_Len, 0xFFFF))) = 1)
EndFunc   ;==>__Select_List

Func __Set_Combo_Lines($n_Combo, $h_Edit, $s_TextList, $i_MaxLen, $f_NoCasesense, ByRef $s_OldText)
	Local $s_Text, $i_Len, $a_Tmp, $i_Tmp, $i_Err = 0
	Local Const $___WM_SETREDRAW = 0x000B

	$s_Text = GUICtrlRead($n_Combo, 1)
	If $s_OldText == $s_Text Then Return True
	$s_OldText = $s_Text
	GUICtrlSendMsg($n_Combo, $CB_RESETCONTENT, 0, 0)
	$i_Len = StringLen($s_Text)
	If Not $i_Len Then Return True
	GUICtrlSendMsg($n_Combo, $___WM_SETREDRAW, 0, 0)
	Do
		Switch $i_Len
			Case 1 To $i_MaxLen
				$a_Tmp = DllCall('user32.dll', 'bool', 'SetWindowTextW', 'hwnd', $hEdit, 'wstr', $s_Text)
				If @error Or Not $a_Tmp[0] Then ExitLoop
				$a_Tmp = StringRegExp($s_TextList, __Pattern($s_Text, $f_NoCasesense), 3)
				$i_Tmp = UBound($a_Tmp)
				If $i_Tmp Then
					For $i = 0 To $i_Tmp - 1
						If GUICtrlSendMsg($n_Combo, $CB_ADDSTRING, $i, $a_Tmp[$i]) <> $i Then ExitLoop 2
					Next
				Else
					$sOldText = ''
					DllCall('user32.dll', 'bool', 'MessageBeep', 'uint', 16)
					GUICtrlSetBkColor($n_Combo, 0xFFE4E1)
					AdlibRegister('_DelColor', 2000)
				EndIf
		EndSwitch
		$i_Err = 1
	Until 1
	GUICtrlSendMsg($n_Combo, $___WM_SETREDRAW, 1, 0)
	GUICtrlSetState($n_Combo, $GUI_FOCUS)
	If $i_Err Then $i_Err = GUICtrlSendMsg($n_Combo, $CB_SETEDITSEL, 0, BitOR(BitShift($i_Len, -16), BitAND($i_Len, 0xFFFF)))
	Return ($i_Err = 1)
EndFunc   ;==>__Set_Combo_Lines

Func _DelColor()
	GUICtrlSetBkColor($nCombo, 0xFFFFFF)
	GUICtrlSetState($nCombo, $GUI_FOCUS)
	AdlibUnRegister('_DelColor')
EndFunc   ;==>_DelColor

Func __Pattern($s_Text, $f_NoCasesense)
	Local $a_Tmp, $i_Rus, $s_Pattern

	$s_Text = StringRegExpReplace($s_Text, '[.^$()\[\]*+?{}|\\]', '\\$0')
	If $f_NoCasesense Then
		$s_Pattern = '(?im)^('
		$i_Rus = StringRegExp($s_Text, '[ЁёА-я]')
		If $i_Rus Then
			$a_Tmp = StringSplit($s_Text, '')
			For $i = 1 To $a_Tmp[0]
				Switch Asc($a_Tmp[$i])
					Case 168, 184
						$s_Pattern &= '[' & Chr(168) & Chr(184) & ']'
					Case 192 To 223
						$s_Pattern &= '[' & $a_Tmp[$i] & StringLower($a_Tmp[$i]) & ']'
					Case 224 To 255
						$s_Pattern &= '[' & StringUpper($a_Tmp[$i]) & $a_Tmp[$i] & ']'
					Case Else
						$s_Pattern &= $a_Tmp[$i]
				EndSwitch
			Next
		Else
			$s_Pattern &= $s_Text
		EndIf
	Else
		$s_Pattern = '(?m)^(' & $s_Text
	EndIf
	$s_Pattern &= '.*?)$'
	Return $s_Pattern
EndFunc   ;==>__Pattern

Func WM_COMMAND($h_Wnd, $i_Msg, $i_wParam, $i_lParam)
	#forceref $h_Wnd, $i_Msg
	Local $i_IDFrom, $i_Code

	$i_IDFrom = BitAND($i_wParam, 0xFFFF)
	$i_Code = BitShift($i_wParam, 16)
	Switch $i_IDFrom
		Case $nCombo
			Switch $i_Code
				Case $CBN_EDITUPDATE
					GUICtrlSendToDummy($nDummy, 1)
				Case $CBN_SELCHANGE
					GUICtrlSendToDummy($nDummy, 2)
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Func __GetComboEdit($n_Combo, ByRef $h_Edit)
	Local $t_Info = DllStructCreate('dword Size;long EditLeft;long EditTop;long EditRight;long EditBottom;long BtnLeft;long BtnTop;' & _
			'long BtnRight;long BtnBottom;dword BtnState;hwnd hCombo;hwnd hEdit;hwnd hList');$tagCOMBOBOXINFO

	DllStructSetData($t_Info, 'Size', DllStructGetSize($t_Info))
	GUICtrlSendMsg($n_Combo, $CB_GETCOMBOBOXINFO, 0, DllStructGetPtr($t_Info))
	$h_Edit = DllStructGetData($t_Info, 'hEdit')
	Return IsHWnd($h_Edit)
EndFunc   ;==>__GetComboEdit

Func __Set_FileText_to_ListBox($n_List, $n_Combo, $s_File, ByRef $s_TextList, ByRef $i_MaxLen)
	Local $i_Tmp, $h_File, $s_Tmp, $a_Tmp
	Local Const $___WM_SETREDRAW = 0x000B

	If Not FileExists($s_File) Then Return False
	$i_Tmp = FileGetEncoding($s_File)
	$h_File = FileOpen($s_File, $i_Tmp)
	If $h_File = -1 Then Return False
	$s_Tmp = FileRead($h_File)
	$i_Tmp = @extended
	FileClose($h_File)
	If Not $i_Tmp Then Return False
	$s_Tmp = StringRegExpReplace($s_Tmp, '[\x00-\x09\x0b-\x1f]', '')
	$i_Tmp -= @extended
	$s_Tmp = StringRegExpReplace($s_Tmp, '\n*$', '')
	$s_Tmp = StringRegExpReplace($s_Tmp, '(\n)(\s+)(\n)', '$1$3')
	$s_Tmp = StringRegExpReplace($s_Tmp, '(\n){2,}', '$1')
	$a_Tmp = StringSplit($s_Tmp, @LF)
	$i_Tmp -= $a_Tmp[0]
	GUICtrlSendMsg($n_Combo, $CB_RESETCONTENT, 0, 0)
	GUICtrlSendMsg($n_List, $LB_RESETCONTENT, 0, 0)
	If GUICtrlSendMsg($n_List, $___WM_SETREDRAW, 0, 0) Then Return False
	$i_Tmp = GUICtrlSendMsg($n_List, $LB_INITSTORAGE, $a_Tmp[0], $i_Tmp)
	If Not $i_Tmp Then Return False
	$i_MaxLen = 0
	For $i = 1 To $a_Tmp[0]
		If GUICtrlSendMsg($n_List, $LB_INSERTSTRING, $i - 1, $a_Tmp[$i]) = -1 Then Return False
		$i_Tmp = StringLen($a_Tmp[$i])
		If $i_MaxLen < $i_Tmp Then $i_MaxLen = $i_Tmp
	Next
	$s_TextList = $s_Tmp
	GUICtrlSetState($n_Combo, $GUI_FOCUS)
	Return (GUICtrlSendMsg($n_List, $___WM_SETREDRAW, 1, 0) = 0)
EndFunc   ;==>__Set_FileText_to_ListBox
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
madmasles
В качестве подготовки рег.выр. можно использовать функцию
Код:
#Include <FileOperations.au3>
MsgBox(0, 'Сообщение', __FO_UserLocale('Такая строка Eng', 'А-яЁё')) ; только для русского
MsgBox(0, 'Сообщение', __FO_UserLocale('Такая строка Eng', '\x{80}-\x{ffff}')) ; весь юникод от 127 символа и более

Она может задать диапазон не обязательно для русского языка.
Кстати, толкает меня на идею указать весь диапазон юникода \x{80}-\x{ffff} интересно теперь скорость обработки.

Кстати, вариант от Melba23. Надо начать ввод с английской буквы "b".
 
Верх