Написал нехитрый деинсталлятор программ - в нем есть функция поиска программы в списке. Поиск простой - в строках первой колонки ListView просто ищется подстрока указанная пользователем в элементе Input. После найденного совпадения поиск останавливается, а строка выделяется и прокручивается на верх списка. Нижеприведенный код выполняет практически все нужные действия - но почему в некоторых случаях дает прокрутку не на верх ListView, а ниже - и далее после продолжения поиска с этой строки ошибочная прокрутка постоянно увеличивается.
Формулу прокрутки составлял сам -и видимо где-то что то неправильно рассчитал. Подскажите пожалуйста где ошибка.
правильная прокрутка
http://imageshack.us/photo/my-images/822/76515004.jpg/
не правильная прокрутка
http://imageshack.us/photo/my-images/3/97152479.jpg/
Формулу прокрутки составлял сам -и видимо где-то что то неправильно рассчитал. Подскажите пожалуйста где ошибка.
Код:
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/