Что нового

Список GUICtrlCreateList без сортировки по возрастанию

joparezzz

Новичок
Сообщения
65
Репутация
0
Каким образом вывести список без сортировки значений по возрастанию.
Порядок должен быть как в консоли.

Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 615, 437, 192, 124)
$List1 = GUICtrlCreateList("", 8, 16, 145, 305)
$List2 = GUICtrlCreateList("", 168, 16, 145, 305)
$List3 = GUICtrlCreateList("", 328, 16, 161, 305)
$Button1 = GUICtrlCreateButton("Button1", 32, 352, 75, 25)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	Case $Button1 ;Загружаем данные
		$sText = FileRead(@ScriptDir & '\test.txt')
		$sText = StringRegExpReplace($sText, '([\r\n]*$)', '')
		$aText = StringSplit(StringStripCR($sText), @LF)
		StringReplace($aText[1], ';', '')
		$i2D = @extended + 1
		Dim $aRes[$aText[0]][$i2D]
		For $i = 1 To $aText[0]
			$aTemp = StringSplit($aText[$i], ';')
			For $j = 1 To $aTemp[0]
				$aRes[$i - 1][$j - 1] = $aTemp[$j]
			Next
			If $aRes[$i-1][1] = '' and $i >= 8 Then
				$RespIndex = $i ; Номер строки области
				$RespName = $aRes[$i-1][0] ; Название области
				GUICtrlSetData($List1, $RespName)
				GUICtrlSetData($List2, "")
				GUICtrlSetData($List3, "")
			Else
			EndIf
		Next
		$aText = 0
		$aTemp = 0
		;_ArrayDisplay($aRes)


	Case $List1
		$RespName = GUICtrlRead($List1)
		GUICtrlSetData($List2, "")
		GUICtrlSetData($List3, "")
		$iIndex = _ArraySearch($aRes, $RespName, 7, 0, 0, 1)
		$CityIndexStart = $iIndex + 1 ; Номер строки первого насленного пункта
		Local $x = 1
		While 1
			If Not($aRes[$iIndex+$x][1] == '') Then
				$CityIndex = $iIndex+$x ; Номер строки
				$CityName = $aRes[$iIndex+$x][0] ; Название населенного пункта
				GUICtrlSetData($List2, $CityName)
				$CityIndexEnd = $CityIndex ; Номер строки последнего насленного пункта
			Else
				ExitLoop
			EndIf
			$x = $x + 1
		WEnd

	Case $List2
		$CityName = GUICtrlRead($List2)
		GUICtrlSetData($List3, "")
		$IndexCity = _ArraySearch($aRes, $CityName, $CityIndexStart, $CityIndexEnd, 0, 1)
		For $i = 1 to 19
			$Param = $aRes[$IndexCity][$i]
			ConsoleWrite($i & ' ' & $Param & @CRLF)
			GUICtrlSetData($List3, $Param)
		Next
			ConsoleWrite(@CRLF)
	EndSwitch
WEnd
 

Вложения

  • test.txt
    59.7 КБ · Просмотры: 6

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
joparezzz
Код:
$List1 = GUICtrlCreateList("", 8, 16, 145, 305, BitXOR($GUI_SS_DEFAULT_LIST, $LBS_SORT))
; или так
$List1 = GUICtrlCreateList("", 8, 16, 145, 305, BitOR($WS_BORDER, $WS_VSCROLL))
 
Автор
J

joparezzz

Новичок
Сообщения
65
Репутация
0
Спасибо все работает как надо.
Еще хотел узнать как загрузить данные в $List1 при запуске скрипта, не нажимая на $Button1
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
joparezzz
как загрузить данные в $List1 при запуске скрипта, не нажимая на $Button1
Точно так же, как и нажимая на кнопку: вырезать весь код из обработчика кнопки и вставить перед циклом. Или вынесите весь этот код в отдельную функцию и вызывайте её где надо - хоть при загрузке, хоть при нажатии кнопки.
 
Автор
J

joparezzz

Новичок
Сообщения
65
Репутация
0
Круто!
Я то думал, что внутри цикла только можно)


Добавлено:
Сообщение автоматически объединено:

Переделал код.
При выборе последней строки в List1, скрипт завершает работу в консоли пишет:
(60) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
If Not($aRes[$iIndex+$x][1] == '') Then
If Not(^ ERROR

Видимо скрипт доходит до конца массива и вылетает, как задать условие, если конец массива то завершить цикл?

Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <WindowsConstants.au3>


$Form1 = GUICreate("Form1", 615, 537, 192, 124)
$List1 = GUICtrlCreateList("", 8, 16, 245, 305, BitXOR($GUI_SS_DEFAULT_LIST, $LBS_SORT))
$List2 = GUICtrlCreateList("", 268, 16, 145, 305, BitXOR($GUI_SS_DEFAULT_LIST, $LBS_SORT))
$List3 = GUICtrlCreateList("", 428, 16, 161, 305, BitXOR($GUI_SS_DEFAULT_LIST, $LBS_SORT))
$Edit1 = GUICtrlCreateEdit("", 8, 336, 596, 197)
;$Button1 = GUICtrlCreateButton("Button1", 32, 352, 75, 25)
GUISetState(@SW_SHOW)


		$sText = FileRead(@ScriptDir & '\test.txt')
		$sText = StringRegExpReplace($sText, '([\r\n]*$)', '')
		$aText = StringSplit(StringStripCR($sText), @LF)
		StringReplace($aText[1], ';', '')
		$i2D = @extended + 1
		Dim $aRes[$aText[0]][$i2D]
		For $i = 1 To $aText[0]
			$aTemp = StringSplit($aText[$i], ';')
			For $j = 1 To $aTemp[0]
				$aRes[$i - 1][$j - 1] = $aTemp[$j]
			Next
			If $aRes[$i-1][1] = '' and $i >= 8 Then
				$RespIndex = $i ; Номер строки области
				$RespName = $aRes[$i-1][0] ; Название области
				GUICtrlSetData($List1, $RespName)
				GUICtrlSetData($List2, "")
				GUICtrlSetData($List3, "")
			Else
			EndIf
		Next
		$aText = 0
		$aTemp = 0
		;_ArrayDisplay($aRes)



While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	;Case $Button1 ;Загружаем данные


	Case $List1
		$RespName = GUICtrlRead($List1)
		GUICtrlSetData($List2, "")
		GUICtrlSetData($List3, "")
		GUICtrlSetData($Edit1, '')
		$iIndex = _ArraySearch($aRes, $RespName, 7, 0, 0, 1)
		$CityIndexStart = $iIndex + 1 ; Номер строки первого насленного пункта
		Local $x = 1
		While 1
			If Not($aRes[$iIndex+$x][1] == '') Then
				$CityIndex = $iIndex+$x ; Номер строки
				$CityName = $aRes[$iIndex+$x][0] ; Название населенного пункта
				GUICtrlSetData($List2, $CityName)
				$CityIndexEnd = $CityIndex ; Номер строки последнего насленного пункта
			Else
				ExitLoop
			EndIf
			$x = $x + 1
		WEnd

	Case $List2
		$CityName = GUICtrlRead($List2)
		GUICtrlSetData($List3, "")
		GUICtrlSetData($Edit1, '')
		$IndexCity = _ArraySearch($aRes, $CityName, $CityIndexStart, $CityIndexEnd, 0, 1)
		For $i = 1 to 19
			$Param = $aRes[$IndexCity][$i]
			;GUICtrlSetData($List3, $i & '. ' & $Param)

			$Str1 = $aRes[1][$i]
			$Str2 = $aRes[2][$i]
			$Str3 = $aRes[3][$i]
			$Str4 = $aRes[4][$i]
			$ParamName = $Param & @TAB & ' – ' & $Str1 & ' ' & $Str2 & ' ' & $Str3 & ' ' & $Str4
			$ParamName = StringReplace($ParamName, '   ', ' ')
			$ParamName = StringReplace($ParamName, '  ', ' ')
			ConsoleWrite('' & $ParamName & @CRLF)
			GUICtrlSetData($List3, $ParamName)


		Next
			ConsoleWrite(@CRLF)


	$tint = 20
	$tht = $aRes[$IndexCity][13]
	$zht = $aRes[$IndexCity][12]
	$Dd = ($tint - $tht)*$zht
	ConsoleWrite('Dd = (tint - tht)*zht' & @CRLF)
	ConsoleWrite('tint = ' & $tint & @CRLF)
	ConsoleWrite('tht = ' & $tht & @CRLF)
	ConsoleWrite('zht = ' & $zht & @CRLF)
	ConsoleWrite('Dd = ' & $Dd & @CRLF)

	GUICtrlSetData($Edit1, '')
	GUICtrlSetData($Edit1, 	$RespName & @CRLF _
							& $CityName & @CRLF _
							& 'tint = ' & $tint & @CRLF _
							& 'tht = ' & $tht & @CRLF _
							& 'zht = ' & $zht & @CRLF _
							& 'Dd = ( tint - tht ) * zht' _
							& ' = ( ' & $tint & ' - ' & $tht & ' ) * ' & $zht & ' = ' & $Dd & @CRLF _
							)

	;GUICtrlSetData($Edit1, $Dd)


	Case $List3
			;MsgBox(4096, 'Результат', GUICtrlRead($List3))
			;ToolTip(GUICtrlRead($List3))


	EndSwitch

WEnd
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
joparezzz
как задать условие, если конец массива то завершить цикл
Честно говоря, особо в детали не вдавался, но вот так работает
Код:
...
            $x = $x + 1
            If UBound($aRes) = $iIndex+$x Then ExitLoop ; <= добавить
        WEnd
...
 
Автор
J

joparezzz

Новичок
Сообщения
65
Репутация
0
Переделал программу.
Хочу сделать поиск по базе данных.
Сейчас работает поиск по городам, рядом приписывается название области, а вот название государства ни как не могу вытащить.
Программа работает следующим образом находит:
1. Находит города начинающиеся с на определенные сочетания букв.
2. Находит название областей куда входят эти города (в цикле от индекса города отнимает 1 до тех пор пока во втором столбце не будет пусто (в названиях областей 2 и последующие столбцы пустые).
3. Необходимо также найти название государства (отличается от названия области регистром), знаю что необходимо применить функцию StringIsUpper, но че то не получается.

Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

		$sText = FileRead(@ScriptDir & '\test.txt')
		$sText = StringRegExpReplace($sText, '([\r\n]*$)', '')
		$aText = StringSplit(StringStripCR($sText), @LF)
		StringReplace($aText[1], ';', '')
		$i2D = @extended + 1
		Dim $aRes[$aText[0]][$i2D]
		For $i = 1 To $aText[0]
			$aTemp = StringSplit($aText[$i], ';')
			For $j = 1 To $aTemp[0]
				$aRes[$i - 1][$j - 1] = $aTemp[$j]
			Next
		Next
		$aText = 0
		$aTemp = 0

Global $iInput1
GUICreate('Тест', 450, 250, -1, -1, -1, $WS_CLIPCHILDREN)
$nInput1 = GUICtrlCreateInput('', 10, 10, 150, 20)
GUICtrlSetColor(-1, 0x505050)
$nInput2 = GUICtrlCreateList('', 10, 40, 300, 200)


GUISetState()

While 1
	$CitySearch = GUICtrlRead($nInput1)
    Select
		Case $CitySearch <> $iInput1
			GUICtrlSetData($nInput2, '')
			ConsoleWrite($CitySearch & @CRLF)
			$SearchResult = _ArrayFindAll($aRes, GUICtrlRead($nInput1) , 7, 0, 0, 1, 0) ; Поиск всех
			For $x = 0 to UBound($SearchResult)-1
				$CityIndex = $SearchResult[$x]
				$CityName = $aRes[$CityIndex][0]
				$pattern = '(?i)^' & $CitySearch

				CityAndOblAndCountryName()

			Next
			$iInput1 = $CitySearch
    EndSelect

    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd


Func CityAndOblAndCountryName()
	If StringRegExp($CityName, $pattern) And Not($aRes[$CityIndex][1] = '') Then
		For $r = 1 to UBound($aRes) - 1
			$OblIndex = $CityIndex - $r
			$OblName = $aRes[$OblIndex][0]
			If $aRes[$OblIndex][1] = '' Then
				ExitLoop
			Else
			EndIf
		Next

		Local $CountryIndex
		Local $CountryName

		ConsoleWrite($CityIndex & ' ' & $CityName &  ' <-- ' & $OblIndex & ' ' & $OblName &  ' <-- ' & $CountryIndex & ' ' & $CountryName  &@CRLF)
		GUICtrlSetData($nInput2, $CityName &  ' <-- ' & $OblName &  ' <-- ' & $CountryName)
	Else
	EndIf
EndFunc



Добавлено:
Сообщение автоматически объединено:

Сделал.
Оказывается StringIsUpper() дает не правильное значение если в тексте есть пробел.

Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

		$sText = FileRead(@ScriptDir & '\test.txt')
		$sText = StringRegExpReplace($sText, '([\r\n]*$)', '')
		$aText = StringSplit(StringStripCR($sText), @LF)
		StringReplace($aText[1], ';', '')
		$i2D = @extended + 1
		Dim $aRes[$aText[0]][$i2D]
		For $i = 1 To $aText[0]
			$aTemp = StringSplit($aText[$i], ';')
			For $j = 1 To $aTemp[0]
				$aRes[$i - 1][$j - 1] = $aTemp[$j]
			Next
		Next
		$aText = 0
		$aTemp = 0

Global $iInput1
GUICreate('Тест', 450, 250, -1, -1, -1, $WS_CLIPCHILDREN)
$nInput1 = GUICtrlCreateInput('', 10, 10, 150, 20)
GUICtrlSetColor(-1, 0x505050)
$nOutput1 = GUICtrlCreateList('', 10, 40, 430, 200)


GUISetState()

While 1
	$CitySearch = GUICtrlRead($nInput1)
    Select
		Case $CitySearch <> $iInput1
			GUICtrlSetData($nOutput1, '')
			ConsoleWrite($CitySearch & @CRLF)
			$SearchResult = _ArrayFindAll($aRes, GUICtrlRead($nInput1) , 7, 0, 0, 1, 0) ; Поиск всех
			For $x = 0 to UBound($SearchResult)-1
				$CityIndex = $SearchResult[$x]
				$CityName = $aRes[$CityIndex][0]
				$pattern = '(?i)^' & $CitySearch

				CityAndOblAndCountryName()

			Next
			$iInput1 = $CitySearch
    EndSelect

    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd



Func CityAndOblAndCountryName()
	If StringRegExp($CityName, $pattern) And Not($aRes[$CityIndex][1] = '') Then

		;определяем область
		For $r = 0 to UBound($aRes) - 1
			If $aRes[$CityIndex - $r][1] = '' Then ; Если втрой столбец пустой то в первом столбце название области
				$OblIndex = $CityIndex - $r ; Индекс области
				$OblName = $aRes[$OblIndex][0] ; Название области
				ExitLoop ; выход из цикла
			EndIf
		Next

		;определяем страну
		For $t = 0 to UBound($aRes) - 1
			If ($OblIndex - $t) < 6 Then ExitLoop
			$CountryBul = $aRes[$OblIndex - $t][0]
			$CountryBul = StringStripWS($CountryBul, 8)
			$CountryBul = StringIsUpper($CountryBul)
			If $CountryBul = 1 Then
				$CountryIndex = $OblIndex - $t
				$CountryName = $aRes[$CountryIndex][0]
				ExitLoop
			EndIf
		Next

			If $CountryIndex = $OblIndex Then
				ConsoleWrite($CityIndex & ' ' & $CityName &  ' <-- ' & $CountryIndex & ' ' & $CountryName & @CRLF)
				GUICtrlSetData($nOutput1, $CityName &  ' <-- ' & $CountryName)
			Else
				ConsoleWrite($CityIndex & ' ' & $CityName &  ' <-- ' & $OblIndex & ' ' & $OblName &  ' <-- ' & $CountryIndex & ' ' & $CountryName  & @CRLF)
				GUICtrlSetData($nOutput1, $CityName &  ' <-- ' & $OblName &  ' <-- ' & $CountryName)
			EndIf

	Else
	EndIf
EndFunc
 

Вложения

  • test.txt
    58.9 КБ · Просмотры: 3

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Можно в массив "$aRes" добавить одно поле с наименованием страны, например "0", сместив все поля на 1 .Удобнее всего это делать при создании массива. Точно так же можно поступить и с регионом, добавив во второе поле наименование региона, сместив все данные ещё на одну позицию, тогда пр поиске совпадений не нужно будет регион в цикле искать. Надеюсь из примера ясно будет, вот :
Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$sText = FileRead(@ScriptDir & '\test.txt')
$sText = StringRegExpReplace($sText, '([\r\n]*$)', '')
$aText = StringSplit(StringStripCR($sText), @LF)
StringReplace($aText[1], ';', '')
$i2D = @extended + 2
Dim $aRes[$aText[0]][$i2D]
$CountryName = ''
For $i = 1 To $aText[0]
	$aTemp = StringSplit($aText[$i], ';')
	If StringIsUpper(StringStripWS($aTemp[1], 8)) Then $CountryName = $aTemp[1]
	$aRes[$i - 1][0] = $CountryName
	For $j = 1 To $aTemp[0]
		$aRes[$i - 1][$j] = $aTemp[$j]
	Next
Next

$aText = 0
$aTemp = 0

Global $iInput1
GUICreate('Тест', 450, 250, -1, -1, -1, $WS_CLIPCHILDREN)
$nInput1 = GUICtrlCreateInput('', 10, 10, 150, 20)
GUICtrlSetColor(-1, 0x505050)
$nInput2 = GUICtrlCreateList('', 10, 40, 300, 200)


GUISetState()

While 1
	$CitySearch = GUICtrlRead($nInput1)
	Select
		Case $CitySearch <> $iInput1
			GUICtrlSetData($nInput2, '')
			ConsoleWrite($CitySearch & @CRLF)
			$SearchResult = _ArrayFindAll($aRes, GUICtrlRead($nInput1), 7, 0, 0, 1, 1) ; Поиск всех
			For $x = 0 To UBound($SearchResult) - 1
				$CityIndex = $SearchResult[$x]
				$CityName = $aRes[$CityIndex][1]
				$pattern = '(?i)^' & $CitySearch

				CityAndOblAndCountryName()

			Next
			$iInput1 = $CitySearch
	EndSelect

	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd


Func CityAndOblAndCountryName()
	If StringRegExp($CityName, $pattern) And Not ($aRes[$CityIndex][2] = '') Then
		For $r = 1 To UBound($aRes) - 1
			$OblIndex = $CityIndex - $r
			$OblName = $aRes[$OblIndex][1]
			If $aRes[$OblIndex][2] = '' Then
				ExitLoop
			Else
			EndIf
		Next

		Local $CountryIndex
		Local $CountryName
		$CountryName = $aRes[$OblIndex][0]
		ConsoleWrite($CityIndex & ' ' & $CityName & ' <-- ' & $OblIndex & ' ' & $OblName & ' <-- ' & $CountryIndex & ' ' & $CountryName & @CRLF)
		GUICtrlSetData($nInput2, $CityName & ' <-- ' & $OblName & ' <-- ' & $CountryName)
	Else
	EndIf
EndFunc   ;==>CityAndOblAndCountryName
 
Верх