Тема: AHK: Предиктивный ввод текста в GUI
Здравствуйте.
Существует ли в ahk предиктивный ввод текста (т9)?
Это мне нужно в ComboBox`e, вместе с опцией Simple.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Здравствуйте.
Существует ли в ahk предиктивный ввод текста (т9)?
Это мне нужно в ComboBox`e, вместе с опцией Simple.
Не слышал про такое в AutoHotkey. Разве что свой делать.
ypppu
Что-то подобное есть - это опции в ComboBox`e Sort и Simple, но почему-то оба вместе не работают.
Может я неверно ввожу?
Gui, Add, ComboBox, Sort, Simple vColorChoice, Red|Green|Blue|Black|White
Работают вместе, но не дают искомого эффекта.
Gui, Add, ComboBox, Sort Simple vColorChoice, Red|Green|Blue|Black|White
GUI, Show
В DropDownList если установить опцию Sort, будет что-то более приближенное. Курсор будет следить за набором текста, но сам набор не отображается - вот это плохо.
list := "AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGray|DarkGrey|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGray|DarkSlateGrey|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGray|DimGrey|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gray|Grey|Green"
Gui, Add, ComboBox , HwndSearchT9 vCBT9 gSearch Sort r10 Simple , %list%
GUI, Show
return
Search:
GuiControlGet,CBT9
LengthCBT9 := StrLen(CBT9)
SendMessage, 0x14C, -1, &CBT9,,ahk_id %SearchT9% ;CB_FINDSTRING
IndexFinded := ErrorLevel
if (IndexFinded = -1) or GetKeyState("BS","p")
return
SendMessage, 0x014E, % IndexFinded, , , ahk_id %SearchT9% ;CB_SETCURSEL
SendMessage, 0x0142, 0, % (LengthCBT9 & 0xFFFF) | (0x64 << 16), , ahk_id %SearchT9% ; CB_SETEDITSEL
return
yalanne, классная штука, хотелось бы видеть это в Коллекции!
ypppu
Надо только косяки исправить.
Например через контекстное меню если попытаться удалить или вырезать частично выделенный текст то он не удалит его. Либо заменит на другой результат который начинается на ту же букву.
То есть нет такого же эффекта стирания как при backspeace.
Полное же выделение и удаление описанное выше работает исправно.
Можно своё контексное меню написать, в котором посылать delete.
Надо бы еще внести кнопку стирания {delete}.
И чтобы при написании текста, которого нету в списке - текст не стирался.
Я бы такой вариант рассмотрел, всё таки привязка к Sort не очень правильно. А ещё лучше наверное ниже edit`а выводить список другим контролом. Также можно добавить свои правила поиска не полагаясь на CB_FINDSTRING.
Box1 := "BlanchedAlmond|DarkGreen|Grey|Beige|DarkViolet|FloralWhite|DeepPink|FireBrick|DarkTurquoise|Chartreuse|CornflowerBlue|Coral|Cyan|Gray|GhostWhite|DarkGoldenRod|Blue|DarkKhaki|DarkMagenta|DimGrey|Bisque|DodgerBlue|Crimson|Azure|DarkSeaGreen|DimGray|CadetBlue|DarkSlateGrey|DarkOliveGreen|BurlyWood|Aquamarine|DarkGray|Black|AntiqueWhite|Green|DarkRed|DarkSalmon|Chocolate|Aqua|DeepSkyBlue|DarkOrange|BlueViolet|ForestGreen|GoldenRod|DarkSlateBlue|DarkGrey|Brown|DarkBlue|Cornsilk|Fuchsia|DarkCyan|DarkOrchid|DarkSlateGray|Gold|Gainsboro|AliceBlue"
Gui, Add, ComboBox, gComboBox1 r10 Simple, % Box1
Gui, Show
Return
ComboBox1(CtrlHwnd) {
Global Box1
Static Replace
SendMessage, % 0x0147, 0, 0,, ahk_id %CtrlHwnd% ; CB_GETCURSEL
If !((CB_ERR := ErrorLevel) < 0 || CB_ERR = 0xffffffff)
Return
GuiControlGet, Edit, , %CtrlHwnd%
If (Edit = "" && Replace)
{
GuiControl, , %CtrlHwnd%, % "|" Box1
Return Replace := 0
}
GuiControl, -Redraw, %CtrlHwnd%
SendMessage, 0x0146, 0, 0, , ahk_id %CtrlHwnd% ; CB_GETCOUNT
Loop, %ErrorLevel%
SendMessage, 0x0144, 0, , , ahk_id %CtrlHwnd% ; CB_DELETESTRING
Loop, Parse, Box1, |
If (A_LoopField ~= "i)^\Q" Edit "\E.*$" && (Text := A_LoopField) != "")
SendMessage, 0x014A, 0, &Text , , ahk_id %CtrlHwnd% ; CB_INSERTSTRING
GuiControl, +Redraw, %CtrlHwnd%
Replace := 1
}
Предиктивный — это не то же, что и "инкрементальный", уточняющийся по мере ввода? Сам я не смог настроить на работу из файла — будет ли так же быстро работать со списком в несколько десятков тысяч слов?
serzh82saratov
а если поиск необходимо проводить, где A_loopfiled состоит не из одного слова, а несколько:
ГБОУ Школа № 1694 Ясенево имени П.М. Фитина
ГБПОУ "Воробьевы горы"
ГАПОУ ПК № 8 им. И.Ф. Павлова - spo-8@edu.mos.ru_id-12017
ГБПОУ КАТ № 9 - spo-9@edu.mos.ru_id-11686
Данный код обрезает часть A_loopfiled
Box1 =
(Join|
ГБОУ Школа № 1694 Ясенево имени П.М. Фитина
ГБПОУ "Воробьевы горы"
ГАПОУ ПК № 8 им. И.Ф. Павлова - spo-8@edu.mos.ru_id-12017
ГБПОУ КАТ № 9 - spo-9@edu.mos.ru_id-11686
)
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться