Что нового

Автоматическое создание окон и автоматическое назначение переменных

fortages

Новичок
Сообщения
81
Репутация
3
Здравствуйте!
Помогите пожалуйста найти выход из ситуации...
Код кривой, но если заполнить вручную, то работает, проблемы начались на моменте, когда появилась необходимость автоматического создания страниц пользователем.
По сути - что-то вроде автоматической генерации.
c0c47d8250eb.png

Если вручную создать Х функций и все прописать - работает, но я не знаю, сколько может понадобиться страниц пользователю. Пользователь может ввести любое число и при этом количество созданных страниц должно равняться этому числу. Также есть модули (для простоты - просто кнопки, на которых будут свои функции), номера и значения которых увеличиваются с каждой страницей.
При этом еще и должны кнопки "Далее" и "Назад" корректно работать между страницами. :stars:

Но вот как это все автоматически генерировать (включая имена переменных) я не понимаю...
Пример, как оно должно работать для введенного числа "три":
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

; ------------------ основное окно -----------------

$Form = GUICreate("Вопрос", 249, 177, 510, 323)
$Input = GUICtrlCreateInput("", 48, 80, 145, 24)
$Label = GUICtrlCreateLabel("Сколько страниц создать?", 40, 24, 173, 44)
$OK = GUICtrlCreateButton("ОК", 32, 128, 75, 25)
$Cancel = GUICtrlCreateButton("Отмена", 128, 128, 75, 25)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Cancel
			Exit
		Case $OK
			MsgBox(0,"Сообщение:","Запрос на создание " & GUICtrlRead($Input) & " страниц принят")
			_CreatePage() 
			
	EndSwitch
WEnd
;-------------------- основное окно закончилось --------------------

;===================================================================
Func _CreatePage() ;создание первой страницы

$Page1 = GUICreate("Page1", 181, 218, 246, 129)
$Previous = GUICtrlCreateButton("Назад", 8, 184, 75, 25)
$Next = GUICtrlCreateButton("Далее", 96, 184, 75, 25)
$Message = GUICtrlCreateLabel("Страница 1", 16, 16, 159, 28)
$module1 = GUICtrlCreateButton("module 1", 16, 64, 75, 25)
$module2 = GUICtrlCreateButton("module 2", 16, 96, 75, 25)
$module3 = GUICtrlCreateButton("module 3", 16, 128, 75, 25)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Previous
			MsgBox(0,"Ошибка", "Вы находитесь на первой странице")
		Case $Next
			GUIDelete($Page1)
			_CreatePage2()

	EndSwitch
WEnd
EndFunc
;===================================================================
Func _CreatePage2() ;создание второй страницы

$Page2 = GUICreate("Page2", 181, 218, 246, 129)
$Previous = GUICtrlCreateButton("Назад", 8, 184, 75, 25)
$Next = GUICtrlCreateButton("Далее", 96, 184, 75, 25)
$Message = GUICtrlCreateLabel("Страница 2", 16, 16, 159, 28)
$module4 = GUICtrlCreateButton("module 4", 16, 64, 75, 25)
$module5 = GUICtrlCreateButton("module 5", 16, 96, 75, 25)
$module6 = GUICtrlCreateButton("module 6", 16, 128, 75, 25)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Previous
			GUIDelete($Page2)
			_CreatePage()
		Case $Next
			GUIDelete($Page2)
			_CreatePage3()

	EndSwitch
WEnd
EndFunc

;===================================================================
Func _CreatePage3() ;создание третьей страницы

$Page3 = GUICreate("Page3", 181, 218, 246, 129)
$Previous = GUICtrlCreateButton("Назад", 8, 184, 75, 25)
$Next = GUICtrlCreateButton("Далее", 96, 184, 75, 25)
$Message = GUICtrlCreateLabel("Страница 3", 16, 16, 159, 28)
$module7 = GUICtrlCreateButton("module 7", 16, 64, 75, 25)
$module8 = GUICtrlCreateButton("module 8", 16, 96, 75, 25)
$module9 = GUICtrlCreateButton("module 9", 16, 128, 75, 25)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Previous
			GUIDelete($Page3)
			_CreatePage2()
		Case $Next
			;_CreatePage4()
			MsgBox(0,"Сообщение", "Страница 4 и т.д.")

	EndSwitch
WEnd
EndFunc
А если пользователь введет какое-то большое число?
Можно ли все это как-то записать в условие или что-то такое сделать?

Когда писала на бумаге, то думала, что можно представить страницу как CurrentPage, а кнопки "Далее" и "Назад" как CurrentPage+1 или CurrentPage-1 и как-то так их считать... Только все равно не понимаю, как записать подобное условие, если от значения страницы меняется и имя переменной, и ее значение, например как тут:
Код:
$Page2 = GUICreate("Page2", 181, 218, 246, 129)
$Page3 = GUICreate("Page3", 181, 218, 246, 129)


Подобную задачу вообще решить как-то реально?
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
fortages
можно использовать другой подход. окно одно. создаются все элементы и делятся по моменту появления. то есть, для "первого окна" показаны первые элементы, при нажатии кнопки "далее", эти элементы скрываются и открываются новые, которые должны составлять "второе окно" .. ну и так далее
посмотри как я это реализовал http://autoit-script.ru/index.php?topic=21204.0
начиная со второго скрина. окно одно и то же, элементы создаются сразу, только часть их скрыта. посмотри в исходнике Jinstall.au3. Функции _Next() и _Back()
возможно, не самый лучший вариант, но как вариант для реализации :smile:
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
fortages
Задача тривиальна и представляет из себя двусвязный список. С полноценной его реализацией в AutoIt есть проблема - нельзя хранить указатели на переменные, но ведь есть структуры.

Однако есть более простое решение:
Все ваши страницы идентичны как я понимаю, различие лишь в действиях. Мне не известно о конечной задаче, но принцип я изложил в следующем примере: (минимум правок оригинального кода)

Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

; ------------------ основное окно -----------------

Global $NumberOfPages, $PageWindow, $Message, $CurrentPage = 1

Global $PagesInfo[4][3] = [ [ 2 ], _
	[ "Module 1 - 1", "Module 1 - 2", "Module 1 - 3" ], _
	[ "Module 2 - 1", "Module 2 - 2", "Module 2 - 3" ], _
	[ "Module 3 - 1", "Module 3 - 2", "Module 3 - 3" ] _
]

$Form = GUICreate("Вопрос", 249, 177, 510, 323)
$Input = GUICtrlCreateInput("", 48, 80, 145, 24)
$Label = GUICtrlCreateLabel("Сколько страниц создать?", 40, 24, 173, 44)
$OK = GUICtrlCreateButton("ОК", 32, 128, 75, 25)
$Cancel = GUICtrlCreateButton("Отмена", 128, 128, 75, 25)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Cancel
            Exit
        Case $OK
			$NumberOfPages = Int(GUICtrlRead($Input))
			If $NumberOfPages > 0 Then
				MsgBox(0,"Сообщение:","Запрос на создание " & $NumberOfPages & " страниц принят")
				_CreateWindow()
			EndIf
    EndSwitch
WEnd
;-------------------- основное окно закончилось --------------------

;===================================================================
Func _SetPage($Page)
	$CurrentPage = $Page
	WinSetTitle($PageWindow, "", "Page" & $Page)
	GUICtrlSetData($Message, "Страница " & $Page)
EndFunc

Func _CreateWindow() ;создание окна для размещения страниц

$PageWindow = GUICreate("Page1", 181, 218, 246, 129)
$Previous = GUICtrlCreateButton("Назад", 8, 184, 75, 25)
$Next = GUICtrlCreateButton("Далее", 96, 184, 75, 25)
$Message = GUICtrlCreateLabel("Страница 1", 16, 16, 159, 28)
$module1 = GUICtrlCreateButton("module 1", 16, 64, 75, 25)
$module2 = GUICtrlCreateButton("module 2", 16, 96, 75, 25)
$module3 = GUICtrlCreateButton("module 3", 16, 128, 75, 25)
GUISetState(@SW_SHOW)


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Previous
			If $CurrentPage == 1 Then
				MsgBox(0,"Ошибка", "Вы находитесь на первой странице", 0, $PageWindow)
			Else
				_SetPage($CurrentPage - 1)
			EndIf
        Case $Next
			If $NumberOfPages <= $CurrentPage Then
				MsgBox(0,"Ошибка", "Вы находитесь на последней странице", 0, $PageWindow)
			Else
				_SetPage($CurrentPage + 1)
			EndIf
		Case $module1
			If $CurrentPage <= $PagesInfo[0][0] Then
				MsgBox(64, "Module1", $PagesInfo[$CurrentPage][0])
			Else
				MsgBox(64, "Module1", "Действие не задано для этой страницы")
			EndIf
    EndSwitch
WEnd
EndFunc
 
Автор
fortages

fortages

Новичок
Сообщения
81
Репутация
3
joiner, firex спасибо за помощь! :smile: Кажется, теперь разобралась)
 
Верх