Что нового

Выполняется код без обращения к удаленным элементам

Rinfes

Новичок
Сообщения
25
Репутация
0
Здравствуйте. При совершении действий: нажатие кнопки "запуск новой генерации", далее нажатие кнопки или чекбокса, происходит ненужное выполнение кода(вызов функции или открытие окна сообщения), хотя обращение к участку кода не было.
p.s. обязательное условие, что новых GUI окон не должно появляться.

Код:
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <MsgBoxConstants.au3>

Global $hGUI_main, $iButton_1, $iButton_2, $iButton_3, $iText
Global $iRand1Button, $iRand1CheckBox, $iRand1ComboBox, $iRand1DateTime, $iRand1Input ; переменные для элементов в задании на "3"
Global $sPath_ini = @ScriptDir & "\conf.ini"

$hGUI_main = GUICreate("AutoIt", 500, 400)
$iButton_1 = GUICtrlCreateButton("Запуск новой генерации", 125, 100, 250, 75)
$iButton_2 = GUICtrlCreateButton("Запуск последней генерации", 125, 250, 250, 75)
$iButton_3 = GuiCtrlCreateButton("Инфо", 460, 370)
$iText = GUICtrlCreateLabel("Случайная генерация элементов управления", 110, 20, 350)

GuiCtrlSetFont($iText, 14, 550)

ControlFocus("AutoIt","", $iButton_3)
GUISetState()
; главное меню
While 1

   Switch GUIGetMsg()
	Case $GUI_EVENT_CLOSE
	  ExitLoop

	   Case $iButton_1

		   Generation() ; генерируем элементы

	   Case $iButton_2
		   MsgBox(0,"", "Нажата кнопка ""Запуск последней генерации""") ; восстанавливаем последнюю генерацию


	   Case $iButton_3
		   MsgBox(0, "", "Какая то информация")

   EndSwitch
WEnd

Func Generation()

Local $iEl_1, $iEl_2

GUICtrlDelete($iButton_1)
GUICtrlDelete($iButton_2)

$iEl_1 = 0
$iEl_2 = 1
;~ $iEl_1 = Random(0, 4, 1)
;~ $iEl_2 = Random(0, 4, 1)

;~ If $iEl_1 = $iEl_2 Then
;~    $iEl_2 = Random(0, 4, 1)
;~ EndIf

IniWrite($sPath_ini, "load1", "1", $iEl_1)
IniWrite($sPath_ini, "load1", "2", $iEl_2)

Select ; Выполняет участок кода при истинности условия в Case.

Case ($iEl_1 = 0 And $iEl_2 = 1) Or ($iEl_1 = 1 And $iEl_2 = 0) ; button and checkbox
   Gene1_1()
Case ($iEl_1 = 0 And $iEl_2 = 2) Or ($iEl_1 = 2 And $iEl_2 = 0) ; button and combobox
   Gene1_2()
Case ($iEl_1 = 0 And $iEl_2 = 3) Or ($iEl_1 = 3 And $iEl_2 = 0) ; button and date/time
   Gene1_3()
Case ($iEl_1 = 0 And $iEl_2 = 4) Or ($iEl_1 = 4 And $iEl_2 = 0) ; button and input
   Gene1_4()
Case ($iEl_1 = 1 And $iEl_2 = 2) Or ($iEl_1 = 2 And $iEl_2 = 1) ; chekbox and combobox
   Gene1_5()
Case ($iEl_1 = 1 And $iEl_2 = 3) Or ($iEl_1 = 3 And $iEl_2 = 1) ; checkbox and date/time
   Gene1_6()
Case ($iEl_1 = 1 And $iEl_2 = 4) Or ($iEl_1 = 4 And $iEl_2 = 1) ; checkbox and input
   Gene1_7()
Case ($iEl_1 = 2 And $iEl_2 = 3) Or ($iEl_1 = 3 And $iEl_2 = 2) ; combobox and date/time
   Gene1_8()
Case ($iEl_1 = 2 And $iEl_2 = 4) Or ($iEl_1 = 4 And $iEl_2 = 2) ; combobox and input
   Gene1_9()
Case ($iEl_1 = 3 And $iEl_2 = 4) Or ($iEl_1 = 4 And $iEl_2 = 3) ; date/time and input
   Gene1_10()
EndSelect

EndFunc

Func Gene1_1()
$iRand1Button = GuiCtrlCreateButton("Button", 50, 100, 100, 50)
$iRand1CheckBox = GUICtrlCreateCheckbox("CheckBox", 200, 120, 120, 20)
EndFunc


Чуть измененный код(убрано лишнее)
Код:
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <MsgBoxConstants.au3>

Global $hGUI_main, $iButton_1, $iButton_2, $iButton_3, $iText
Global $iRand1Button, $iRand1CheckBox

$hGUI_main = GUICreate("AutoIt", 500, 400)
$iButton_1 = GUICtrlCreateButton("Запуск новой генерации", 125, 100, 250, 75)
$iButton_2 = GUICtrlCreateButton("Пока ненужная кнопка", 125, 250, 250, 75)
$iButton_3 = GuiCtrlCreateButton("Инфо", 460, 370)
$iText = GUICtrlCreateLabel("Случайная генерация элементов управления", 110, 20, 350)

GuiCtrlSetFont($iText, 14, 550)

ControlFocus("AutoIt","", $iButton_3)
GUISetState()
; главное меню
While 1

   Switch GUIGetMsg()
	Case $GUI_EVENT_CLOSE
	  ExitLoop

	   Case $iButton_1

		   Generation() ; генерируем элементы

	   Case $iButton_2
		   MsgBox(0,"", "Нажата кнопка ""Пока ненужная кнопка""") ; восстанавливаем последнюю генерацию


	   Case $iButton_3
		   MsgBox(0, "", "Какая то информация")

   EndSwitch
WEnd

Func Generation()

Local $iEl_1, $iEl_2

GUICtrlDelete($iButton_1)
GUICtrlDelete($iButton_2)

$iRand1Button = GuiCtrlCreateButton("Button", 50, 100, 100, 50)
$iRand1CheckBox = GUICtrlCreateCheckbox("CheckBox", 200, 120, 120, 20)

EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Rinfes [?]
происходит ненужное выполнение кода
Слишком всё неясно в скрипте.
Нужен либо рабочий пример, либо полный скрипт (включая ini).
 
Автор
Rinfes

Rinfes

Новичок
Сообщения
25
Репутация
0
CreatoR
В шапку добавил код, в котором удалил то, что почти не нужно. Запись в файл в данный момент не нужна.
Увидеть проблему можно, если нажать на чекбокс. Там всплывет
Код:
MsgBox(0,"", "Нажата кнопка ""Пока ненужная кнопка""")
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Rinfes
Вы удаляете кнопки, но их идентификаторы в переменных остаются. Когда вы создаёте новый элемент, его идентификатор совпадает с идентификатором удалённого элемента, поэтому выполняется соответствующий Case
Код:
GUICtrlDelete($iButton_1)
$iButton_1 = -1 ; <= добавить
GUICtrlDelete($iButton_2)
$iButton_2 = -1 ; <= добавить
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Rinfes
А зачем удалять кнопки управления?
Если они динамические, то можно использовать режим OnEvent.
 
Автор
Rinfes

Rinfes

Новичок
Сообщения
25
Репутация
0
CreatoR
Кнопки не динамические. После одного нажатия больше не нужны. Если допустить, что динамические, то как сделать скрытие кнопок через OnEvent - я не разобрался.
Вроде как решилась проблема, использовав
Код:
GUICtrlSetState( $iButton_1, $GUI_HIDE)
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Ещё есть стиль кнопки - недоступная-серая. Удаление кнопки и появления не всегда красиво. Кнопка должна быть, но неактивная, как бы говорящая пользователю, что в данный момент выполняется какой то процесс или не созданы начальные условия для запуска.
 
Автор
Rinfes

Rinfes

Новичок
Сообщения
25
Репутация
0
А все же, почему удаленные кнопки заменяются созданными? Как то странно
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Rinfes
почему удаленные кнопки заменяются созданными
Не кнопки заменяются, а их идентификаторы. При удалении элемента его идентификатор освобождается и выдаётся следующему создаваемому элементу. Идентификаторы - это просто числа, которые вы храните в переменных.
Код:
GUICreate("")

$Button_1 = GUICtrlCreateButton("1", 1, 1)
ConsoleWrite("Идентификатор кнопки 1 = " & $Button_1 & @CRLF)
$Button_2 = GUICtrlCreateButton("2", 1, 1)
ConsoleWrite("Идентификатор кнопки 2 = " & $Button_2 & @CRLF)
$Button_3 = GUICtrlCreateButton("3", 1, 1)
ConsoleWrite("Идентификатор кнопки 3 = " & $Button_3 & @CRLF)

GUICtrlDelete($Button_2)
ConsoleWrite("Значение переменной $Button_2 = " & $Button_2 & @CRLF)

$Button_4 = GUICtrlCreateButton("4", 1, 1)
ConsoleWrite("Идентификатор кнопки 4 = " & $Button_4 & @CRLF)
 
Верх