Что нового

[Элементы GUI] Поиск подстроки в ListView и прокрутка найденного элемента наверх

erlik

Продвинутый
Сообщения
317
Репутация
84
Написал нехитрый деинсталлятор программ - в нем есть функция поиска программы в списке. Поиск простой - в строках первой колонки ListView просто ищется подстрока указанная пользователем в элементе Input. После найденного совпадения поиск останавливается, а строка выделяется и прокручивается на верх списка. Нижеприведенный код выполняет практически все нужные действия - но почему в некоторых случаях дает прокрутку не на верх ListView, а ниже - и далее после продолжения поиска с этой строки ошибочная прокрутка постоянно увеличивается.
Формулу прокрутки составлял сам -и видимо где-то что то неправильно рассчитал. Подскажите пожалуйста где ошибка.


Код:
Func FindProgramInList()
    Local $aText, $iItemCount;  массив для текста и число пунктов с ListView
	Local $aSelectedIndex ; индекс выделенной строки
	Local $FlagFind=False ; флаг что было найдено хоть одно совпадение
	Local $iIndexStartRow=0;  индекс строки с которой стартует поиск - при первом старте всегда 0, далее поиск идет со следующей строки перед которой найдено совпадение
	Local $iFix=0
	Local $sTextInput=GUICtrlRead ( $Input)
	If $sTextInput="" Then Return MsgBox(0,"","Текст для поиска не введен!")
	$aSelectedIndex=_GUICtrlListView_GetSelectedIndices($hListView, True)
	; если строка выделена - начинаем поиск со следующего по порядку индекса, иначе - с нулевого индекса
	If $aSelectedIndex[0]<>0 Then 
		$iIndexStartRow=$aSelectedIndex[1]+1
		$iFix=1; будем плюсовать единицу к числу строк на которое нужно прокрутить список
	EndIf
	; получим число пунктов в ListView	
	$iItemCount=_GUICtrlListView_GetItemCount($hListView)
    ;MemoWrite($iItemCount)
    For $i = $iIndexStartRow To $iItemCount
	; получим текст каждого пункта первой колонки поочередно	
	$aText=_GUICtrlListView_GetItemTextArray($hListView, $i)
    ;MemoWrite($aText[1])
	; ищем первое попавшееся вхождение введенной строки  среди имен программ
    If StringInStr($aText[1],$sTextInput) Then
		; выделяем найденную строку
	_GUICtrlListView_SetItemSelected($hListView,$i,True,True)
	_GUICtrlListView_Scroll($hListView, 0, ($i-$iIndexStartRow+$iFix)*17);$i-$iIndexRow+$iFix)*17
    $FlagFind=True
	;MemoWrite("Индекс цикла="&$i&"|Индекс строки="&$iIndexStartRow&"|фикс="&$iFix&"|прокрутка="&($i-$iIndexStartRow+$iFix)*17)
		ExitLoop
	EndIf
Next
If Not $FlagFind Then Return MsgBox(0,"","Совпадений не найдено.")
EndFunc


правильная прокрутка
http://imageshack.us/photo/my-images/822/76515004.jpg/
не правильная прокрутка
http://imageshack.us/photo/my-images/3/97152479.jpg/
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
erlik
Я не проверял скрипт, но существует некоторая разница от прокручивания вверх или вниз. Предположительно можно прокрутить например в конец, а потом к нужному пункту или в начало, а потом к нужному пункту.
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
Вопрос решен - извиняюсь, что зря беспокоил. Оказывается скрипт работает правильно - только сейчас заметил, что неправильная якобы прокрутка у меня происходит в конце списка - где прокрутка нужного элемента наверх просто невозможна.
,
PS:Тема в общем то решена, но было бы интересно посмотреть на примеры решения подобных задач у других форумчан.
 
Верх