Что нового

_GUICtrlListView_GetItemTextString возвращает неправильное значение

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Код:
#include <ListviewConstants.au3>
#include <GuiListView.au3>
#include <GUIConstants.au3>

Opt('GUIOnEventMode', 1)

$hGUI3 = GUICreate('Отчёт', 300, 200)
$list = GUICtrlCreateListView('#|1|2|3', 0, 0, 300, 150, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER, $LVS_REPORT), _
BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES))
For $i = 0 To 7
	GUICtrlCreateListViewItem($i&'|'&Random(0, 9, 1)&'|'&Random(0, 9, 1)&'|'&Random(0, 9, 1), $list)
Next
$copy = GUICtrlCreateButton('Считать выделенные строки', 20, 160, 250, 30)
GUICtrlSetOnEvent($copy, '_copy')
GUISetState()
GUISetOnEvent($GUI_EVENT_CLOSE, '_exit', $hGUI3)
$clip = ''
While 1
	Sleep(25)
WEnd

Func _copy()
;~ 	ConsoleWrite(@CRLF&'четвертая строка: '&_GUICtrlListView_GetItemTextString($list, 4)&@CRLF)
	$sel = _GUICtrlListView_GetSelectedIndices($list, False)
	ConsoleWrite(@CRLF&'--SELCTED--: '&$sel&@CRLF)
	$selstring = StringSplit($sel, '|', 1)
	For $i = 1 To UBound($selstring) - 1
		ConsoleWrite(@CRLF&'----ROW----'&$selstring[$i]&@CRLF)
		$clip &= _GUICtrlListView_GetItemTextString($list, $selstring[$i]) & '|'
	Next
	ConsoleWrite(@CRLF&'--clip--: '&$clip&@CRLF)
	$clip = ''
EndFunc

Func _exit()
	Exit
EndFunc

После нажатия кнопки - должно происходить копирование всех выделенных строк, но _GUICtrlListView_GetItemTextString($list, $selstring[$i]) возвращает пустые значения с разделителями :-\.
После долгого ковыряния нашел значение, при котором все нормально работает:
_GUICtrlListView_GetItemTextString($list, $selstring[$i] + 0)
Кто может объяснить такое странное поведение функции? Может я что не так делаю?

Пока писал нашел причину - $selstring[$i] имеет тип String и все решается простым переводом строки в цифру
Код:
$selstring[$i] = Number($selstring[$i])


Вдруг кому пригодится. 8)
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Redline
Был случай когда Number не помогал, помог Int.

Если есть сомнения в типе переменной использую это

Код:
;If IsAdmin() Then MsgBox(0, "", "ты админ")
$test = 'копируем это в код программы, вставляем сюда переменную.'
;If IsDeclared ("test") then MsgBox(0, 'Сообщение', "переменная существует"  ) 
If IsArray($test) Then MsgBox(0, 'Сообщение', "массив")
If IsBinary($test) Then MsgBox(0, 'Сообщение', "бинарные")
if isBool($test) then Msgbox(0, 'Сообщение', "логическое (true, false)")
if IsDllStruct($test) Then MsgBox(0, 'Сообщение', "DLL-структура")
if IsFloat($test) Then MsgBox(0, 'Сообщение', "С плавающей запятой")
if IsHWnd($test) Then MsgBox(0, 'Сообщение', "тип HWnd")
if IsNumber($test) Then MsgBox(0, 'Сообщение', "это число")
if IsInt($test) Then MsgBox(0, 'Сообщение', "целое число")
if IsKeyword($test) Then MsgBox(0, 'Сообщение', "множество ключевых слов")
if IsObj($test) Then MsgBox(0, 'Сообщение', "объект")
if IsString($test) Then MsgBox(0, 'Сообщение', "текст")
; шаблон if ($test) Then MsgBox(0, 'Сообщение', "")
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Можно проще.

Код:
MsgBox(0, 'Сообщение', VarGetType($test))
 
Верх