Что нового

Глобальные переменные и их влияние на ненаписание программы :) (вопрос)

hellm

Новичок
Сообщения
32
Репутация
1
Глобальные переменные решил вынести в отдельный файл с #Region (спасибо Yashied, пост http://autoit-script.ru/index.php?topic=3130.0), вот так:
Код:
#Region main frame glob
Global $hGUI_main
Global $mf_cat_add, $mf_cat_edi, $mf_cat_sav, $mf_cat_und, $mf_cat_red, $mf_cat_del, $mf_cat_sea
#EndRegion


Такого счастья еще пару раз.


Код:
_main_frame()       ; запуск основного окна программы
     While 1
		$aMsg = GUIGetMsg(1)

		Switch $aMsg[1]
			; main window
			Case $hGUI_main
				Switch $aMsg[0]               ; тут обработка кнопок первого окна
					Case $GUI_EVENT_CLOSE
						ExitLoop

					Case $mf_pur_in
						; код
					Case $mf_cat_add
						; код

					Case $mf_cat_edi     ; кнопка edit - пользуюсь для тестового запуска 2го окна
						_save_frame()  ; тут запускается второе окно
					Case $mf_cat_sav

					Case $mf_cat_und
					Case $mf_cat_red
					Case $mf_cat_del
					Case $mf_cat_sea
				EndSwitch
			; save window
			Case $hGUI_save                    ; обработка того самого второго 
				Switch $aMsg[0]
					Case $GUI_EVENT_CLOSE
;~ 						GUIDelete($hGUI_save)

					Case $sf_save        ; кнопка сохранения
						; код

					Case $sf_canc        ; кнопка отмены
;~ 						GUIDelete($hGUI_save)
				EndSwitch
		EndSwitch

    WEnd


Перед запуском цикла запускается первое окно, переменные(см. выше) инициализируются и все проходит на ура. Второе окно должно запускаться первый раз только после нажатия на кнопку edit(см. выше), до этого момента переменные для второго окна еще не инициализированны(хотя глобально определены). Тем не менее, программа запускает $sf_save или $sf_canc (смотря, что первое стоит) до нажатия на edit в первом окне. Вопрос такой: Как это решить?
 

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Вы попробуйте задать переменную так: Global $Var = -1
А то, GUIGetMsg(1) возвращает 0 (в Вашем случае 0 элемент массива) и переменная по умолчанию равна нулю = совпадение (как-будто нажата кнопка)
 
Автор
H

hellm

Новичок
Сообщения
32
Репутация
1
Сейчас поробую. Не знал, что GUIGetMsg видит 0. Переменным присваивал как раз 0 или пустое поле... :(


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

Ура!!! :laugh: Все работает. Спасибо большое!!
 

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
hellm [?]
Ура!!!
laugh.gif
Все работает. Спасибо большое!!

Всегда пожалуйста :smile:
 
Автор
H

hellm

Новичок
Сообщения
32
Репутация
1
Мда..., все не так просто, как хотелось бы. Вынес переменные в отдельный файл. Решил попробовать вынести одну константу, а на выходе предупреждение не предмет не задекларированности... :(

Это в головном файле(он цепляется в самом начале основной программы)
Код:
#Region constants
Global Const $glob_cols = 6
#EndRegion


Так выглядит, то на что пришется предупреждение.(другой файл)
Код:
Func bcr_get_catalog($hWnd)
	Local $i
	Dim $il[1], $aItemList[1][$glob_cols], $sIL[7]


А тут вообще ошибку выдает!(совсем другой файл)
Код:
Dim $aItem[1][$glob_cols] = 0
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
hellm
Вот я сделал два файла.
const.au3
Код:
#Region constants
Global Const $glob_cols = 6
#EndRegion

func.au3
Код:
Func bcr_get_catalog($hWnd)
    Local $i
    Dim $il[1], $aItemList[1][$glob_cols], $sIL[7]
    Sleep(100)
EndFunc

И главный скрипт
Код:
#include "const.au3"
#include "func.au3"

bcr_get_catalog(0)


При запуске главного скрипта ошибок нет. А вот если строчки с #include поменять местами, то будет ошибка, т.к. функция в скрипте окажется раньше константы. Вероятно и у вас что-то подобное.
 
Автор
H

hellm

Новичок
Сообщения
32
Репутация
1
Вот чудеса! Догадывался, что с порядком декларирования что-то не то, но чтоб там!?

Поменял все переменные и свои файлы местами и заработало.

Спасибо огромное!
 
Верх