Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Похожие слова в input

Ответить
Настройки темы
[решено] Похожие слова в input

Аватара для morgan1991

Старожил


Сообщения: 390
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


Здравствуйте!
Нужно реализовать подсказки в поле ввода с похожими словами.
Т.е. допустим пользователь ввел предложение в поле ввода и нажал сохранить. Скрипт должен сохранить данные и одновременно как то использовать введенный текст. Например разбить на слова и внести в базу новые слова. А когда пользователь повторно начнет вводить данные в поле ввода, то скрипт будет искать слова в БД и выдавать подсказки, на которую можно нажать, что бы не вводить слово целиком. Как в excel.
Помогите хотя бы набросать алгоритм действий, остальное сам напишу. Единственное, у меня проблема с регулярными выражениями. Все никак не могу освоить...

-------
Хочу научиться писать драйвера на с++
Команда Grand Lions


Отправлено: 12:55, 15-04-2019

 

Ветеран


Contributor


Сообщения: 24303
Благодарности: 7064

Профиль | Отправить PM | Цитировать


В чём именно проблема?

Отправлено: 01:14, 16-04-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для morgan1991

Старожил


Сообщения: 390
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


Не могу продумать алгоритм, что бы получить максимальное быстродействие. Где хранить базу. И как вывести подсказку.

-------
Хочу научиться писать драйвера на с++
Команда Grand Lions


Отправлено: 07:03, 16-04-2019 | #3


Аватара для morgan1991

Старожил


Сообщения: 390
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


Что никто не знает? Хотя бы блок схему составить.

-------
Хочу научиться писать драйвера на с++
Команда Grand Lions


Отправлено: 14:43, 19-04-2019 | #4


Аватара для Creat0R

Must AutoIt


Moderator


Сообщения: 3034
Благодарности: 1000

Профиль | Сайт | Отправить 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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:27, 22-04-2019 | #5


Аватара для morgan1991

Старожил


Сообщения: 390
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


Creat0R, все классно. Спасибо. Единственное можно ли заменить
Код: Выделить весь код
GUICtrlCreateCombo
на
Код: Выделить весь код
GUICtrlCreateInput
?

-------
Хочу научиться писать драйвера на с++
Команда Grand Lions


Отправлено: 13:07, 29-04-2019 | #6


Аватара для Creat0R

Must AutoIt


Moderator


Сообщения: 3034
Благодарности: 1000

Профиль | Сайт | Отправить PM | Цитировать


Цитата morgan1991:
можно ли заменить »
Зачем?

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community


Отправлено: 13:23, 29-04-2019 | #7


Аватара для morgan1991

Старожил


Сообщения: 390
Благодарности: 13

Профиль | Сайт | Отправить 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:
Зачем? »
Не охота переделывать готовый код под GUICtrlCreateCombo.
Теперь будет два варианта, может кому пригодится.

-------
Хочу научиться писать драйвера на с++
Команда Grand Lions


Отправлено: 13:26, 29-04-2019 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Похожие слова в input

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход