Автор Тема: [Элементы GUI] Поиск в ListBox при наборе текста не с начала строки  (Прочитано 3544 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн $k!NNeR [?]

  • Новичок
  • *
  • Сообщений: 5
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.2.8.1
Версия AutoIt: 3.3.8.1

Описание: Создаю GUI с ListBox'ом. Данные в ListBox заносятся из файла. Нужна функция поиска в ListBox'е при наборе текста.
Примечания: Есть функция  _GUICtrlListView_GetISearchString (построчный поиск), но в ней поиск именно с начала строки.

Русское сообщество AutoIt


Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4069
  • Репутация: 1078
    • Награды
  • Версия AutoIt: 3.3.14.0
$k!NNeR  [?]
Цитировать
функция поиска в ListBox'е
Код: AutoIt [Выделить]

Оффлайн $k!NNeR [?]

  • Новичок
  • *
  • Сообщений: 5

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.2.8.1
InnI
Спасибо за ответ. Остался вопрос каким образом можно добавить функционал поиска при наборе. Разбирая функцию  _GUICtrlListView_GetISearchString не совсем понимаю как оно работает. Там ведь даже цикла нет.

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4069
  • Репутация: 1078
    • Награды
  • Версия AutoIt: 3.3.14.0
$k!NNeR  [?]
Цитировать
не совсем понимаю как оно работает
Функция "общается" с элементом через сообщения. Но это элемент класса SysListView32, и к Listbox отношения не имеет.

Цитировать
добавить функционал поиска при наборе
Вы хотите набирать прямо в Listbox или, например, в Input ?

Русское сообщество AutoIt


Оффлайн $k!NNeR [?]

  • Новичок
  • *
  • Сообщений: 5

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.2.8.1
InnI
прямо в Listbox

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4069
  • Репутация: 1078
    • Награды
  • Версия AutoIt: 3.3.14.0
$k!NNeR  [?]
Цитировать
прямо в Listbox
Ниасилил  :(   Но могу предложить фильтрацию
Код: AutoIt [Выделить]
GUICreate("Listbox")
$nInput = GUICtrlCreateInput("", 10, 10)
$nList = GUICtrlCreateList("", 10, 30)
$aList = StringSplit("Остался вопрос каким образом можно добавить функционал поиска при наборе", " ")
FillList()
GUISetState()

GUIRegisterMsg(0x0111, '_WM_COMMAND')

Do
Until GUIGetMsg() = -3

Func FillList()
  For $i = 1 To $aList[0]
    GUICtrlSetData($nList, $aList[$i])
  Next
EndFunc

Func Filter($Text)
  GUICtrlSetData($nList, "")
  If Not $Text Then
    FillList()
  Else
    For $i = 1 To $aList[0]
      If StringInStr($aList[$i], $Text) Then GUICtrlSetData($nList, $aList[$i])
    Next
  EndIf
EndFunc

Func _WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
  Local $iIDFrom = BitAND($iwParam, 0xFFFF)
  Local $iCode = BitShift($iwParam, 16)
  Switch $iIDFrom
    Case $nInput
      Switch $iCode
        Case 0x300 ; $EN_CHANGE
          Filter(GUICtrlRead($nInput))
      EndSwitch
  EndSwitch
  Return "GUI_RUNDEFMSG"
EndFunc


Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2738
  • Репутация: 1143
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
$k!NNeR
Вводи число, будет поиск его в списке.
Код: AutoIt [Выделить]
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <GuiListBox.au3>

Local $hGui, $iListBox, $hListBox, $iInput

; Создаёт GUI
$hGui = GUICreate('Поиск строки в ListBox', 400, 330)
$iInput = GUICtrlCreateInput('', 10, 330 - 30, 240, 22, -1, $WS_EX_STATICEDGE)
$iListBox = GUICtrlCreateList("", 0, 0, 396, 296)
$hListBox = GUICtrlGetHandle(-1)

; Добавляет строки
_GUICtrlListBox_BeginUpdate($hListBox)
For $i = 1 To 999
    _GUICtrlListBox_AddString($hListBox, StringFormat("%03d", $i))
Next
_GUICtrlListBox_EndUpdate($hListBox)

GUISetState()
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func WM_COMMAND($hWnd, $imsg, $iwParam, $ilParam)
    Local $nNotifyCode, $nID, $sText, $iInput0
    $nNotifyCode = BitShift($iwParam, 16)
    $nID = BitAND($iwParam, 0xFFFF)
    Switch $hWnd
        Case $hGui
            Switch $nID
                Case $iInput
                    Switch $nNotifyCode
                        Case $EN_CHANGE
                            ; Поиск пункта
                            Local $sInp = GUICtrlRead($iInput)
                            Local $iIndex = _GUICtrlListBox_FindString($hListBox, $sInp)
                            _GUICtrlListBox_SetCurSel($hListBox, $iIndex)
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND


Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4069
  • Репутация: 1078
    • Награды
  • Версия AutoIt: 3.3.14.0
AZJIO  [?]
Цитировать
Вводи число, будет поиск
С числами - неудачный пример, т.к. работает аналогично "встроенному" поиску Listbox.

Сначала тоже хотел предложить подобный вариант, но раз условие "прямо в Listbox" всё равно не выполняется, то решил, что фильтрация будет лучше.

Русское сообщество AutoIt


Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2738
  • Репутация: 1143
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
InnI  [?]
Цитировать
С числами - неудачный пример, т.к. работает аналогично "встроенному" поиску Listbox
Попробуй набери 976 во встроенном поиске и в поиске от начала. Надеюсь увидишь разницу.

Цитировать
то решил, что фильтрация будет лучше.
автор чётко сказал:
Цитировать
но в ней поиск именно с начала строки

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4069
  • Репутация: 1078
    • Награды
  • Версия AutoIt: 3.3.14.0
AZJIO  [?]
Цитировать
Надеюсь увидишь разницу.
Не увидел. Или не понял. В обоих случаях выделяется 976 (если, конечно, не нажимать каждую цифру после паузы в пару секунд).

Цитировать
автор чётко сказал
А я так понял, что он посетовал... Вот, мол, есть функция, как мне надо, но она ищет с начала, а мне нужно НЕ с начала строки.

Ладно. Чего зря спорить? :beer:
$k!NNeR вообще пожелал "прямо в Listbox". Так что оба примера могут быть "не совсем то, что нужно".


Добавлено: Апрель 19, 2014, 16:04:50
Разобрался.
При наличии стиля $LBS_SORT поиск производится по последовательности символов (набираем 976, выделяется 900-970-976). При отсутствии сортировки ищется только первый символ (976: 900-700-600).
« Последнее редактирование: Апрель 19, 2014, 16:04:50 от InnI, Причина: Объединение сообщений »

Оффлайн $k!NNeR [?]

  • Новичок
  • *
  • Сообщений: 5

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.2.8.1
При наличии стиля $LBS_SORT
Не совсем понял по поводу стиля. В обоих примерах не увидел разницу.
В принципе если будет inputbox - не страшно, его и спрятать можно.

В итоге использовал код InnI. Подменил функцию на:

Код: AutoIt [Выделить]
Func Filter($Text)
  $iIndex = _GUICtrlListBox_FindInText($nList, $Text)
_GUICtrlListBox_SetCurSel($nList, $iIndex)
EndFunc


Большое спасибо за помощь

P.S. Подредактирую в соответствии с правилами после того как форум полноценно заработает.
« Последнее редактирование: Апрель 23, 2014, 07:58:14 от $k!NNeR »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4069
  • Репутация: 1078
    • Награды
  • Версия AutoIt: 3.3.14.0
В обоих примерах не увидел разницу.
Разница в том, что в моём примере производится фильтрация, т.е. в списке остаются только пункты, содержащие введённую подстроку. А в примере AZJIO просто выделяется пункт, содержащий подстроку. Кстати, изменив функцию, вы "превратили" мой пример в пример AZJIO :)

Оффлайн $k!NNeR [?]

  • Новичок
  • *
  • Сообщений: 5

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.2.8.1
Ну не совсем. Там поиск именно с начала строки. А используя _GUICtrlListBox_FindInText как раз в контексте строки. В любом случае благодарен за советы.

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
17 Ответов
13574 Просмотров
Последний ответ Август 14, 2010, 00:26:05
от HukpoFuJl
5 Ответов
16447 Просмотров
Последний ответ Декабрь 05, 2012, 16:40:30
от AZJIO
1 Ответов
2320 Просмотров
Последний ответ Апрель 12, 2012, 22:20:05
от AZJIO
2 Ответов
3069 Просмотров
Последний ответ Июнь 28, 2012, 20:44:13
от ZanMax
3 Ответов
3869 Просмотров
Последний ответ Август 15, 2012, 14:29:05
от ---Zak---
2 Ответов
2091 Просмотров
Последний ответ Январь 07, 2013, 20:09:23
от ArgoNaft
2 Ответов
1802 Просмотров
Последний ответ Июль 09, 2014, 17:37:22
от InnI
2 Ответов
727 Просмотров
Последний ответ Ноябрь 08, 2017, 12:04:40
от Tempo
2 Ответов
257 Просмотров
Последний ответ Июнь 06, 2018, 09:35:32
от gipperpank
3 Ответов
285 Просмотров
Последний ответ Ноябрь 20, 2018, 14:10:30
от pvnn