Что нового

[Массивы] Массив для конкретной задачи

forbrock

Новичок
Сообщения
43
Репутация
0
Привет всем!
Скрипт печатает документы в файл из программы.
Привожу часть, где не могу разобраться с массивом:

Код:
#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]
выпадает в ошибку т.к. данного индекса не существует. Вроде бы присвоил (как я думал) новые значения $array2 старому массиву $array, но увы.
Как можно сделать выбор каждого района из массива выбранных?

Было бы неплохо если после выбора нескольких районов (например 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
 
Верх