Что нового

Помогите связать чекбоксы и массивы

NONer

Новичок
Сообщения
27
Репутация
0
Здравствуйте. Дело вот в чем:
Есть xml-файл, в котором необходимо удалять ненужные документы, т.е. пользователь кликает, что ему не нужно, нажимает "Обработать" и в xml-файле выделенные записи удаляются.

Вот, что я хочу сделать:
1. Выбрать xml-файл.
2. Из этого файла выбрать все названия документов и вывести их Чекбоксами в окно программы
3. После нажатия кнопки "Обработать" выбрать отмеченные чекбоксы и удалить блоки <RequestedDoc>... название документа ...</RequestedDoc>
4. Перенумеровать попорядку новый список документов <Position>...</Position>
Всё.

Я смог выполнить только 2 пункта, в третьем пункте у меня проблема - не могу разобраться с массивами. Помогите сделать дальше.

Код:
#Region
#AutoIt3Wrapper_Icon=People_001.ico
#EndRegion ; Этот враппер добавит иконку окна в откомпилированный файл, для этого нужно нажать F7 в редакторе

; Подключение модулей
#include <GUIConstantsEx.au3> ; для графического интерфейса
#include <ButtonConstants.au3> ; Для работы с кнопками
#include <File.au3> ; Для работы с файлами и папками
#include <StaticConstants.au3> ; Для стилей вывода текста в окне
#Include <Array.au3> ; Для работы с массивами

; Переменные
$Text_Stroka = 70 ; Начальное значение строки для Чекбоксов
$Text_Height = 23 ; Расстояние между строками
$Title_Name = 'Обработка списка из XML-файла'
Local $File_Input, $Window_X, $Window_Y, $Text_Stroka, $Text_Height ; Обозначение переменных




$File_Input = FileOpenDialog ( 'Выберите XML-файл для обработки', @DesktopDir, 'XML File (*.xml)', 3) ; Выбор файла (и файл и путь к нему должны существовать)
If @error Then ; Если файл не был выбран
	Exit ; Выход из программы
EndIf

; Получение текста из файла
$File_XML = FileOpen($File_Input, 0) ; Открытие файла для чтения
$Text_XML = FileRead($File_XML) ; Копирование всего текста из файла для обработки
FileClose($File_Input) ; Закрытие файла

$Text_Document = StringRegExp($Text_XML, '(?s)<cat_ru:PrDocumentName>(.*?)</cat_ru:PrDocumentName>', 3) ; Получение массива - Названия документов
$Text_Kolvo = UBound($Text_Document) ; Количество документов
;_ArrayDisplay($Text_Document) ;отображаем


$Window_X = 650 ; Величина окна по X
$Window_Y = 150 + ($Text_Kolvo-1) * $Text_Height ; Величина окна по Y + количество документов из xml-файла

; Открытие главного окна
$Main_Form = GUICreate($Title_Name, $Window_X, $Window_Y, -1, -1) ; Главное окно в центре экрана с возможностью перетаскивания файлов
GUISetFont(10, 400, 0, 'Microsoft Sans Serif') ; Параметры шрифта - Стандартные


; Рамка - Примечание
$Border_Decription = GUICtrlCreateGroup('Описание', 10, 8, $Window_X-20, 40)
GUICtrlSetFont($Border_Decription, 8, 400, 0, 'Microsoft Sans Serif') ; Параметры шрифта рамки- Уменьшение
DllCall("UxTheme.dll", "int", "SetWindowTheme", "hwnd", GUICtrlGetHandle(-1), "wstr", 0, "wstr", 0) ; Возможность окрашивать цвет рамки
GUICtrlSetColor($Border_Decription, 0x666666)

$Text_Description = GUICtrlCreateLabel('Выберите пункты, которые необходимо удалить из списка и нажмите кнопку "Обработать".', 20, 22, $Window_X-45, 20) ; Текст описания

; Рамка - Примечание
$Border_Decription = GUICtrlCreateGroup('Список документов', 10, 53, $Window_X-20, $Window_Y-105)
GUICtrlSetFont($Border_Decription, 8, 400, 0, 'Microsoft Sans Serif') ; Параметры шрифта рамки- Уменьшение
DllCall("UxTheme.dll", "int", "SetWindowTheme", "hwnd", GUICtrlGetHandle(-1), "wstr", 0, "wstr", 0) ; Возможность окрашивать цвет рамки
GUICtrlSetColor($Border_Decription, 0x666666)



; Прописывание чекбоксов в главном окне                   -                   ЭТО ЯВНО НАДО ПЕРЕДЕЛАТЬ
For $i = 0 To $Text_Kolvo - 1 ; Для каждого из найденных документов в списке
	$Check_Doc = GUICtrlCreateCheckbox($Text_Document[$i], 20, $Text_Stroka) ; Сам чекбокс
	GUICtrlSetState(-1, $GUI_UNCHECKED) ; Чекбок не отмечен
	$Text_Stroka = $Text_Stroka + $Text_Height ; Переход на другую строку в главном окне
Next



; Кнопки
$But_Start = GUICtrlCreateButton('Обработать', $Window_X-220, $Window_Y-40, 100, 30) ; Кнопка - 'Выполнить'
$But_Cancel = GUICtrlCreateButton('Отмена', $Window_X-110, $Window_Y-40, 100, 30) ; Кнопка - 'Отмена'
$But_Exit = GUICtrlCreateButton('Закрыть', 9, $Window_Y-35, $Window_X-19, 25) ; Кнопка - 'Закрыть'
GUICtrlSetState($But_Exit, $GUI_HIDE) ; Скрыть кнопку


GUISetState() ; Сделать окно активным

; Запускается цикл опроса GUI до тех пор пока окно не будет закрыто
While 1
    ; Проверка нажатий клавиш
	Switch GUIGetMsg()
        ; -------------------------------------------------------------------------------------------------
		; Закрытие окна программы
		; -------------------------------------------------------------------------------------------------
		Case $GUI_EVENT_CLOSE
            Exit

		; -------------------------------------------------------------------------------------------------
		; Кнопка - 'Обработать'
		; -------------------------------------------------------------------------------------------------
		Case $But_Start



			MsgBox (64, '', 'Ok')



		; -------------------------------------------------------------------------------------------------
		; Кнопка - 'Отмена'
		; -------------------------------------------------------------------------------------------------
		Case $But_Cancel
            Exit ; Выход из программы

		; -------------------------------------------------------------------------------------------------
		; Кнопка - 'Закрыть'
		; -------------------------------------------------------------------------------------------------
		Case $But_Exit
            Exit ; Выход из программы

    EndSwitch
WEnd

; Завершение программы
Exit


Во вложении файл "001.txt" - это переименованный xml
Также добавил скриншот окна программы.
 

Вложения

  • 001.txt
    7.7 КБ · Просмотры: 7
  • Screenshot.png
    Screenshot.png
    42.4 КБ · Просмотры: 20

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Не могу разобраться с массивами

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Не могу разобраться с массивами" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Модератор.
 
Автор
N

NONer

Новичок
Сообщения
27
Репутация
0
В скрипте есть (должно быть) несколько массивов, в которых я, скорее всего, сделал ошибки. Из-за этого не могу продвинуться дальше.
Назвал тему "Не могу разобраться с массивами", т.е. в теме описал проблему...
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Для удобства обращения к CheckBox можно создать массив:
Код:
; Можно создать массив чекбоксов.
Dim $Check_Doc[$Text_Kolvo]
For $i = 0 To $Text_Kolvo - 1 ; Для каждого из найденных документов в списке
	$Check_Doc[$i] = GUICtrlCreateCheckbox($Text_Document[$i], 20, $Text_Stroka) ; Сам чекбокс
	GUICtrlSetState(-1, $GUI_UNCHECKED) ; Чекбок не отмечен
	$Text_Stroka = $Text_Stroka + $Text_Height ; Переход на другую строку в главном окне
Next
В дальнейшем при обработке кнопки $But_Start легко проверить состояние чекбоксов:
Код:
; -------------------------------------------------------------------------------------------------
			; Кнопка - 'Обработать'
			; -------------------------------------------------------------------------------------------------
		Case $But_Start

			;Чтение состояния всех чекбоксов
			For $i = 0 To UBound($Check_Doc) - 1
				If GUICtrlRead($Check_Doc[$i]) = $GUI_CHECKED Then
                 ;Дальше всё, что нужно выполнить при отмеченном чекбоксе
					MsgBox(0, '', GUICtrlRead($Check_Doc[$i], 1))
				EndIf
			Next
 
Автор
N

NONer

Новичок
Сообщения
27
Репутация
0
ra4o, большое спасибо! Код проверил - то, что надо.
Оказалось, что проблема была в определении переменной.

InnI, спасибо за подсказку.


Так, ну остальное попробую сам допилить.
Если у кого-то есть желание сделать пункты 3-4, буду счастлив :smile:
 
Верх