1

Тема: AHK: Продолжение работы скрипта после OnMessage

Нужно сделать так, чтобы после включения скрипта, он ждал OnMessage, а после получения переходил к Block1, и при этом сохранилось значение x1


OnMessage(0xC, "GetText")
GetText(wParam, lParam, msg, hwnd)
{
    Params := StrGet(lParam)
	MsgBox %Params%
    StringSplit, Param, Params, |
	x1:=Param1
}

Goto block1

Block1:
    Msgbox, %x1%
	Goto Block1

2

Re: AHK: Продолжение работы скрипта после OnMessage

Объявите "x1" глобальной, а переход к метке поместите внутрь функции.


Global x1
OnMessage(0xC, "GetText")
GetText(wParam, lParam, msg, hwnd)
{
    Params := StrGet(lParam)
	MsgBox %Params%
    StringSplit, Param, Params, |
	x1:=Param1
	Goto block1
}

Block1:
    Msgbox, %x1%
	Goto Block1

3

Re: AHK: Продолжение работы скрипта после OnMessage

KusochekDobra Пишет "Error: Cannot jump from inside a function to outside", указывая на строчку

Goto block1

4

Re: AHK: Продолжение работы скрипта после OnMessage


OnMessage(0xC, "GetText")
Return

Block1:
    Msgbox, %x1%
    Return

GetText(wParam, lParam, msg, hwnd)
{
    global x1
    Params := StrGet(lParam)
    MsgBox %Params%
    StringSplit, Param, Params, |
    x1:=Param1
    SetTimer, Block1, -250
}

5

Re: AHK: Продолжение работы скрипта после OnMessage

Виноват, не проверил.

"GoTo" - не пользуюсь. Опасная штука. Злоупотребление грозит превратить код в "макароны". Советую избегать его употребления чуть более, чем вообще, организуя подобное поведение циклами и таймерами.

6

Re: AHK: Продолжение работы скрипта после OnMessage

Что касается выхода из функции через GoTo, то это просто нелогично. Функция должна вернуться к тому, кто её вызвал. Может и время возврата иметь значение. А в каких-то ситуациях GoTo удобно. Например, при ветвлении, где в конце нескольких веток нужно выполнить один и тот же код. Чтобы не прописывать его несколько раз, можно прыгать на метку с ним. Другой случай — реакция на ошибки после вызова нескольких подряд функций с освобождением каких-то создаваемых для них или получаемых от них ресурсов.


call func_1
if error goto err_1
call func_2
if error goto err_2
call func_3
if error goto err_3
...
...
err_3:
    free res_3
err_2:
    free res_2
err 1:
    free res_1

В результате освобождение каждого ресурса прописано только один раз. А если писать это после каждого вызова, то они повторяются и нагромождаются, что может побудить просто забить на это дело.

7

Re: AHK: Продолжение работы скрипта после OnMessage

Вполне. Я просто ещё не доходил своим разумением до таких тонкостей, стараясь пользовать стандартные принципы, которые в своей реализации сами беспокоятся об освобождении ресурсов, а то, что я таки инкрементирую в работу, удаляю/освобождаю в оконцове, перед "ExitApp".

Мало опыта, мало практики, что подталкивает в первую очередь преследовать вопросы функциональности, а не оптимизации и тут я не могу похвастаться необходимостью использования "GoTo". Наоборот, когда мне впервые попался на глаза этот оператор, меня соблазнила элементарная простота возможности попасть из текущего места в любое другое. Что я творил... Ужас! И потом мне было чрезвычайно сложно перейти пониманием к концепции циклов, что сейчас кажется даже смешным, но то была та ещё палка в колесе. Это как если бы одна нога была всю жизнь короче, от чего походка была бы хромой, а потом сделали операцию, откорректировав возможность правильного позиционирования, но в силу инерции походка всё равно повторяет моторику предыдущего опыта.

Не подумайте пожалуйста, что я противник "GoTo", я лишь говорю, что им не стоит пользоваться там, где без него можно легко обойтись и в своей нынешней практике, я не помню ни одного момента, где мне бы категорично требовалось его применение. Поэтому, говоря, что я им не пользуюсь, подразумеваю слово вообще.

В конце концов, программирование - это творчество, в котором результат достижим различными способами и обходиться без "GoTo" = один из них.

8

Re: AHK: Продолжение работы скрипта после OnMessage

YMP можно еще короче:

call func_1
if error err_1 := true
call func_2
if error err_2 := true
call func_3
err_3 := error ? true :
...
...
if err_3 free res_3
if err_2 free res_2
IfEqual err_1, 1, free res_1

9

Re: AHK: Продолжение работы скрипта после OnMessage

stealzy, так если после первого вызова ошибка, второго и т.д. быть уже не должно.

10

Re: AHK: Продолжение работы скрипта после OnMessage

Да и освобождение должно быть последовательным. Как сделать красиво не представляю.