Что нового

[Элементы GUI] Вывбранные элементы в GUICtrlCreateListView

vcomp71

Осваивающий
Сообщения
431
Репутация
25
Что-то никак не пойму в чем дело.
Есть стандартная функция
Код:
_ArrayDisplay

Есть ее код в соответствующей udf
Решил ее несколько модифицировать, чтобы сделать диалог выбора из массива элементов.
На диалоге в стандартной функции присутствует кнопка

Код:
Local $hCopy = GUICtrlCreateButton("Copy Selected", 3, $aiGUISize[1] - 23, $aiGUISize[0] - 6, 20)



Вот код ее обработки


Код:
Local $sClip = ""

				; Get selected indices [ _GUICtrlListView_GetSelectedIndices($hListView, True) ]
				Local $aiCurItems[1] = [0]
				For $i = 0 To GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMCOUNT, 0, 0)
					If GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $i, 0x2) Then
						$aiCurItems[0] += 1
						ReDim $aiCurItems[$aiCurItems[0] + 1]
						$aiCurItems[$aiCurItems[0]] = $i
					EndIf
				Next

				; Generate clipboard text
				If Not $aiCurItems[0] Then
					For $sItem In $avArrayText
						$sClip &= $sItem & @CRLF
					Next
				Else
					For $i = 1 To UBound($aiCurItems) - 1
						$sClip &= $avArrayText[$aiCurItems[$i]] & @CRLF
					Next
				EndIf
				ClipPut($sClip)


Меняем на вот такой код

Код:
; Get selected indices [ _GUICtrlListView_GetSelectedIndices($hListView, True) ]

				Local $aiCurItems[1] = [0]
				For $i = 0 To GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMCOUNT, 0, 0)
					If GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $i, 0x2) Then
						$aiCurItems[0] += 1
						ReDim $aiCurItems[$aiCurItems[0] + 1]
						$aiCurItems[$aiCurItems[0]] = $i
					EndIf
				Next
				; Сохраняем выбор
				If Not $aiCurItems[0] Then
					MsgBox(4096, "Нет выбранных элементов","Нет выбранных элементов")
					$vibor = ""
				Else
					if  $iSubMax=0 Then
						MsgBox(4096, "Процедура выбора","Одномерный массив")
						dim $vibor[UBound($aiCurItems)+1]
						for $i=1 to UBound($aiCurItems)
								$vibor[$i] =$avArray[$i]
						Next
					Else
						dim $vibor[$iSubMax][UBound($aiCurItems)+1]
						MsgBox(4096, "Процедура выбора","Двумерный массив")
						For $i = 1 To UBound($aiCurItems) - 1
							for $jj=1 to $iSubMax
								$vibor[$jj][$i] =$avArray[$i][$jj]
							Next
						Next
					EndIf
				EndIf
			MsgBox(4096, "Процедура выбора",UBound($vibor))
			ExitLoop


То есть вместо строковой переменной формируем массив. Ну так вот.. В исходном тексте он отмечает элементы корректно, в получившимся, берет упорно три элемента, то есть как я полагаю некорректно работает вот эта конструкция

Код:
For $i = 0 To GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMCOUNT, 0, 0)
					If GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $i, 0x2) Then
						$aiCurItems[0] += 1
						ReDim $aiCurItems[$aiCurItems[0] + 1]
						$aiCurItems[$aiCurItems[0]] = $i
					EndIf
Next


А точнее:


Код:
If GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $i, 0x2) Then
						$aiCurItems[0] += 1
						ReDim $aiCurItems[$aiCurItems[0] + 1]
						$aiCurItems[$aiCurItems[0]] = $i
					EndIf

При проверке на выделенный элемент, условие срабатывает на все элементы.
В чем трабл? Код функции брал полностью из стандартной udf, там вроде все переменные корректно определены.
 
Верх