Привет всем!
Скрипт печатает документы в файл из программы.
Привожу часть, где не могу разобраться с массивом:
Функции, которые запускают ГУИ представлены ниже:
Когда выбираю диапазон районов (не совсем правильно назвал, скорее несколько районов) получаю ошибку.
Мне нужно будет отработать каждый выбранный район по отдельности.
А
выпадает в ошибку т.к. данного индекса не существует. Вроде бы присвоил (как я думал) новые значения $array2 старому массиву $array, но увы.
Как можно сделать выбор каждого района из массива выбранных?
Было бы неплохо если после выбора нескольких районов (например 6501, 6506, 6519) определился бы новый массив $array2[3] = [1,6,19], но как это сделать, я не знаю.
Добавлено:
Все таки получилось переназначить массив, было много лишнего. Вот и не работало. Возможно не совсем понятно описал желаемое.
Работает в таком вот виде:
Скрипт печатает документы в файл из программы.
Привожу часть, где не могу разобраться с массивом:
Код:
#include <GUIConstants.au3>
#include <ComboConstants.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>
#include <GUIListBox.au3>
#include <Date.au3>
#include <Array.au3>
Opt('TrayIconDebug',1)
Dim $c,$v,$date,$dd,$rnd,$reestr,$folder_path,$folder_date,$swraj,$file_swraj,$line,$search,$box,$counter
Dim $single_region,$range_region,$single_region_flag,$range_region_flag
Dim $array[23] = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23] ;Массив если выбраны все районы
Dim $array1[23] = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23] ;Массив если выбран отдельный район
Dim $array2[1] = [0]
Global $GUI1=0, $GUI2=0, $List
;~ Запуск GUI
Gui_start()
$counter = 0
If $range_region_flag = True Then
$array2 = _GUICtrlListBox_GetSelItemsText(ControlGetHandle($GUI2, "", $List))
$array = $array2
EndIf
For $v in $array
Acces_to_swraj()
$exit_flag = False
;~ Обработка отдельно выбранного района из массива
If $single_region_flag = True Then
$single_region = StringRight($single_region,2)
_ArraySort($array1)
$key_index = _ArrayBinarySearch($array1,$single_region)
$v = $array1[$key_index]
$exit_flag = True
EndIf
;~ ПРОБЛЕМА ЗДЕСЬ!
;~ Обработка нескольких выбранных районов из массива
If $range_region_flag = True Then
$range_region = $array[$v]
$range_region = StringRight($range_region,2)
MsgBox(0,'range_region: ',$range_region)
_ArraySort($array)
_ArrayDisplay($array)
$key_index = _ArrayBinarySearch($array,$range_region)
MsgBox(0,'key_index: ',$key_index)
$v = $array[$key_index]
$exit_flag = True
EndIf
;~ Блок создания переменной для номера района (отнимает 1 и/или добавляет '0' к началу цифры, если $v <= 10)
If $v < '10' Then
$c = '0' & $v
Else
$c = $v
EndIf
Next
Код:
Func Gui_start()
Local $str
;=== GUI1 ===
$GUI1 = GUICreate('Печать реестров vTest', 250, 250) ;Создание GUI (окна ввода даты)
GUICtrlCreateLabel('Введите дату', 10, 20, 120)
$date = GUICtrlCreateDate(@MDAY & '\' & @MON & '\' & @YEAR, 120, 20, 120, 20, 0x00)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlCreateGroup('Настройки', 8, 60, 235, 140)
$radio_1 = GUICtrlCreateRadio('Отдельный район', 15, 80, 110, 20)
$radio_2 = GUICtrlCreateRadio('Диапазон районов', 15, 100, 115, 20)
$radio_3 = GUICtrlCreateRadio('Все районы', 15, 120, 100, 20)
$combo_1 = GUICtrlCreateCombo('', 150, 77, 80, 15, $CBS_DROPDOWNLIST)
$btn_radio_2 = GUICtrlCreateButton('Выбрать', 150, 102, 80, 20)
$nCh1 = GUICtrlCreateCheckbox('Печать во временный каталог', 55, 150, 175, 20, $BS_RIGHTBUTTON)
$nCh2 = GUICtrlCreateCheckbox('Удалить содержимое TMP', 55, 170, 175, 20, $BS_RIGHTBUTTON)
;~ "GUICtrlSetTip" - Функция для установки подсказок:
GUICtrlSetTip($nCh1, 'Печать отчетов во временный каталог ..\reestr\test')
GUICtrlSetTip($nCh2, 'Удалить содержимое временного каталога ..\reestr\test')
GUICtrlSetData($combo_1, '6501|6502|6503|6504|6505|6506|6507|6508|6509|6510|6511|6512|6513|6514|6515|6516|6517|6518|6519|6520|6521|6522|6523')
GUICtrlSetState($radio_3, $GUI_CHECKED + $GUI_DEFBUTTON)
GUICtrlSetState($combo_1, $GUI_DISABLE)
GUICtrlSetState($btn_radio_2, $GUI_DISABLE)
GUICtrlCreateGroup('', -99, -99, 1, 1) ;Зарытие группы
$btn_ok = GUICtrlCreateButton('Ok', 30, 210, 80, 30)
$btn_cencel = GUICtrlCreateButton('Cencel', 140, 210, 80, 30)
GUISetState()
;=== gui1 ===
;=== GUI2 ===
$GUI2 = GUICreate("", 140, 250)
$List = GUICtrlCreateList("", 5, 5, 130, 200, BitOR($LBS_MULTIPLESEL, $GUI_SS_DEFAULT_LIST))
For $i = 6501 To 6523
GUICtrlSetData($List, $i)
Next
$AllValues = GUICtrlCreateCheckbox("Выбрать все", 5, 200, 130, 20)
$BtnValues = GUICtrlCreateButton("Значения", 5, 220, 70, 25)
$BtnValues_ok = GUICtrlCreateButton("OK", 80, 220, 55, 25)
;=== gui2 ===
GUIRegisterMsg($WM_MOVE, "WM_MOVE")
While 1
$aMsg = GUIGetMsg(1)
Switch $aMsg[0]
Case $GUI_EVENT_CLOSE, $btn_cencel
If $aMsg[1] = $GUI1 Then
Exit
ElseIf $aMsg[1] = $GUI2 Then
GUISetState(@SW_HIDE, $GUI2)
EndIf
Case $btn_ok
$dd = String(GUICtrlRead($date, 1))
$var_combo_1 = GUICtrlRead($combo_1)
$var_btn_radio_2 = $str
$state_combo_1 = GUICtrlGetState($combo_1)
$state_btn_radio_2 = GUICtrlGetState($btn_radio_2)
If $state_combo_1 = '80' And $var_combo_1 <> '' Then
$single_region_flag = True
$range_region_flag = False
$single_region = $var_combo_1
$message = MsgBox(4, 'Проверка параметров', 'Введена дата: ' & StringLeft($dd, 2) & '\' & StringMid($dd, 4, 2) & '\' & StringRight($dd, 4) & @CRLF _
& 'Выбраны районы: ' & $var_combo_1)
ElseIf $state_btn_radio_2 = '80' And $var_btn_radio_2 <> '' Then
$range_region_flag = True
$single_region_flag = False
$range_region = $var_btn_radio_2
$message = MsgBox(4, 'Проверка параметров', 'Введена дата: ' & StringLeft($dd, 2) & '\' & StringMid($dd, 4, 2) & '\' & StringRight($dd, 4) & @CRLF _
& 'Выбраны районы: ' & @CRLF & $var_btn_radio_2)
Else
$single_region_flag = False
$range_region_flag = False
$single_region = ''
$range_region = ''
$message = MsgBox(4, 'Проверка параметров', 'Введена дата: ' & StringLeft($dd, 2) & '\' & StringMid($dd, 4, 2) & '\' & StringRight($dd, 4) & @CRLF _
& 'Выбраны районы: Все')
EndIf
If $message = 6 Then
ExitLoop
EndIf
Case $radio_1
GUICtrlSetState($combo_1, $GUI_ENABLE)
GUICtrlSetState($btn_radio_2, $GUI_DISABLE)
Case $radio_2
GUICtrlSetState($btn_radio_2, $GUI_ENABLE)
GUICtrlSetState($combo_1, $GUI_DISABLE)
Case $btn_radio_2
GUISetState(@SW_SHOW, $GUI2)
WM_MOVE($GUI1, 0, 0, 0)
Case $AllValues
If BitAND(GUICtrlRead($AllValues), $GUI_CHECKED) Then
_GUICtrlListBox_SelItemRange($List, 0, _GUICtrlListBox_GetCount($List) - 1, True)
Else
_GUICtrlListBox_SelItemRange($List, 0, _GUICtrlListBox_GetCount($List) - 1, False)
EndIf
Case $BtnValues
$str = ""
$Items = _GUICtrlListBox_GetSelItemsText(ControlGetHandle($GUI2, "", $List))
If $Items[0] = 0 Then
MsgBox(0, "Значения", "Ничего не выбрано")
Else
For $i = 1 To $Items[0]
$str &= $Items[$i] & @CRLF
Next
MsgBox(0, "Значения", $str)
EndIf
Case $BtnValues_ok
$str = ""
$Items = _GUICtrlListBox_GetSelItemsText(ControlGetHandle($GUI2, "", $List))
If $Items[0] = 0 Then
MsgBox(0, "Значения", "Ничего не выбрано")
Else
For $i = 1 To $Items[0]
$str &= $Items[$i] & @CRLF
Next
GUISetState(@SW_HIDE, $GUI2)
EndIf
Case $List
GUICtrlSetState($AllValues, $GUI_UNCHECKED)
Case $radio_3
GUICtrlSetState($combo_1, $GUI_DISABLE)
GUICtrlSetState($btn_radio_2, $GUI_DISABLE)
EndSwitch
WEnd
EndFunc
Func WM_MOVE($hWnd, $Msg, $wParam, $lParam)
If Not BitAND(WinGetState($GUI2), 2) Then
Return $GUI_RUNDEFMSG
EndIf
Local $aPos1 = WinGetPos($GUI1)
Local $aPos2 = WinGetPos($GUI2)
If $hWnd = $GUI1 Then
WinMove($GUI2, "", $aPos1[0] + $aPos1[2] + 10, $aPos1[1])
ElseIf $hWnd = $GUI2 Then
WinMove($GUI1, "", $aPos2[0] - $aPos1[2] - 10, $aPos2[1])
EndIf
EndFunc
Когда выбираю диапазон районов (не совсем правильно назвал, скорее несколько районов) получаю ошибку.
Мне нужно будет отработать каждый выбранный район по отдельности.
А
Код:
$v = $array[$key_index]
Как можно сделать выбор каждого района из массива выбранных?
Было бы неплохо если после выбора нескольких районов (например 6501, 6506, 6519) определился бы новый массив $array2[3] = [1,6,19], но как это сделать, я не знаю.
Добавлено:
Сообщение автоматически объединено:
Все таки получилось переназначить массив, было много лишнего. Вот и не работало. Возможно не совсем понятно описал желаемое.
Работает в таком вот виде:
Код:
$counter = 0
If $range_region_flag = True Then
$array2 = _GUICtrlListBox_GetSelItemsText(ControlGetHandle($GUI2, "", $List))
_arrayDelete($array2,0)
$array = $array2
EndIf
For $v in $array
Acces_to_swraj()
$exit_flag = False
;~ Обработка отдельно выбранного района из массива
If $single_region_flag = True Then
$single_region = StringRight($single_region,2)
_ArraySort($array1)
_ArrayDisplay($array1)
$key_index = _ArrayBinarySearch($array1,$single_region)
$v = $array1[$key_index]
$exit_flag = True
EndIf
;~ Обработка нескольких выбранных районов из массива
If $range_region_flag = True Then
$v = StringRight($v,2)
$v = Int($v)
EndIf
;~ Блок создания переменной для номера района (отнимает 1 и/или добавляет '0' к началу цифры, если $v <= 10)
If $v < '10' Then
$c = '0' & $v
Else
$c = $v
EndIf
;~ Сохранение даты в формате 2000-01-31
$folder_date = StringRight($dd,4) & Stringmid($dd,4,2) & StringLeft($dd,2)
;~ Полный путь для сохранения реестров
$folder_path = $reestr & '\65' & $c & '\' & $folder_date
If $exit_flag = True Then ExitLoop
Next