Что нового

[Баг] Некорректная работа _GUICtrlListView_FindText со стилем LVS_SORTASCENDING

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Пример:

Код:
#include <GUIConstantsEx.au3>
#include <GUIListView.au3>

$hGUI = GUICreate('')

$iListView = GUICtrlCreateListView('Col', 20, 20, 260, 250, BitOR($GUI_SS_DEFAULT_LISTVIEW, $LVS_SORTASCENDING))

GUICtrlCreateListViewItem('Item 1', $iListView)
GUICtrlCreateListViewItem('Item 2', $iListView)

GUISetState(@SW_SHOW, $hGUI)

_GUICtrlListView_SetItemText($iListView, 1, 'Item 1')
_GUICtrlListView_SetItemText($iListView, 0, 'Item 2')

$iIndex = _GUICtrlListView_FindText($iListView, 'Item 1', -1, False) ;, True)
;~ $iIndex = _GUICtrlListView_FindInText($iListView, 'Item 1')

MsgBox(64, 'Title', $iIndex)

While 1
	$nMsg = GUIGetMsg()

	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd


Всё дело в стиле $LVS_SORTASCENDING, если его не использовать, то проблем нет.
В коде выше, текст пунктов меняется местами, после чего начинаются проблемы...

Если вместо True поставить False в вызове _GUICtrlListView_FindText (частичный поиск), то возвращает правильный индекс, также если использовать строку с _GUICtrlListView_FindInText, то нет проблем.

Мне нужен поиск строго по указанному названию, и строго в первой колонке.

Ищу как решение проблеме, так и объяснение, почему так происходит и баг ли это вообще?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вот вроде решение проблемы:

Код:
#include <GUIConstantsEx.au3>
#include <GUIListView.au3>

$hGUI = GUICreate('')

$iListView = GUICtrlCreateListView('Col', 20, 20, 260, 250, BitOR($GUI_SS_DEFAULT_LISTVIEW, $LVS_SORTASCENDING))

GUICtrlCreateListViewItem('Item 1', $iListView)
GUICtrlCreateListViewItem('Item 2', $iListView)

GUISetState(@SW_SHOW, $hGUI)

_GUICtrlListView_SetItemText($iListView, 1, 'Item 1')
_GUICtrlListView_SetItemText($iListView, 0, 'Item 2')

$iIndex = _GUICtrlListView_FindTextEx($iListView, 'Item 1', -1, False, True, 0, 0)

MsgBox(64, 'Title', $iIndex)

While 1
	$nMsg = GUIGetMsg()

	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _GUICtrlListView_FindTextEx($hLV, $sText, $iStart = -1, $fPartialOK = True, $fWrapOK = True, $iCaseSense = 0, $iSubItem = 0)
	Local $i_Count = _GUICtrlListView_GetItemCount($hLV)
	Local $i_Start = 0, $s_Text, $i_TxtLen = StringLen($sText)
	
	If $iStart > -1 Then
		$i_Start = $iStart
	EndIf
	
	While 1
		For $i = $i_Start To $i_Count - 1
			$s_Text = _GUICtrlListView_GetItemText($hLV, $i, $iSubItem)
			
			If ($fPartialOK And StringCompare(StringLeft($s_Text, $i_TxtLen), $sText, $iCaseSense) = 0) Or (Not $fPartialOK And StringCompare($s_Text, $sText, $iCaseSense) = 0) Then
				Return $i
			EndIf
		Next
		
		If Not $fWrapOK Or $i_Start = 0 Then
			ExitLoop
		EndIf
		
		$i_Start = 0
	WEnd
	
	Return -1
EndFunc
 
Верх