Что нового

Переход между формами

Rioran

Everything is possible and achievable.
Сообщения
26
Репутация
2
Всем привет и хорошего настроения!

Подскажите, пожалуйста, оптимальную структуру кода для перехода между формами.

Стоит задача написать форму для меню/опций. По нажатию на разные кнопки меню: форма меню должна освободить память, а новая форма по нужной опции появиться.

Казалось бы, вопрос популярный, но Гугление "в лоб" результатов не дает. Предположу, что можно обернуть прогрузку формы в функцию. Тогда, вызывая конкретную функцию, можно вызывать "спрятанную" в неё форму. Проверил OnEvent режим: в функцию оборачиваться не хочет.
 
Автор
Rioran

Rioran

Everything is possible and achievable.
Сообщения
26
Репутация
2
InnI, спасибо за ссылку.

Я вижу, что в коде форумчанина CreatoR реализован следующий подход:

index.php

При этом одна из форм по умолчанию объявляется "Старшей", родительской. И переход к третьему меню либо невозможен, либо создаётся цепочка форм, в которой для возврата к первому меню нужно обязательно проходить через второе.

Интересует, можно ли в Au3 создать такую архитектуру, когда любое меню доступно из любого в один шаг, без создания цепочки зависимостей:

index.php
 

Вложения

  • AppMod01.jpg
    AppMod01.jpg
    79.6 КБ · Просмотры: 82
  • AppMod02.jpg
    AppMod02.jpg
    80.2 КБ · Просмотры: 82

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
Rioran [?]
любое меню доступно из любого в один шаг
Такой вариант
Код:
Global $hGUI, $Btn1, $Btn2

CreateGui("Main")

While 1
  Switch GUIGetMsg()
    Case $Btn1
      CreateGui(GUICtrlRead($Btn1))
    Case $Btn2
      CreateGui(GUICtrlRead($Btn2))
    Case -3
      Exit
  EndSwitch
WEnd

Func CreateGui($Caption)
  GUIDelete()
  Switch $Caption
    Case "Main"
      $hGUI = GUICreate("Main")
      $Btn1 = GUICtrlCreateButton("Form1", 10, 370, 50, 20)
      $Btn2 = GUICtrlCreateButton("Form2", 340, 10, 50, 20)
    Case "Form1"
      $hGUI = GUICreate("Form1")
      $Btn1 = GUICtrlCreateButton("Main", 10, 10, 50, 20)
      $Btn2 = GUICtrlCreateButton("Form2", 340, 10, 50, 20)
    Case "Form2"
      $hGUI = GUICreate("Form2")
      $Btn1 = GUICtrlCreateButton("Main", 10, 10, 50, 20)
      $Btn2 = GUICtrlCreateButton("Form1", 10, 370, 50, 20)
  EndSwitch
  GUISetState()
EndFunc
 
Автор
Rioran

Rioran

Everything is possible and achievable.
Сообщения
26
Репутация
2
InnI, потрясающе. Этот код достоин детального изучения. Есть пара синтаксических моментов, пока попробую разобраться сам.
 
Автор
Rioran

Rioran

Everything is possible and achievable.
Сообщения
26
Репутация
2
Прокомментировал код и внёс косметические изменения:

Код:
#include <GUIConstantsEx.au3>
#include <GuiConstants.au3>

; Переменные, описывающие форму

Global $hGUI ; Для обращения к форме
Global Const $hGUI_H = 70 ; Высота
Global Const $hGUI_W = 160 ; Ширина

; Переменные, описывающие кнопки

Global $Btn1 ; Для работы с кнопками
Global $Btn2 ; Для работы с кнопками
Global Const $Btn_H = 20  ; Высота кнопок
Global Const $Btn_W = 50  ; Ширина кнопок
Global Const $Btn_X = 10  ; Положение кнопок по горизонтали
Global Const $Btn_Y1 = 10 ; Положение первой кнопки по вертикали
Global Const $Btn_Y2 = 40 ; Положение второй кнопки по вертикали

CreateGui("Main") ; Создание первой формы согласно названию.

;Основной цикл.
While 1
   ; Отслеживаем события графического интерфейса
   Switch GUIGetMsg()
	  ; Если была нажата одна из 2-х кнопок, пересоздаём форму в соответствии с надписью на кнопке
	  Case $Btn1
		 CreateGui(GUICtrlRead($Btn1))
	  Case $Btn2
		 CreateGui(GUICtrlRead($Btn2))
	  ; Если нажата клавиша выхода, прерываем программу
	  Case -3
		 Exit
   EndSwitch
WEnd

; Функция создания формы в зависимости от посылаемой в функцию строки.
Func CreateGui($Caption)
   GUIDelete() ; Удаление старой формы
   Switch $Caption
	  Case "Main"
		 Form_GUI_Main()
	  Case "Form1"
		 Form_GUI_Form1()
	  Case "Form2"
		 Form_GUI_Form2()
   EndSwitch
   GUISetState() ; Используется аргумент по умолчанию - отобразить активную скрытую форму
EndFunc

; Несколько функций по созданию конкретных страниц.

Func Form_GUI_Main()
   $hGUI = GUICreate("Main", $hGUI_W, $hGUI_H)
   $Btn1 = GUICtrlCreateButton("Form1", $Btn_X, $Btn_Y1, $Btn_W, $Btn_H)
   $Btn2 = GUICtrlCreateButton("Form2", $Btn_X, $Btn_Y2, $Btn_W, $Btn_H)
EndFunc

Func Form_GUI_Form1()
   $hGUI = GUICreate("Form1", $hGUI_W, $hGUI_H)
   $Btn1 = GUICtrlCreateButton("Main",  $Btn_X, $Btn_Y1, $Btn_W, $Btn_H)
   $Btn2 = GUICtrlCreateButton("Form2", $Btn_X, $Btn_Y2, $Btn_W, $Btn_H)
EndFunc

Func Form_GUI_Form2()
   $hGUI = GUICreate("Form2", $hGUI_W, $hGUI_H)
   $Btn1 = GUICtrlCreateButton("Main",  $Btn_X, $Btn_Y1, $Btn_W, $Btn_H)
   $Btn2 = GUICtrlCreateButton("Form1", $Btn_X, $Btn_Y2, $Btn_W, $Btn_H)
EndFunc



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

Спасибо, InnI, плюс в карму, вопрос темы решён.
 
Верх