есть 3 таймерных кода, по которым есть вопросы
код 1:
globals
timerdialog TestDialog
endglobals
function Test1 takes nothing returns nothing
call BJDebugMsg("11")
//call DestroyTimerDialog(TestDialog)
call BJDebugMsg("22")
//if IsTimerDialogDisplayed(TestDialog) then
//call BJDebugMsg("true")
//endif
call BJDebugMsg("33")
endfunction
- цель - удалить все таймер-диалоги с экрана
- запуск -test1 из чата - получаем прекрасную выписку прохождения по коду 11 22 33
- если убрать "//" между 11 и 22 - то
- если перед запуском -test1 на экране не было таймер-диалога - карта частично перестает работать, выписка покажет 11 без 22
- если перед запуском -test1 на экране был 1 таймер-диалог - то он уничтожается - и дальше в карте всё работает как и должно, выписка покажет 11 22 33
- если перед запуском -test1 на экране было несколько таймер-диалогов - то уничтожается только последний созданный и дальше все работает как и должно, выписка 11 22 33
- если убрать "//" между 22 и 33 - то в выписке получим только 22, а вот 33 уже не отпишется
- если через функцию Test0 (запущенную из чата через -test0) создать и сразу удалить таймер, то это как бы "активирует" глобалку с таймером? и после этого в Test1 между 11 и 22 код не останавливается, между 22 и 33 код тоже не останавливается. то есть как будто глобалки инициализируются call InitGlobals() не перед полной загрузкой карты, а после первого присвоения значения. а пока значение ни разу не присвоено к TestDialog - то это вообще какой-то noname мимо проходил и никакого отношения к таймердиалогу не имел никогда
globals
timer t=CreateTimer()
timerdialog TestDialog
endglobals
function Test0 takes nothing returns nothing
TimerStart(t,60,false,null)
set TestDialog=CreateTimerDialogBJ(t,"Time")
call DestroyTimerDialog(TestDialog)
endfunction
вопросы:
1-1 как вообще использовать нативку IsTimerDialogDisplayed(TestDialog) ? если таймер-диалог показан на экране - то она выдаст "true", а если таймер не показан на экране то вместо выдачи "false" код тупо остановится и не пойдёт дальше выполняться. (но как описано в п.5 - код остановится только если в игре до этого не создавался ни один таймер)?
1-2 как всё-таки удалить хотя бы один (либо все имеющиеся на экране) таймер-диалог, если до запуска функции неизвестно показан он на экране или нет. для всех таймеров не нашел решение, а для одного существующего таймера подходит только два решения? call DestroyTimerDialog(GetLastCreatedTimerDialogBJ()) и DestroyTimerDialog(TestDialog) ?
1-1 как вообще использовать нативку IsTimerDialogDisplayed(TestDialog) ? если таймер-диалог показан на экране - то она выдаст "true", а если таймер не показан на экране то вместо выдачи "false" код тупо остановится и не пойдёт дальше выполняться. (но как описано в п.5 - код остановится только если в игре до этого не создавался ни один таймер)?
1-2 как всё-таки удалить хотя бы один (либо все имеющиеся на экране) таймер-диалог, если до запуска функции неизвестно показан он на экране или нет. для всех таймеров не нашел решение, а для одного существующего таймера подходит только два решения? call DestroyTimerDialog(GetLastCreatedTimerDialogBJ()) и DestroyTimerDialog(TestDialog) ?
код 2:
globals
timer t=CreateTimer()
timerdialog TestDialog=null
endglobals
function Test3 takes nothing returns nothing
TimerStart(t,60,false,null)
set TestDialog=CreateTimerDialogBJ(t,"Time")
endfunction
вопросы:
2-1 если создать несколько таких таймер-диалогов подряд через -test3 -test3 -test3, то т.к. у них один и тот же -null-handle (code handlerFunc), то к ним уже никак не обратиться и поштучно не удалить? (или все разом или поштучно через цикл)
2-1 если создать несколько таких таймер-диалогов подряд через -test3 -test3 -test3, то т.к. у них один и тот же -null-handle (code handlerFunc), то к ним уже никак не обратиться и поштучно не удалить? (или все разом или поштучно через цикл)
код 3:
call PauseTimer(t)
call DestroyTimer(t)
вопросы:
3-1 зачем перед удалением таймера его останавливают? это всё равно что перед написанием integer a = null сначала эту a обнулять - a = 0, т.е. бессмысленно?
3-1 зачем перед удалением таймера его останавливают? это всё равно что перед написанием integer a = null сначала эту a обнулять - a = 0, т.е. бессмысленно?
итого 4 вопроса:
1-1 - решение найдено в процессе написания этого вопроса - нужно правильно объявлять - timerdialog TestDialog=null
1-2 - решение найдено только для 1 шт, а не для всех
2-1 - решение найдено при поддержке Borodach - ответ такой же как и для вопроса 1-2 - можно работать только с последним окном (если мы никак не могли повлиять на процесс создания окон), а если могли повлиять - то можно работать со всеми окнами
3-1 - решение пока не найдено
1-1 - решение найдено в процессе написания этого вопроса - нужно правильно объявлять - timerdialog TestDialog=null
1-2 - решение найдено только для 1 шт, а не для всех
2-1 - решение найдено при поддержке Borodach - ответ такой же как и для вопроса 1-2 - можно работать только с последним окном (если мы никак не могли повлиять на процесс создания окон), а если могли повлиять - то можно работать со всеми окнами
3-1 - решение пока не найдено
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Borodach
Отредактирован host_pi
всё, что выше строки "// мы тут" нельзя редактировать по условию вопроса
в вопросе 2-1 таймер и окно уже заданы как и не подлежит изменению
у нас есть integer i . мы пишем i = 1 , i = 2 , i = 3 . по нормальной логике - i заменяется с 1 на 2, потом i заменяется с 2 на 3 - и в итоге у нас i = 3 , а варкрафт вместо замены просто сам создает три независимых i = 1 i = 2 i = 3 , потом мы пишем i = 0 , он одну i из трёх обнуляет, а у двух псевдо-i старые значения остаются. и это у него как то всё хранится
Отредактирован host_pi
только все 3 новых строчки с перехватом выше фразы "мы тут", т.е. этакое компромиссное решение
из чего делаю вывод по вопросу 2-1
2-1:
что после создания подряд трёх окон (при условии что во время создания мы рядом не стояли и переменную не копировали себе в массив) - мы не можем к ним никак обратиться и что-то с ними сделать. а можем только с самым последним созданным
выявлено опытным путём, что DestroyTimer(t) нежелательно пользоваться, т.к. после этой нативки надо заново создавать таймер, как мы это делали в инициализации глобалок через timer t=CreateTimer()
уничтожение таймерного окна не уничтожает и не останавливает сам таймер
т.е. окна не будет, а таймер продолжит тикать и будут срабатывать все привязанные к этому таймеру функции т.е. нужно уничтожать и окно и останавливать таймер
Отредактирован DazzleFirst
Если вызвать функцию дважды, то создаст 2 отдельных окна таймера привязанных к одному таймеру. Завершив таймер уничтожить можно будет только последнее окно, если первое небыло привязано к какой либо переменной, то оно (первое) утекает.
Отредактирован host_pi
Отредактирован Hate