|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Похожие слова в input |
|
[решено] Похожие слова в input
|
Старожил Сообщения: 398 |
Профиль | Сайт | Отправить PM | Цитировать Здравствуйте!
Нужно реализовать подсказки в поле ввода с похожими словами. Т.е. допустим пользователь ввел предложение в поле ввода и нажал сохранить. Скрипт должен сохранить данные и одновременно как то использовать введенный текст. Например разбить на слова и внести в базу новые слова. А когда пользователь повторно начнет вводить данные в поле ввода, то скрипт будет искать слова в БД и выдавать подсказки, на которую можно нажать, что бы не вводить слово целиком. Как в excel. Помогите хотя бы набросать алгоритм действий, остальное сам напишу. Единственное, у меня проблема с регулярными выражениями. Все никак не могу освоить... |
|
------- Отправлено: 12:55, 15-04-2019 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать В чём именно проблема?
|
Отправлено: 01:14, 16-04-2019 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 398
|
Профиль | Сайт | Отправить PM | Цитировать Не могу продумать алгоритм, что бы получить максимальное быстродействие. Где хранить базу. И как вывести подсказку.
|
------- Отправлено: 07:03, 16-04-2019 | #3 |
Старожил Сообщения: 398
|
Профиль | Сайт | Отправить PM | Цитировать Что никто не знает? Хотя бы блок схему составить.
|
------- Отправлено: 14:43, 19-04-2019 | #4 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Как то так:
#include <GuiComboBox.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> Global $sDB_File = @ScriptDir & '\DB.dat' Global $aDB = StringSplit(StringStripCR(FileRead($sDB_File)), @LF) GUICreate('DB Auto Complete Example', 400, 300) $iCombo = GUICtrlCreateCombo('', 20, 20, 360, 50) $hCombo = GUICtrlGetHandle($iCombo) _GUICtrlComboBox_BeginUpdate($hCombo) For $i = 1 To $aDB[0] If $aDB[$i] Then _GUICtrlComboBox_AddString($hCombo, $aDB[$i]) EndIf Next _GUICtrlComboBox_EndUpdate($hCombo) $iSave_Bttn = GUICtrlCreateButton('Save', 20, 270, 70, 20) $iDel_Bttn = GUICtrlCreateButton('Delete', 100, 270, 70, 20) GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND') GUISetState(@SW_SHOW) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit Case $iSave_Bttn _DB_Add(GUICtrlRead($iCombo), False) Case $iDel_Bttn _DB_Delete(GUICtrlRead($iCombo)) EndSwitch WEnd Func _DB_Delete($sText) If Not $sText Then Return EndIf _GUICtrlComboBox_ResetContent($hCombo) Local $aTmp[$aDB[0] + 1] Local $hFile = FileOpen($sDB_File, 2) For $i = 1 To $aDB[0] If $aDB[$i] And $aDB[$i] <> $sText Then $aTmp[0] += 1 $aTmp[$aTmp[0]] = $aDB[$i] FileWriteLine($hFile, $aDB[$i]) _GUICtrlComboBox_AddString($hCombo, $aDB[$i]) EndIf Next FileClose($hFile) ReDim $aTmp[$aTmp[0] + 1] $aDB = $aTmp EndFunc Func _DB_Add($sText, $fDuplicate = False) If Not $sText Then Return EndIf If Not $fDuplicate Then For $i = 1 To $aDB[0] If $aDB[$i] = $sText Then Return EndIf Next EndIf FileWriteLine($sDB_File, $sText) _GUICtrlComboBox_AddString($hCombo, $sText) _GUICtrlComboBox_SetEditText($hCombo, '') $aDB[0] += 1 ReDim $aDB[$aDB[0] + 1] $aDB[$aDB[0]] = $sText EndFunc Func _Edit_Changed() _GUICtrlComboBox_AutoComplete($iCombo) EndFunc Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg Local $hWndCombo = $hCombo Local $hWndFrom = $lParam Local $iIDFrom = BitAND($wParam, 0xFFFF) ; Low Word Local $iCode = BitShift($wParam, 16) ; Hi Word Switch $hWndFrom Case $iCombo, $hWndCombo Switch $iCode Case $CBN_EDITCHANGE _Edit_Changed() EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc |
|
------- Отправлено: 22:27, 22-04-2019 | #5 |
Старожил Сообщения: 398
|
Профиль | Сайт | Отправить PM | Цитировать |
------- Отправлено: 13:07, 29-04-2019 | #6 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата morgan1991:
|
|
------- Отправлено: 13:23, 29-04-2019 | #7 |
Старожил Сообщения: 398
|
Профиль | Сайт | Отправить PM | Цитировать Нашел на просторах:
; http://www.autoitscript.com/forum/topic/158070-autocomplete-input-text/ #include <GUIConstantsEx.au3> #include <WinAPI.au3> #include <ListBoxConstants.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> Global $Words1[20] = ["fight", "first", "fly", "third", "fire", "wall", "hi", "hello", "world", "window", _ "window 1", "window 2", "window 3", "window 4", "window 5", "window 6", "window 7", "window 8", "window 9", "window 10"] Global $Words2[6] = ["Alain", "Aline", "Bernard", "Beatrice", "Chloe", "Caroline"] Global $hGUI, $hList Global $sChosen, $idCurInput, $sCurrInput = "", $hListGUI = -1 $hGUI = GUICreate("AutoComplete Input Text", 300, 200) GUICtrlCreateLabel('lettres "w, f" ', 10, 10, 280, 20) $hInput = GUICtrlCreateInput("", 10, 40, 280, 20) GUICtrlCreateLabel('lettres "a, b, c" ', 10, 70, 280, 20) $hInput2 = GUICtrlCreateInput("", 10, 100, 280, 20) GUISetState(@SW_SHOW, $hGUI) GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam) Local $IdFrom = BitAnd($wParam, 0x0000FFFF) Local $iCode = BitShift($wParam, 16) Switch $IdFrom Case $hInput, $hInput2 Switch $iCode Case $EN_UPDATE $idCurInput = $IdFrom _Update($idCurInput) EndSwitch Case $hList _Update($idCurInput) EndSwitch Return $GUI_RUNDEFMSG EndFunc Func _Update($_input) If GUICtrlRead($_Input) <> $sCurrInput Then $sCurrInput = GUICtrlRead($_Input) If $hListGUI <> -1 Then ; List is visible. GUIDelete($hListGUI) $hListGUI = -1 EndIf Local $_array Switch $_input Case $hInput $_array = $Words1 Case $hInput2 $_array = $Words2 EndSwitch $hList = _PopupSelector($hGUI, $hListGUI, $_Input, _CheckInputText($_Input, $_array)) EndIf If $hList <> -1 Then $sChosen = GUICtrlRead($hList) If $sChosen <> "" Then GuiCtrlSetData($_Input, $sChosen) $sCurrInput = GUICtrlRead($_Input) GUIDelete($hListGUI) $hListGUI = -1 $sChosen = "" EndIf EndFunc Func _PopupSelector($hMainGUI, ByRef $hListGUI, $_Input, $sCurr_List) Local $hList = -1 If $sCurr_List = "" Then Return $hList Local $pos = ControlGetPos($hMainGUI, "", $_Input) $hListGUI = GUICreate("", 280, 160, $pos[0], $pos[1]+$pos[3], $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST, $WS_EX_MDICHILD), $hMainGUI) $hList = GUICtrlCreateList("", 0, 0, 280, 150, BitOR(0x00100000, 0x00200000)) StringReplace($sCurr_List, "|", "|") Local $iCurrHeight = @extended*GUICtrlSendMsg($hList, $LB_GETITEMHEIGHT, 0, 0)+10 WinMove($hListGUI, "", Default, Default, Default, $iCurrHeight) GUICtrlSetPos($hList, 0, 0, 150, $iCurrHeight) GUICtrlSetData($hList, $sCurr_List) GUISetControlsVisible($hListGUI) ; To Make Control Visible And Window Invisible. GUISetState(@SW_SHOWNOACTIVATE, $hListGUI) Return $hList EndFunc ;==>_PopupSelector Func _CheckInputText($_Input, $array) Local $sPartialData = "" $aSelected = _GetSelectionPointers($_Input) If (IsArray($aSelected)) And ($aSelected[0] <= $aSelected[1]) Then $sCurrInput = GUICtrlRead($_Input) Local $aSplit = StringSplit(StringLeft($sCurrInput, $aSelected[0]), " ") $aSelected[0] -= StringLen($aSplit[$aSplit[0]]) If $aSplit[$aSplit[0]] <> "" Then For $A = 0 To UBound($array)-1 If StringLeft($array[$A], StringLen($aSplit[$aSplit[0]])) = $aSplit[$aSplit[0]] _ And $array[$A] <> $aSplit[$aSplit[0]] Then $sPartialData &= $array[$A] & "|" EndIf Next EndIf EndIf Return $sPartialData EndFunc ;==>_CheckInputText Func _GetSelectionPointers($hEdit) Local $aReturn[2] = [0, 0] Local $aSelected = GUICtrlRecvMsg($hEdit, 0x00B0) ; $EM_GETSEL. If IsArray($aSelected) Then $aReturn[0] = $aSelected[0] $aReturn[1] = $aSelected[1] EndIf Return $aReturn EndFunc ;==>_GetSelectionPointers Func GUISetControlsVisible($hWnd) ; By Melba23. Local $aControlGetPos = 0, $hCreateRect = 0, $hRectRgn = _WinAPI_CreateRectRgn(0, 0, 0, 0) Local $iLastControlID = _WinAPI_GetDlgCtrlID(GUICtrlGetHandle(-1)) For $i = 3 To $iLastControlID $aControlGetPos = ControlGetPos($hWnd, '', $i) If IsArray($aControlGetPos) = 0 Then ContinueLoop $hCreateRect = _WinAPI_CreateRectRgn($aControlGetPos[0], $aControlGetPos[1], $aControlGetPos[0] + $aControlGetPos[2], $aControlGetPos[1] + $aControlGetPos[3]) _WinAPI_CombineRgn($hRectRgn, $hCreateRect, $hRectRgn, 2) _WinAPI_DeleteObject($hCreateRect) Next _WinAPI_SetWindowRgn($hWnd, $hRectRgn, True) _WinAPI_DeleteObject($hRectRgn) EndFunc ;==>GUISetControlsVisible Цитата Creat0R:
Теперь будет два варианта, может кому пригодится. |
|
------- Отправлено: 13:26, 29-04-2019 | #8 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
VBS/WSH/JS - поиск слова в тексте и вывод части текста после искомого слова | sergey23031978 | Скриптовые языки администрирования Windows | 9 | 18-02-2015 16:54 | |
2010 - Хочу все знать о WORD 2010 часть 6: выделение слова без пробела после слова | test2235 | Microsoft Office (Word, Excel, Outlook и т.д.) | 2 | 02-11-2013 22:20 | |
Похожие темы | Vadikan | О сайте и форуме | 9 | 16-12-2009 13:41 | |
EOF input[1] равняется началу input[2] | FADE | Вебмастеру | 6 | 30-06-2004 18:44 |
|