Что нового

как сделать быстрый поиск в combobox с фильтром?

Пост номер 8 был отмечен как лучший ответ.

gideon

Новичок
Сообщения
20
Репутация
0
Всем доброго дня, с недавнего времени пытаюсь освоить auto it, подскажите как можно организовать быстрый поиск в combobox желательно с фильтром
на примере если ввести первые символы города
за ранее спасибо
Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 189, 173, 939, 521)
$Combo1 = GUICtrlCreateCombo("", 16, 24, 145, 25)
GUICtrlSetData($Combo1, "г.Москва|г.Санкт-петербур|г.Краснодар|г.Екатеринбург")
GUISetState(@SW_SHOW)
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd
 

xXx

╚{■_■}╗
Меценат
Сообщения
217
Репутация
80
Код:
#include <GuiComboBox.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

Global $iToolTip, $hForm1, $sComboData, $aArray, $sComboRead, $idCombo, $hCombo, $bCombo, $IdButton
Global $sComboDataDefault = 'Абакан|Азов|Александров|Алексин|Альметьевск|Анапа|Ангарск|Анжеро-Судженск|Апатиты|Арзамас|Армавир|Арсеньев|Артем|Архангельск|Асбест|' & _
        'Астрахань|Ачинск|Балаково|Балахна|Балашиха|Балашов|Барнаул|Батайск|Белгород|Белебей|Белово|Белогорск (Амурская область)|Белорецк|Белореченск|Бердск|' & _
        'Березники|Березовский (Свердловская область)|Бийск|Биробиджан|Благовещенск (Амурская область)|Бор|Борисоглебск|Боровичи|Братск|Брянск|Бугульма|' & _
        'Буденновск|Бузулук|Буйнакск|Великие Луки|Великий Новгород|Верхняя Пышма|Видное|Владивосток|Владикавказ|Владимир|Волгоград|Волгодонск|Волжск|Волжский|' & _
        'Вологда|Вольск|Воркута|Воронеж|Воскресенск|Воткинск|Всеволожск|Выборг|Выкса|Вязьма|Гатчина|Геленджик|Георгиевск|Глазов|Горно-Алтайск|Грозный|Губкин|' & _
        'Гудермес|Гуково|Гусь-Хрустальный|Дербент|Дзержинск|Димитровград|Дмитров|Долгопрудный|Домодедово|Донской|Дубна|Евпатория|Егорьевск|Ейск|Екатеринбург|' & _
        'Елабуга|Елец|Ессентуки|Железногорск (Красноярский край)|Железногорск (Курская область)|Жигулевск|Жуковский|Заречный|Зеленогорск|Зеленодольск|Златоуст|' & _
        'Иваново|Ивантеевка|Ижевск|Избербаш|Иркутск|Искитим|Ишим|Ишимбай|Йошкар-Ола|Казань|Калининград|Калуга|Каменск-Уральский|Каменск-Шахтинский|Камышин|Канск|' & _
        'Каспийск|Кемерово|Керчь|Кинешма|Кириши|Киров (Кировская область)|Кирово-Чепецк|Киселевск|Кисловодск|Клин|Клинцы|Ковров|Когалым|Коломна|Комсомольск-на-Амуре|' & _
        'Копейск|Королев|Кострома|Котлас|Красногорск|Краснодар|Краснокаменск|Краснокамск|Краснотурьинск|Красноярск|Кропоткин|Крымск|Кстово|Кузнецк|Кумертау|Кунгур|' & _
        'Курган|Курск|Кызыл|Лабинск|Лениногорск|Ленинск-Кузнецкий|Лесосибирск|Липецк|Лиски|Лобня|Лысьва|Лыткарино|Люберцы|Магадан|Магнитогорск|Майкоп|Махачкала|' & _
        'Междуреченск|Мелеуз|Миасс|Минеральные Воды|Минусинск|Михайловка|Михайловск (Ставропольский край)|Мичуринск|Москва|Мурманск|Муром|Мытищи|Набережные Челны|' & _
        'Назарово|Назрань|Нальчик|Наро-Фоминск|Находка|Невинномысск|Нерюнгри|Нефтекамск|Нефтеюганск|Нижневартовск|Нижнекамск|Нижний Новгород|Нижний Тагил|Новоалтайск|' & _
        'Новокузнецк|Новокуйбышевск|Новомосковск|Новороссийск|Новосибирск|Новотроицк|Новоуральск|Новочебоксарск|Новочеркасск|Новошахтинск|Новый Уренгой|Ногинск|' & _
        'Норильск|Ноябрьск|Нягань|Обнинск|Одинцово|Озерск (Челябинская область)|Октябрьский|Омск|Орел|Оренбург|Орехово-Зуево|Орск|Павлово|Павловский Посад|Пенза|' & _
        'Первоуральск|Пермь|Петрозаводск|Петропавловск-Камчатский|Подольск|Полевской|Прокопьевск|Прохладный|Псков|Пушкино|Пятигорск|Раменское|Ревда|Реутов|Ржев|' & _
        'Рославль|Россошь|Ростов-на-Дону|Рубцовск|Рыбинск|Рязань|Салават|Сальск|Самара|Санкт-Петербург|Саранск|Сарапул|Саратов|Саров|Свободный|Севастополь|Северодвинск|' & _
        'Северск|Сергиев Посад|Серов|Серпухов|Сертолово|Сибай|Симферополь|Славянск-на-Кубани|Смоленск|Соликамск|Солнечногорск|Сосновый Бор|Сочи|Ставрополь|Старый Оскол|' & _
        'Стерлитамак|Ступино|Сургут|Сызрань|Сыктывкар|Таганрог|Тамбов|Тверь|Тимашевск|Тихвин|Тихорецк|Тобольск|Тольятти|Томск|Троицк|Туапсе|Туймазы|Тула|Тюмень|Узловая|' & _
        'Улан-Удэ|Ульяновск|Урус-Мартан|Усолье-Сибирское|Уссурийск|Усть-Илимск|Уфа|Ухта|Феодосия|Фрязино|Хабаровск|Ханты-Мансийск|Хасавюрт|Химки|Чайковский|Чапаевск|' & _
        'Чебоксары|Челябинск|Черемхово|Череповец|Черкесск|Черногорск|Чехов|Чистополь|Чита|Шадринск|Шали|Шахты|Шуя|Щекино|Щелково|Электросталь|Элиста|Энгельс|Южно-Сахалинск|' & _
        'Юрга|Якутск|Ялта|Ярославль'

$hForm1 = GUICreate('Form1', 189, 173);, 939, 521)
$idCombo = GUICtrlCreateCombo('', 16, 24, 145, 25)
$hCombo = GUICtrlGetHandle(-1)
GUICtrlSetData(-1, $sComboDataDefault)
$IdButton = GUICtrlCreateButton('Что Выбрал', 56, 104, 75, 25)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')

While 1
    If $bCombo Then
        $sComboRead = GUICtrlRead($idCombo)
        $aArray = StringRegExp('|' & $sComboDataDefault & '|', '(?i)\|(' & StringRegExpReplace($sComboRead, '([^А-яЁё\w\s])', '\\$1') & '[^|]*?)\|', 3)
        If Not @error Then
            For $i = 0 To UBound($aArray) - 1
                $sComboData &= '|' & $aArray[$i]
            Next
            GUICtrlSetData($idCombo, $sComboData)
            _GUICtrlComboBox_ReplaceEditSel($hCombo, $sComboRead)
        Else
            GUICtrlSetData($idCombo, $sComboDataDefault)
        EndIf
        $sComboData = ''
        $bCombo = False
    EndIf

    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $IdButton
            $sComboRead = GUICtrlRead($idCombo)
            If Not StringStripWS($sComboRead, 8) Then
                $aPos = WinGetPos($hForm1)
                $iToolTip = ToolTip('выберите значение из выпадающего списка', $aPos[0] + 16 + 145, $aPos[1] + 24 + 25 + 25, '', 1, 1 + 2 + 4)
                ContinueLoop
            EndIf
            MsgBox(262144, 'Что Выбрал:', $sComboRead, 1)
        Case $GUI_EVENT_MOUSEMOVE
            If $iToolTip Then ToolTip('')
    EndSwitch
WEnd

; -------------------------------------------------------------
Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    If ($lParam = $hCombo) And (BitShift($wParam, 16) = 6) Then $bCombo = True
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_COMMAND

К сведению: при вводе первых символов в Edit-поле ComboBox автоматически сам ищет и выделяет результат в своем списке.
Также, дополнительно смотрите функции _GUICtrlComboBox... и _GUICtrlComboBoxEx...
 
Последнее редактирование:
Автор
G

gideon

Новичок
Сообщения
20
Репутация
0
Код:
#include <GuiComboBox.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

Global $iToolTip, $hForm1, $sComboData, $aArray, $sComboRead, $idCombo, $hCombo, $bCombo, $IdButton
Global $sComboDataDefault = 'Абакан|Азов|Александров|Алексин|Альметьевск|Анапа|Ангарск|Анжеро-Судженск|Апатиты|Арзамас|Армавир|Арсеньев|Артем|Архангельск|Асбест|' & _
        'Астрахань|Ачинск|Балаково|Балахна|Балашиха|Балашов|Барнаул|Батайск|Белгород|Белебей|Белово|Белогорск (Амурская область)|Белорецк|Белореченск|Бердск|' & _
        'Березники|Березовский (Свердловская область)|Бийск|Биробиджан|Благовещенск (Амурская область)|Бор|Борисоглебск|Боровичи|Братск|Брянск|Бугульма|' & _
        'Буденновск|Бузулук|Буйнакск|Великие Луки|Великий Новгород|Верхняя Пышма|Видное|Владивосток|Владикавказ|Владимир|Волгоград|Волгодонск|Волжск|Волжский|' & _
        'Вологда|Вольск|Воркута|Воронеж|Воскресенск|Воткинск|Всеволожск|Выборг|Выкса|Вязьма|Гатчина|Геленджик|Георгиевск|Глазов|Горно-Алтайск|Грозный|Губкин|' & _
        'Гудермес|Гуково|Гусь-Хрустальный|Дербент|Дзержинск|Димитровград|Дмитров|Долгопрудный|Домодедово|Донской|Дубна|Евпатория|Егорьевск|Ейск|Екатеринбург|' & _
        'Елабуга|Елец|Ессентуки|Железногорск (Красноярский край)|Железногорск (Курская область)|Жигулевск|Жуковский|Заречный|Зеленогорск|Зеленодольск|Златоуст|' & _
        'Иваново|Ивантеевка|Ижевск|Избербаш|Иркутск|Искитим|Ишим|Ишимбай|Йошкар-Ола|Казань|Калининград|Калуга|Каменск-Уральский|Каменск-Шахтинский|Камышин|Канск|' & _
        'Каспийск|Кемерово|Керчь|Кинешма|Кириши|Киров (Кировская область)|Кирово-Чепецк|Киселевск|Кисловодск|Клин|Клинцы|Ковров|Когалым|Коломна|Комсомольск-на-Амуре|' & _
        'Копейск|Королев|Кострома|Котлас|Красногорск|Краснодар|Краснокаменск|Краснокамск|Краснотурьинск|Красноярск|Кропоткин|Крымск|Кстово|Кузнецк|Кумертау|Кунгур|' & _
        'Курган|Курск|Кызыл|Лабинск|Лениногорск|Ленинск-Кузнецкий|Лесосибирск|Липецк|Лиски|Лобня|Лысьва|Лыткарино|Люберцы|Магадан|Магнитогорск|Майкоп|Махачкала|' & _
        'Междуреченск|Мелеуз|Миасс|Минеральные Воды|Минусинск|Михайловка|Михайловск (Ставропольский край)|Мичуринск|Москва|Мурманск|Муром|Мытищи|Набережные Челны|' & _
        'Назарово|Назрань|Нальчик|Наро-Фоминск|Находка|Невинномысск|Нерюнгри|Нефтекамск|Нефтеюганск|Нижневартовск|Нижнекамск|Нижний Новгород|Нижний Тагил|Новоалтайск|' & _
        'Новокузнецк|Новокуйбышевск|Новомосковск|Новороссийск|Новосибирск|Новотроицк|Новоуральск|Новочебоксарск|Новочеркасск|Новошахтинск|Новый Уренгой|Ногинск|' & _
        'Норильск|Ноябрьск|Нягань|Обнинск|Одинцово|Озерск (Челябинская область)|Октябрьский|Омск|Орел|Оренбург|Орехово-Зуево|Орск|Павлово|Павловский Посад|Пенза|' & _
        'Первоуральск|Пермь|Петрозаводск|Петропавловск-Камчатский|Подольск|Полевской|Прокопьевск|Прохладный|Псков|Пушкино|Пятигорск|Раменское|Ревда|Реутов|Ржев|' & _
        'Рославль|Россошь|Ростов-на-Дону|Рубцовск|Рыбинск|Рязань|Салават|Сальск|Самара|Санкт-Петербург|Саранск|Сарапул|Саратов|Саров|Свободный|Севастополь|Северодвинск|' & _
        'Северск|Сергиев Посад|Серов|Серпухов|Сертолово|Сибай|Симферополь|Славянск-на-Кубани|Смоленск|Соликамск|Солнечногорск|Сосновый Бор|Сочи|Ставрополь|Старый Оскол|' & _
        'Стерлитамак|Ступино|Сургут|Сызрань|Сыктывкар|Таганрог|Тамбов|Тверь|Тимашевск|Тихвин|Тихорецк|Тобольск|Тольятти|Томск|Троицк|Туапсе|Туймазы|Тула|Тюмень|Узловая|' & _
        'Улан-Удэ|Ульяновск|Урус-Мартан|Усолье-Сибирское|Уссурийск|Усть-Илимск|Уфа|Ухта|Феодосия|Фрязино|Хабаровск|Ханты-Мансийск|Хасавюрт|Химки|Чайковский|Чапаевск|' & _
        'Чебоксары|Челябинск|Черемхово|Череповец|Черкесск|Черногорск|Чехов|Чистополь|Чита|Шадринск|Шали|Шахты|Шуя|Щекино|Щелково|Электросталь|Элиста|Энгельс|Южно-Сахалинск|' & _
        'Юрга|Якутск|Ялта|Ярославль'

$hForm1 = GUICreate('Form1', 189, 173);, 939, 521)
$idCombo = GUICtrlCreateCombo('', 16, 24, 145, 25)
$hCombo = GUICtrlGetHandle(-1)
GUICtrlSetData(-1, $sComboDataDefault)
$IdButton = GUICtrlCreateButton('Что Выбрал', 56, 104, 75, 25)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')

While 1
    If $bCombo Then
        $sComboRead = GUICtrlRead($idCombo)
        $aArray = StringRegExp('|' & $sComboDataDefault & '|', '(?i)\|(' & StringRegExpReplace($sComboRead, '([^А-яЁё\w\s])', '\\$1') & '[^|]*?)\|', 3)
        If Not @error Then
            For $i = 0 To UBound($aArray) - 1
                $sComboData &= '|' & $aArray[$i]
            Next
            GUICtrlSetData($idCombo, $sComboData)
            _GUICtrlComboBox_ReplaceEditSel($hCombo, $sComboRead)
        Else
            GUICtrlSetData($idCombo, $sComboDataDefault)
        EndIf
        $sComboData = ''
        $bCombo = False
    EndIf

    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $IdButton
            $sComboRead = GUICtrlRead($idCombo)
            If Not StringStripWS($sComboRead, 8) Then
                $aPos = WinGetPos($hForm1)
                $iToolTip = ToolTip('выберите значение из выпадающего списка', $aPos[0] + 16 + 145, $aPos[1] + 24 + 25 + 25, '', 1, 1 + 2 + 4)
                ContinueLoop
            EndIf
            MsgBox(262144, 'Что Выбрал:', $sComboRead, 1)
        Case $GUI_EVENT_MOUSEMOVE
            If $iToolTip Then ToolTip('')
    EndSwitch
WEnd

; -------------------------------------------------------------
Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    If ($lParam = $hCombo) And (BitShift($wParam, 16) = 6) Then $bCombo = True
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_COMMAND

К сведению: при вводе первых символов в Edit-поле ComboBox автоматически сам ищет и выделяет результат в своем списке.
Также, дополнительно смотрите функции _GUICtrlComboBox... и _GUICtrlComboBoxEx...
спасибо, то что нужно)
Сообщение автоматически объединено:

подскажите ещё
попробовал применить с двухмерным массивом, но что то пошло не так после применения поиска
к примеру,если не применять поиск "первый" приравневается к "1" как и задумано если воспользоваться поиском то всё ломается
Код:
#include <GuiComboBox.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

Global $iToolTip, $hForm1, $sComboData, $aArray, $sComboRead, $idCombo, $hCombo, $bCombo, $IdButton, $test1
Global $atest[7][2]= [ _
        [10, 12], _
        [ 'шестой', 6], _
        [ 'пятый', 5], _
        [ 'четвёртый', 4], _
        [ 'третий', 3], _
        [ 'второй', 2], _
        [ 'первый',1]], $stest

$hForm1 = GUICreate('Form1', 189, 173);, 939, 521)
$idCombo = GUICtrlCreateCombo('', 16, 24, 145, 25)
$hCombo = GUICtrlGetHandle(-1)
For $i = 1 To UBound($atest) - 1
    $sprioritet &= $atest[$i][0] & '|'
Next
GUICtrlSetData(-1, $stest )
$list=($stest)
$sprioritet = ''
;~ MsgBox(262144, 'Что Выбрал:',$list)



;~ GUICtrlSetData(-1, $sComboDataDefault)
$IdButton = GUICtrlCreateButton('Что Выбрал', 56, 104, 75, 25)
$Label= GUICtrlCreateLabel("test", 16, 50, 75, 25)
;~ GUICtrlSetData($Label, $idCombo)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')

While 1
    If $bCombo Then
        $sComboRead = GUICtrlRead($idCombo)
        $aArray = StringRegExp($list & '|', '(?i)\|(' & StringRegExpReplace($sComboRead, '([^А-яЁё\w\s])', '\\$1') & '[^|]*?)\|', 3)
        If Not @error Then
            For $i = 0 To UBound($aArray) - 1
                $sComboData &= '|' & $aArray[$i]
            Next
            GUICtrlSetData($idCombo, $sComboData)
            _GUICtrlComboBox_ReplaceEditSel($hCombo, $sComboRead)
        Else
            GUICtrlSetData($idCombo, $list)
        EndIf
        $sComboData = ''
        $bCombo = False
    EndIf

    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $IdButton
$Index = GUICtrlSendMsg($idCombo, $CB_GETCURSEL, 0, 0)
            $Index += 1
            GUICtrlSetData($Label, $atest[$Index][1])
    EndSwitch
WEnd

; -------------------------------------------------------------
Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    If ($lParam = $hCombo) And (BitShift($wParam, 16) = 6) Then $bCombo = True
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_COMMAND
 
Последнее редактирование:

xXx

╚{■_■}╗
Меценат
Сообщения
217
Репутация
80
... но что то пошло не так...
Вы из массива $atest[][] создаете строку $stest для того чтобы использовать в GUICtrlSetData(-1, $stest) - это логично. Массив $atest[][] есть величина постоянная и его индексы тоже, что не скажешь о строке: при работе поиска скрипта она постоянно меняется, и при этом меняется и сам список $idCombo, а соответственно меняются и его индексы. Что же делаете вы:
Код:
Case $IdButton
    $Index = GUICtrlSendMsg($idCombo, $CB_GETCURSEL, 0, 0) ; Возвращает индекс выбранного пункта
    $Index += 1
    GUICtrlSetData($Label, $atest[$Index][1]) ; Индекс ТЕКУЩЕГО СПИСКА
Так не годится. Для того чтобы связать текущие показания $idCombo с $atest[][] нужно использовать поиск по массиву:
Код:
#include <GuiComboBox.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

Global $stest, $Index, $iToolTip, $hForm1, $sComboData, $aArray, $sComboRead, $idCombo, $hCombo, $bCombo, $IdButton, $test1
Global $atest[7][2] = [[10, "Надо выбрать"], _
        ['шестой', 6], _
        ['пятый', 5], _
        ['четвёртый', 4], _
        ['третий', 3], _
        ['второй', 2], _
        ['первый', 1]]

$hForm1 = GUICreate('Form1', 189, 173);, 939, 521)
$idCombo = GUICtrlCreateCombo('', 16, 24, 145, 25)
$hCombo = GUICtrlGetHandle(-1)
For $i = 1 To UBound($atest) - 1
    $stest &= '|' & $atest[$i][0]
Next
GUICtrlSetData(-1, $stest)

$IdButton = GUICtrlCreateButton('Что Выбрал', 56, 104, 75, 25)
$Label = GUICtrlCreateLabel('', 16, 50, 75, 25)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')

While 1
    If $bCombo Then
        $sComboRead = GUICtrlRead($idCombo)
        If StringStripWS($sComboRead, 8) Then ; Если в поле ввода не пусто
            $aArray = StringRegExp($stest & '|', '(?i)\|(' & StringRegExpReplace($sComboRead, '([^А-яЁё\w\s])', '\\$1') & '[^|]*?)\|', 3)
            If Not @error Then
                For $i = 0 To UBound($aArray) - 1
                    $sComboData &= '|' & $aArray[$i]
                Next
                GUICtrlSetData($idCombo, $sComboData)
            Else
                GUICtrlSetData($idCombo, $stest) ; Восстанавливаем список
            EndIf
            _GUICtrlComboBox_ReplaceEditSel($hCombo, $sComboRead) ; текст в поле ввода
            $sComboData = ''
            $bCombo = False
        Else
            GUICtrlSetData($idCombo, $stest) ; Восстанавливаем список
        EndIf
    EndIf

    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $IdButton
            $sComboRead = GUICtrlRead($idCombo) ; Считываем поле ввода
            $Index = 0
            For $i = 1 To UBound($atest) - 1
                If Not StringCompare($sComboRead, $atest[$i][0]) Then ; Ищем в массиве соответствие
                    $Index = $i
                    ExitLoop
                EndIf
            Next
            GUICtrlSetData($Label, $atest[$Index][1])
    EndSwitch
WEnd

; -------------------------------------------------------------
Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    If ($lParam = $hCombo) And (BitShift($wParam, 16) = 6) Then $bCombo = True
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_COMMAND
 
Последнее редактирование:
Автор
G

gideon

Новичок
Сообщения
20
Репутация
0
Вы из массива $atest[][] создаете строку $stest для того чтобы использовать в GUICtrlSetData(-1, $stest) - это логично. Массив $atest[][] есть величина постоянная и его индексы тоже, что не скажешь о строке: при работе поиска скрипта она постоянно меняется, и при этом меняется и сам список $idCombo, а соответственно меняются и его индексы. Что же делаете вы:
Код:
Case $IdButton
    $Index = GUICtrlSendMsg($idCombo, $CB_GETCURSEL, 0, 0) ; Возвращает индекс выбранного пункта
    $Index += 1
    GUICtrlSetData($Label, $atest[$Index][1]) ; Индекс ТЕКУЩЕГО СПИСКА
Так не годится. Для того чтобы связать текущие показания $idCombo с $atest[][] нужно использовать поиск по массиву:
Код:
#include <GuiComboBox.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

Global $stest, $Index, $iToolTip, $hForm1, $sComboData, $aArray, $sComboRead, $idCombo, $hCombo, $bCombo, $IdButton, $test1
Global $atest[7][2] = [[10, "Надо выбрать"], _
        ['шестой', 6], _
        ['пятый', 5], _
        ['четвёртый', 4], _
        ['третий', 3], _
        ['второй', 2], _
        ['первый', 1]]

$hForm1 = GUICreate('Form1', 189, 173);, 939, 521)
$idCombo = GUICtrlCreateCombo('', 16, 24, 145, 25)
$hCombo = GUICtrlGetHandle(-1)
For $i = 1 To UBound($atest) - 1
    $stest &= '|' & $atest[$i][0]
Next
GUICtrlSetData(-1, $stest)

$IdButton = GUICtrlCreateButton('Что Выбрал', 56, 104, 75, 25)
$Label = GUICtrlCreateLabel('', 16, 50, 75, 25)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')

While 1
    If $bCombo Then
        $sComboRead = GUICtrlRead($idCombo)
        If StringStripWS($sComboRead, 8) Then ; Если в поле ввода пусто
            $aArray = StringRegExp($stest & '|', '(?i)\|(' & StringRegExpReplace($sComboRead, '([^А-яЁё\w\s])', '\\$1') & '[^|]*?)\|', 3)
            If Not @error Then
                For $i = 0 To UBound($aArray) - 1
                    $sComboData &= '|' & $aArray[$i]
                Next
                GUICtrlSetData($idCombo, $sComboData)
            Else
                GUICtrlSetData($idCombo, $stest) ; Восстанавливаем список
            EndIf
            _GUICtrlComboBox_ReplaceEditSel($hCombo, $sComboRead) ; текст в поле ввода
            $sComboData = ''
            $bCombo = False
        Else
            GUICtrlSetData($idCombo, $stest) ; Восстанавливаем список
        EndIf
    EndIf

    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $IdButton
            $sComboRead = GUICtrlRead($idCombo) ; Считываем поле ввода
            $Index = 0
            For $i = 1 To UBound($atest) - 1
                If Not StringCompare($sComboRead, $atest[$i][0]) Then ; Ищем в массиве соответствие
                    $Index = $i
                    ExitLoop
                EndIf
            Next
            GUICtrlSetData($Label, $atest[$Index][1])
    EndSwitch
WEnd

; -------------------------------------------------------------
Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    If ($lParam = $hCombo) And (BitShift($wParam, 16) = 6) Then $bCombo = True
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_COMMAND
вы просто Гуру)))
Сообщение автоматически объединено:

вы просто Гуру)))
можете ещё подсказать на примере как правильно привязать клавишу "tab" к GUICtrlCreateCombo
 
Последнее редактирование:
Автор
G

gideon

Новичок
Сообщения
20
Репутация
0
Вы из массива $atest[][] создаете строку $stest для того чтобы использовать в GUICtrlSetData(-1, $stest) - это логично. Массив $atest[][] есть величина постоянная и его индексы тоже, что не скажешь о строке: при работе поиска скрипта она постоянно меняется, и при этом меняется и сам список $idCombo, а соответственно меняются и его индексы. Что же делаете вы:
Код:
Case $IdButton
    $Index = GUICtrlSendMsg($idCombo, $CB_GETCURSEL, 0, 0) ; Возвращает индекс выбранного пункта
    $Index += 1
    GUICtrlSetData($Label, $atest[$Index][1]) ; Индекс ТЕКУЩЕГО СПИСКА
Так не годится. Для того чтобы связать текущие показания $idCombo с $atest[][] нужно использовать поиск по массиву:
Код:
#include <GuiComboBox.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

Global $stest, $Index, $iToolTip, $hForm1, $sComboData, $aArray, $sComboRead, $idCombo, $hCombo, $bCombo, $IdButton, $test1
Global $atest[7][2] = [[10, "Надо выбрать"], _
        ['шестой', 6], _
        ['пятый', 5], _
        ['четвёртый', 4], _
        ['третий', 3], _
        ['второй', 2], _
        ['первый', 1]]

$hForm1 = GUICreate('Form1', 189, 173);, 939, 521)
$idCombo = GUICtrlCreateCombo('', 16, 24, 145, 25)
$hCombo = GUICtrlGetHandle(-1)
For $i = 1 To UBound($atest) - 1
    $stest &= '|' & $atest[$i][0]
Next
GUICtrlSetData(-1, $stest)

$IdButton = GUICtrlCreateButton('Что Выбрал', 56, 104, 75, 25)
$Label = GUICtrlCreateLabel('', 16, 50, 75, 25)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')

While 1
    If $bCombo Then
        $sComboRead = GUICtrlRead($idCombo)
        If StringStripWS($sComboRead, 8) Then ; Если в поле ввода пусто
            $aArray = StringRegExp($stest & '|', '(?i)\|(' & StringRegExpReplace($sComboRead, '([^А-яЁё\w\s])', '\\$1') & '[^|]*?)\|', 3)
            If Not @error Then
                For $i = 0 To UBound($aArray) - 1
                    $sComboData &= '|' & $aArray[$i]
                Next
                GUICtrlSetData($idCombo, $sComboData)
            Else
                GUICtrlSetData($idCombo, $stest) ; Восстанавливаем список
            EndIf
            _GUICtrlComboBox_ReplaceEditSel($hCombo, $sComboRead) ; текст в поле ввода
            $sComboData = ''
            $bCombo = False
        Else
            GUICtrlSetData($idCombo, $stest) ; Восстанавливаем список
        EndIf
    EndIf

    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $IdButton
            $sComboRead = GUICtrlRead($idCombo) ; Считываем поле ввода
            $Index = 0
            For $i = 1 To UBound($atest) - 1
                If Not StringCompare($sComboRead, $atest[$i][0]) Then ; Ищем в массиве соответствие
                    $Index = $i
                    ExitLoop
                EndIf
            Next
            GUICtrlSetData($Label, $atest[$Index][1])
    EndSwitch
WEnd

; -------------------------------------------------------------
Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    If ($lParam = $hCombo) And (BitShift($wParam, 16) = 6) Then $bCombo = True
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_COMMAND
я добавил Sleep(2500), либо после поиска невозможно выбрать что то вручную, или ли другой способ?
Код:
While 1
    If $bCombo Then
        $sComboRead = GUICtrlRead($idCombo)
        If StringStripWS($sComboRead, 8) Then ; Если в поле ввода пусто
            $aArray = StringRegExp($stest & '|', '(?i)\|(' & StringRegExpReplace($sComboRead, '([^А-яЁё\w\s])', '\\$1') & '[^|]*?)\|', 3)
            If Not @error Then
                For $i = 0 To UBound($aArray) - 1
                    $sComboData &= '|' & $aArray[$i]
                Next
                GUICtrlSetData($idCombo, $sComboData)
            Else
                GUICtrlSetData($idCombo, $stest) ; Восстанавливаем список
            EndIf
            _GUICtrlComboBox_ReplaceEditSel($hCombo, $sComboRead) ; текст в поле ввода
            $sComboData = ''
            $bCombo = False
        Else
            GUICtrlSetData($idCombo, $stest) ; Восстанавливаем список
            Sleep(2500)
        EndIf
 
Последнее редактирование:

xXx

╚{■_■}╗
Меценат
Сообщения
217
Репутация
80
... поиск по части слова не по первым символам
Вот вариант:
Код:
#include <GuiComboBox.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

Global $stest, $Index, $iToolTip, $hForm1, $sComboData, $aArray, $sComboRead, $idCombo, $hCombo, $bCombo, $IdButton, $test1
Global $atest[7][2] = [[10, "Надо выбрать"], _
        ['шестой', 6], _
        ['пятый', 5], _
        ['четвёртый', 4], _
        ['третий', 3], _
        ['второй', 2], _
        ['первый', 1]]

$hForm1 = GUICreate('Form1', 189, 173);, 939, 521)
$idCombo = GUICtrlCreateCombo('', 16, 24, 145, 25)
$hCombo = GUICtrlGetHandle(-1)
For $i = 1 To UBound($atest) - 1
    $stest &= '|' & $atest[$i][0]
Next
GUICtrlSetData(-1, $stest)

$IdButton = GUICtrlCreateButton('Что Выбрал', 56, 104, 75, 25)
$Label = GUICtrlCreateLabel('', 16, 50, 75, 25)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')

While 1
    If $bCombo Then
        $sComboRead = GUICtrlRead($idCombo)
        $aArray = StringRegExp($stest & '|', '(?i)([^|]*' & StringRegExpReplace($sComboRead, '([^А-яЁё\w\s])', '\\$1') & '[^|]*)', 3)
        If Not @error Then
            For $i = 0 To UBound($aArray) - 1
                If $aArray[$i] Then $sComboData &= '|' & $aArray[$i]
            Next
            GUICtrlSetData($idCombo, $sComboData)
        Else
            GUICtrlSetData($idCombo, $stest) ; Восстанавливаем список
        EndIf
        _GUICtrlComboBox_ReplaceEditSel($hCombo, $sComboRead) ; текст в поле ввода
        $sComboData = ''
        $bCombo = False
    EndIf

    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $IdButton
            $sComboRead = GUICtrlRead($idCombo) ; Считываем поле ввода
            $Index = 0
            For $i = 1 To UBound($atest) - 1
                If Not StringCompare($sComboRead, $atest[$i][0]) Then ; Ищем в массиве соответствие
                    $Index = $i
                    ExitLoop
                EndIf
            Next
            GUICtrlSetData($Label, $atest[$Index][1])
    EndSwitch
WEnd

; -------------------------------------------------------------
Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    If ($lParam = $hCombo) And (BitShift($wParam, 16) = 6) Then $bCombo = True
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_COMMAND
 
Верх