Что нового

предикативный ввод в Input/Edit

Core2Duo76

Новичок
Сообщения
58
Репутация
1
Как можно реализовать предикативный ввод слов в поле ввода, например всплывающий combo или list со списком слов, которые начинаются на ту же последовательность букв,которые введены в печатаемом слове? Если словарь это одномерный массив.
 
Автор
C

Core2Duo76

Новичок
Сообщения
58
Репутация
1
нееее, не так. Я имел ввиду, что поле длинное, и вводимый текст является не словом, а предложениями. то есть автозавершение нада не для всего содержимого, а только для вводимого слова
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Core2Duo76 [?]
Почему? Смысл тот же. Там в примерах работают с данными всего поля, а вам нужно только часть слова (до пробела, например).
Вот добавил две строки в функцию из этого примера (Ответ #2 под спойлером). Теперь список появляется и в середине предложения (от пробела до каретки)
Код:
Func _ShowList()
    Local $sText = GUICtrlRead($hEdit), $i, $j = 0, $sContents = ''
    If $sText <> '' Then
        $sText = StringLeft($sText, ControlCommand("", "", $hEdit, "GetCurrentCol") - 1) ; <= добавил
        $sText = StringRight($sText, StringLen($sText) - StringInStr($sText, " ", 0, -1)) ; <= добавил
        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
Аналогично и с заменой - либо добавлять недостающие, либо выделять до пробела и заменять.
 
Автор
C

Core2Duo76

Новичок
Сообщения
58
Репутация
1
а можно сделать так, чтобы первые 4 буквы вводил пользователь, а по нему уже подсказывались слова? и текст не заменялся(как в примере) весь на найденное совпадение?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Core2Duo76
Если быстро, то как-то так
Код:
Func _ShowList()
    Local $sText = GUICtrlRead($hEdit), $i, $j = 0, $sContents = ''
    If $sText <> '' Then
        $sText = StringLeft($sText, ControlCommand("", "", $hEdit, "GetCurrentCol") - 1) ; <= добавил
        $sText = StringRight($sText, StringLen($sText) - StringInStr($sText, " ", 0, -1)) ; <= добавил
        If StringLen($sText) < 5 Then Return ; <= добавил
        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)
    ControlFocus("", "", $hEdit) ; <= добавил
    ControlSend("", "", $hEdit, "^+{left}") ; <= добавил
    Sleep(10) ; <= добавил
    GUICtrlSetData($hEdit, GUICtrlRead($hList), 1) ; <= изменил
    GUICtrlSetState($hList, $GUI_HIDE) ; <= добавил
EndFunc   ;==>_OnListClick
Исправления и улучшения - в стол заказов.
 
Верх