Что нового

_GUICtrlListView_FindInText - продолжение поиска в ListView

saavaage

Знающий
Сообщения
171
Репутация
17
Суть проблемы: организовал продолжение поиска в ListView, т.е. аналог F3

Мой Код:

Код:
Func _Search()
    IF GuiCtrlRead($Input_Search) <>'' Then
	    IF _GUICtrlListView_FindinText($ListView_DictEdit, GuiCtrlRead($Input_Search), 0, 0) <>-1 Then
             _GUICtrlListView_SetItemSelected($ListView_DictEdit, _GUICtrlListView_FindinText($ListView_DictEdit, GuiCtrlRead($Input_Search)))
		Else
			  MsgBox(0, 'Attention', "The word hasn't found!")
		Endif
	Else
	    MsgBox(0, 'Attention', 'Input a word in the search field!')
	EndIf
EndFunc

Func _F3()
	$iF1 =''
	For $iF =0 To _GUICtrlListView_GetItemCount($ListView_DictEdit)-1
		If _GUICtrlListView_GetItemSelected(GUICtrlGetHandle($ListView_DictEdit), $iF) Then
			$iF1 = _GUICtrlListView_FindinText($ListView_DictEdit, GuiCtrlRead($Input_Search), $iF)
			MsgBox(0, '', $iF1)
			_GUICtrlListView_SetItemSelected($ListView_DictEdit, $iF1)
            exitloop
        Endif
	Next
EndFunc


1- ая функция организовывает поиск слова до первого совпадения и выделяет строку с найденным решением:
2- ая функция ищет выделенную строку и осуществляет дальнейший поиск этого же слова со следующей строки до первого совпадения, потом - до следующего совпадения и так далее...

Собственно вопрос: меня терзают смутные подозрения, что можно было все это сделать более изящнее и через одну функцию. Буду рад любой помощи.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
Код:
#include <GUIConstantsEx.au3>
#include <GUIListView.au3>

$hGUI = GUICreate("Test Script", 300, 200)

$Input_Search = GUICtrlCreateInput("", 10, 10, 220, 20)
$Search_Button = GUICtrlCreateButton("Find", 230, 10, 60, 20)

$ListView_DictEdit = GUICtrlCreateListView("", 10, 30, 280, 150)
_GUICtrlListView_SetExtendedListViewStyle($ListView_DictEdit, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))

_GUICtrlListView_AddColumn($ListView_DictEdit, "Column 1", 100)

For $i = 1 To 10
    _GUICtrlListView_AddItem($ListView_DictEdit, "Row" & $i, 0)
Next

Dim $aAccelKeys[1][2] = [["{F3}", $Search_Button]]
GUISetAccelerators($aAccelKeys, $hGUI)

GUISetState(@SW_SHOW, $hGUI)

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

Func _Search()
	$sFindInput = GUICtrlRead($Input_Search)
	
    If $sFindInput = '' Then
		MsgBox(48, 'Attention', 'Input a word in the search field!', 0, $hGUI)
		Return
	EndIf
	
	$iSearchIndex = -1
	$sIndex = _GUICtrlListView_GetSelectedIndices($ListView_DictEdit)
	$iIndex = Number($sIndex)
	$sSelected = _GUICtrlListView_GetItemText($ListView_DictEdit, $iIndex)
	$iSearchFirst = _GUICtrlListView_FindinText($ListView_DictEdit, $sFindInput, -1)
	$iSearchNext = _GUICtrlListView_FindinText($ListView_DictEdit, $sFindInput, $iIndex)
	
	If $sIndex And StringInStr($sSelected, $sFindInput) Then ;There is selected item
		$iSearchIndex = $iSearchNext
	ElseIf $iSearchFirst <> -1 Then
		$iSearchIndex = $iSearchFirst
	Else
		Return MsgBox(48, 'Attention', "The word hasn't found!", 0, $hGUI)
	EndIf
	
	_GUICtrlListView_SetItemSelected($ListView_DictEdit, $iSearchIndex)
	_GUICtrlListView_EnsureVisible($ListView_DictEdit, $iSearchIndex)
EndFunc
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Спасибо, CreatoR! Тема решена.
Поторопился, я. Вообщем, есть маленькое но - моя комбинация "ищет с продолжением" как русские так и английские слова в listview, Ваша - английские - безупречно, русские - только до первого совпадения.

Listview у меня состоит из 2 полей: "English word" и "Russian Word"

На всякий, кидаю весь скрипт (это только одна вкладка будущей утилиты для заучивания слов иностранных языков) по созданию и редактированию новых словарей. Вкладка еще не доработана, нет защиты от дураков и направлений переводов, но как образец, думаю, пойдет. Короче, см. архив...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
saavaage [?]
русские - только до первого совпадения
Прикрепил изменённую версию, у меня вроде работает как положенно.
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
CreatoR, работает нормально. Есть 2 вопроса:
1. это вообще возможно реализовать через 1 кнопку (уж больно хочется Ваш 1-ый вариант реализовать)?
2. ваш вариант производительнее моего первоначального, если речь будет идти о 10000-20000 строк?
3. как делать такие же элегантные окончания функций, как у вас, например, такое:
Код:
;==>_Search
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
saavaage [?]
это вообще возможно реализовать через 1 кнопку
Конечно, нужно вызывать _Search с параметром 1:

Код:
Case $Button_Search, $Button_F3
			_Search(1)


ваш вариант производительнее моего первоначального, если речь будет идти о 10000-20000 строк?
Не уверен, нужно проверять. Кстати обычный ListView (созданный с GUICtrlCreateListView) поддерживает около 4000 записей, для большего количества нужно использовать UDF'ы.

как делать такие же элегантные окончания функций, как у вас, например, такое
:smile: Это делает Tidy (Ctrl + T).
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
" для большего количества нужно использовать UDF'ы" - инфо устарела. Проверил на 22500 строк - все отработало наура.


Добавлено:
Сообщение автоматически объединено:

Тема решена.
 
Верх