Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Как реализовать в скрипте возможность автозаполнения (http://forum.oszone.net/showthread.php?t=152108)

evg64 02-10-2009 15:40 1232799

Как реализовать в скрипте возможность автозаполнения
 
Добрый день! Дело вот в чем: когда в строке гугл вводишь начало слова, всплывает подсказка, где можно выбрать различные варианты продолжения слова/фразы. Как такую же вещь реализовать в скрипте? К примеру, как нужно дополнить нижеследующий скрипт, чтобы при вводе символа, с которого начинается хоть 1 элемент массива (цифр 1, 2, 3 или 4), всплывала подсказка с вариантом окончания (в подсказке должен содержаться сам элемент массива, то есть одно из 111, 222, 333, 444):

Код:

#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $Array[4] = [111, 222, 333, 444]

$Form1 = GUICreate("Form1", 511, 137, 192, 124)
$Input1 = GUICtrlCreateInput("Введите что-нибудь", 144, 40, 145, 21)
GUISetState(@SW_SHOW)

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit

        EndSwitch
WEnd


Creat0R 02-10-2009 15:52 1232806

Это называется автозаполнение.

См. в справке пример к функции _GUICtrlComboBox_AutoComplete.

Тему переименовал.

evg64 02-10-2009 16:06 1232825

Я не совсем это имел в виду. Когда вводишь часть слова, под полем ввода должно появиться окно с различными вариантами продолжения (точь-в-точь как в гугле). _GUICtrlComboBox_AutoComplete заполняет поле, а не предлагает всевозможные варианты.

Вот чуточку подправленный тот же код, но теперь при вводе 1,2,3 или 4 должно появляться окошко с двумя вариантами продолжения:

Код:

#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $Array[8] = [111, 1111, 222, 2222, 333, 3333, 444, 4444]

$Form1 = GUICreate("Form1", 511, 137, 192, 124)
$Input1 = GUICtrlCreateInput("Введите что-нибудь", 144, 40, 145, 21)
GUISetState(@SW_SHOW)

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit

        EndSwitch
WEnd

P.S. Такая же штука и в Scite всплывает, когда начинаешь вводить имя какой-нибудь встроенной функции.

Creat0R 02-10-2009 17:28 1232892

Цитата:

Цитата evg64
Я не совсем это имел в виду. Когда вводишь часть слова, под полем ввода должно появиться окно с различными вариантами продолжения »

Вот примерно так (есть мелкие баги, на их исправление пока не хватило времени):

Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIComboBox.au3>
;

Global $aAutoComplete_Array[8] = ["abc", "абв", 111, 222, 333]
Global $iSetAutoComplete = 0

$Form1 = GUICreate("Form1", 511, 137, 192, 124)

$nCombo = GUICtrlCreateCombo("Введите что-нибудь", 140, 40, 140, 50)
$hCombo = GUICtrlGetHandle(-1)

$nCaseSense_CheckBox = GUICtrlCreateCheckbox("Учитывать регистр букв", 140, 15, -1, 15)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch

    If $iSetAutoComplete Then
        $iSetAutoComplete = 0

        GUIRegisterMsg($WM_COMMAND, "")
        $iCaseSense = Number(GUICtrlRead($nCaseSense_CheckBox) = $GUI_CHECKED)
        _GUICtrlCombo_SetAutoComplete($hCombo, $aAutoComplete_Array, $iCaseSense)
        GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    EndIf
WEnd

Func _GUICtrlCombo_SetAutoComplete($hCombo, ByRef $avArray, $iCaseSense=0)
    Local $sEdit_Text = _GUICtrlComboBox_GetEditText($hCombo)
    If $sEdit_Text = "" Then Return SetError(1, 0, 0)

    Local $iEdit_Text_Len = StringLen($sEdit_Text)

    _GUICtrlComboBox_ResetContent($hCombo)
    _GUICtrlComboBox_SetEditText($hCombo, $sEdit_Text)

    For $i = 0 To UBound($avArray)-1
        If StringCompare(StringLeft($avArray[$i], $iEdit_Text_Len), $sEdit_Text, $iCaseSense) = 0 Then _
            GUICtrlSetData($nCombo, $avArray[$i], "")
    Next

    If _GUICtrlComboBox_GetList($hCombo) <> "" Then
        _GUICtrlComboBox_ShowDropDown($hCombo, True)
        _GUICtrlComboBox_SetEditText($hCombo, $sEdit_Text)
    EndIf
EndFunc

Func WM_COMMAND($hWnd, $nMsg, $wParam, $lParam)
    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0xFFFF)
    Local $hCtrl = $lParam

    Switch $nID
        Case $nCombo
            Switch $nNotifyCode
                Case $CBN_EDITCHANGE, $CBN_EDITUPDATE
                    $iSetAutoComplete
= 1
                Case $CBN_SELENDOK, $CBN_CLOSEUP

                Case $CBN_KILLFOCUS, $CBN_SELENDCANCEL
                    Local $sEdit_Text = _GUICtrlComboBox_GetEditText($hCombo)
                    _GUICtrlComboBox_ResetContent($hCombo)
                    _GUICtrlComboBox_SetEditText($hCombo, $sEdit_Text)
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc


evg64 02-10-2009 23:29 1233136

Класс! Здорово работает!
Если можно, опишите вкратце принцип работы, а то сам никак не пойму)

Как можно убрать чувствительность к регистру при вводе на русском языке?

Creat0R 03-10-2009 20:07 1233827

Цитата:

Цитата evg64
Как можно убрать чувствительность к регистру при вводе на русском языке? »

Поправил.


Время: 00:46.

Время: 00:46.
© OSzone.net 2001-