1 (изменено: Malcev, 2012-02-17 14:04:51)

Тема: AHK: Как заменить переменной повторяющуюся часть скрипта.

В произвольных местах скрипта имею вот это

   loop
   {
      ImageSearch, x6, y6, 0, 0, 1000, 1200, C:\test\loaded.png   
      If ErrorLevel = 0
      {
         break
      }
   }

Как сделать так, чтобы каждый раз это не всовывать, а заменить переменной или функцией.

2

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

SameFuncName()
{
   global x6, y6
   Loop
   {
      ImageSearch, x6, y6, 0, 0, 1000, 1200, C:\test\loaded.png
      If !ErrorLevel
         Break
   }
}

3 (изменено: Malcev, 2012-02-17 14:44:33)

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

Несколько вопросов
1) Зачем добавлять?

global x6, y6

У меня просто там много различных ImageSearch с различными координатами.
Получается везде xn yn надо добавлять?
3) Как теперь вызвать эту функцию?
2) Имею вот это

send {tab 2}{right 4}{PgDn}

Как записать это в переменную, по типу

text := {tab 2}{right 4}{PgDn}
send %text%

4

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

SameFuncName() ; т.к. функция ни чего не возвращает, с начало вызов,
MsgBox, % "x: "x "`ny: "y "`nz: "z "`nz2: "z2 ; потом просмотр результата

SameFuncName()
{
   global z, z2 ; это глобальные переменные, их значения будут отображаться
   x:=2, y:=5 ; это локальные переменные, их зачения не будут отображаться
   z:=x*y, z2:=x//y
}
MsgBox, % SameFuncName() ; эта возвращает, по этому, сразу вызов и просмотр

SameFuncName()
{
   x:=2, y:=5
   z:=x*y, z2:=x/y
   Return, "x: "x "`ny: "y "`nz: "z "`nz2: "z2 ; это возвращаемый результат
;                           , тут все зачения переменныx будут отображаться
}

5

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

Malcev пишет:

Как записать это в переменную, по типу

text := {tab 2}{right 4}{PgDn}
send %text%
text:="{tab 2}{right 4}{PgDn}"
Send, % text

6

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

Спасибо!
Буду разбираться.

7 (изменено: Malcev, 2012-02-17 18:27:09)

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

Всё-таки я не понял
Вот полный мой повторяющийся код

   loop
   {
      ImageSearch, x6, y6, 0, 0, 1000, 1200, C:\boomtime\loaded.png   
      If ErrorLevel = 0
      {
         break
      }
   }
   ImageSearch, x5, y5, 0, 0, 1000, 1200, C:\boomtime\error.png
   If ErrorLevel = 0
   {
      SoundPlay, C:\boomtime\finish.mp3
      Return
   }
   ImageSearch, x4, y4, 0, 0, 1000, 1200, C:\boomtime\ocenena.png
   If ErrorLevel = 0
   {
      send !{f4} 
   }
   ImageSearch, x2, y2, 0, 0, 1000, 1200, C:\boomtime\ocenka.png
   If ErrorLevel = 0
   {
      send %ocenka%
      sleep, 500
      click %x2%, %y2%
      sleep, 1000
      ImageSearch, x3, y3, 0, 0, 1000, 1200, C:\boomtime\zakaz.png
      If ErrorLevel = 0 
      {
         sleep, 500
         send %pokupka%
         click %x3%, %y3%
         sleep, 500  
         send !{f4}
      } 
      Else  
      {
         send !{f4}
      }     
   }
   sleep, 500

Как мне оформить код, чтобы в конце скрипта сделать из этого функцию



SameFuncName()
{
   loop
   {
      ImageSearch, x6, y6, 0, 0, 1000, 1200, C:\boomtime\loaded.png   
      If ErrorLevel = 0
      {
         break
      }
   }
   ImageSearch, x5, y5, 0, 0, 1000, 1200, C:\boomtime\error.png
   If ErrorLevel = 0
   {
      SoundPlay, C:\boomtime\finish.mp3
      Return
   }
   ImageSearch, x4, y4, 0, 0, 1000, 1200, C:\boomtime\ocenena.png
   If ErrorLevel = 0
   {
      send !{f4} 
   }
   ImageSearch, x2, y2, 0, 0, 1000, 1200, C:\boomtime\ocenka.png
   If ErrorLevel = 0
   {
      send %ocenka%
      sleep, 500
      click %x2%, %y2%
      sleep, 1000
      ImageSearch, x3, y3, 0, 0, 1000, 1200, C:\boomtime\zakaz.png
      If ErrorLevel = 0 
      {
         sleep, 500
         send %pokupka%
         click %x3%, %y3%
         sleep, 500  
         send !{f4}
      } 
      Else  
      {
         send !{f4}
      }     
   }
   sleep, 500
}

А в середине вставить типа,

    loop
   {
      if (v1>Sr)
      {
         SoundPlay, C:\boomtime\finish.mp3
         Return
      }
      Else
      {
         mousemove, %h1%, %v1%
      }
      if A_Cursor != Unknown
      {
         v1 := v1+50
      }
      else
      {
         break
      }
   }
   click %h1%, %v1%
   sleep 500
   SameFuncName()

8

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

Malcev пишет:

Как мне оформить код...

Функция - очень удобно, но делать из всего кода одну большую функцию, нет необходимости. Если в коде присутствует однотипное действие, то его можно вынести в функцию. Нюансы можно подправить передачей нужных параметров. А так же, можно вызвать в параметрах любой команды, она может вызвать саму себя, возвратить результат/ы.

x1:=y1:=0, x2:=(y2:=1200)-200
Path:="c:\boomtime\", Tint:=""
/*
 оттенок (Tint) - щас отсутствует, если нужен, то, или
 инициализируем в переменную сразу (пример: Tint:="*120 "),
 или вписываем в параметр при вызове - примеры:
 SameFuncName(X, Y, 0, 0, 1000, 1200, "*90 ", "c:\same.png")
 или SameFuncName(X, Y, X1, Y1, X2, Y2, Tint, Path)
*/
...
Loop
   If !SameFuncName(x, y, x1, y1, x2, y2, "", Path "loaded.png")
      Break
If !SameFuncName(x, y, x1, y1, x2, y2, "", Path "error.png")
{
   SoundPlay, % Path "finish.mp3", 1
   Return
}
If !SameFuncName(x, y, x1, y1, x2, y2, "", Path "ocenena.png")
   Send, !{F4}
If !SameFuncName(x, y, x1, y1, x2, y2, "", Path "ocenka.png")
{
   Send, % ocenka
   Sleep, 500
   MouseClick,, x, y,, 0
   Sleep, 1000
   If !SameFuncName(x, y, x1, y1, x2, y2, "", Path "zakaz.png")
   {
      Sleep, 500
      Send, % pokupka
      MouseClick,, x, y,, 0
      Sleep, 500
      Send, !{F4}
   }
   Else
      Send, !{F4}
}
Sleep, 500
...

SameFuncName(ByRef OutX, ByRef OutY, X1, Y1, X2, Y2, Variation, FilePath)
{
   ImageSearch, OutX, OutY, X1, Y1, X2, Y2, % Variation . FilePath
   Return, ErrorLevel
}
Malcev пишет:

А в середине вставить типа...

?...

9

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

Grey, у меня вот этот код в скрипте появляется 20 раз

loop
   {
      ImageSearch, x6, y6, 0, 0, 1000, 1200, C:\boomtime\loaded.png   
      If ErrorLevel = 0
      {
         break
      }
   }
   ImageSearch, x5, y5, 0, 0, 1000, 1200, C:\boomtime\error.png
   If ErrorLevel = 0
   {
      SoundPlay, C:\boomtime\finish.mp3
      Return
   }
   ImageSearch, x4, y4, 0, 0, 1000, 1200, C:\boomtime\ocenena.png
   If ErrorLevel = 0
   {
      send !{f4} 
   }
   ImageSearch, x2, y2, 0, 0, 1000, 1200, C:\boomtime\ocenka.png
   If ErrorLevel = 0
   {
      send %ocenka%
      sleep, 500
      click %x2%, %y2%
      sleep, 1000
      ImageSearch, x3, y3, 0, 0, 1000, 1200, C:\boomtime\zakaz.png
      If ErrorLevel = 0 
      {
         sleep, 500
         send %pokupka%
         click %x3%, %y3%
         sleep, 500  
         send !{f4}
      } 
      Else  
      {
         send !{f4}
      }     
   }
   sleep, 500

Поэтому я и думал из всего него сделать функцию
Чтобы в нужных местах вызывать её, а не повторять эту простыню 20 раз.
Так как, если в нём что-то изменять, добавить sleep например, то легче сделать это один раз в функции, чем 20 раз в коде.

10

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

Ну раз не получается у вас собрать некую «функцию» используйте простой путь — Gosub.

11 (изменено: Malcev, 2012-02-18 18:31:13)

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

А вот тут можно поподробней?
Куда GoSub возвращается  после завершения, если обращение к ней у меня будет 20 раз?
Будет возвращаться в тот момент откуда обратились?

12 (изменено: creature.ws, 2012-02-18 19:53:46)

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

Malcev пишет:

А вот тут можно поподробней?
Куда GoSub возвращается  после завершения, если обращение к ней у меня будет 20 раз?
Будет возвращаться в тот момент откуда обратились?

Я ссылки привожу в расчёте на то, что информацию по ним таки прочитают

Jumps to the specified label and continues execution until Return is encountered.

Если есть некий Label («Метка» по-русски) начинающийся Label-name и заканчивающийся Return, то при обращении к этому Label с помощью GoSub вы́полнятся операции от Label-name до Return и выполнение скрипта продолжится от GuSub далее по коду (подробнее незнаю как расписать)
Абстрактный пример:

начало скрипта
1-е действие
2-е действие
3-е действие
4-е действие
конец выполнения
Return или ExitApp или Ничего

начало скрипта
1-е действие
Gosub НекаяМетка
4-е действие
конец выполнения
Return или ExitApp

НекаяМетка:
2-е действие
3-е действие
Return

Оба примера одинаковы по сути.
Для пользователя различия при использовании функций(|процедур) или Меток и GoSub заключается в «области видимости» переменных. При использовании меток имена переменных должны быть уникальны.

13 (изменено: Malcev, 2012-02-18 20:11:32)

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

Конечно же перед тем, как задать вопрос, я сходил по вашей ссылке, но там пока ещё слишком сложно написано для меня.
Сейчас понял.
Спасибо!

Для пользователя различия при использовании функций(|процедур) или Меток и GoSub заключается в «области видимости» переменных. При использовании меток имена переменных должны быть уникальны.

А что такое «области видимости»?
И что значит уникальны?
И зачем тогда нужны функции, если есть такая замечательная вещь, как Gosub?

14 (изменено: creature.ws, 2012-02-18 20:18:09)

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

Переменные в контексте функции
Сперва прочитайте
Переменные используемые в функциях «локальные» по умолчанию, в subroutines — «глобальные».
Заметьте — все ссылки ведут на официальную справку.

но там пока ещё слишком сложно написано для меня.

Если не пытаться решить вопрос самостоятельно «слишком сложно» будет почти всегда.

15

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

У меня такое чувство, что официальная справка создана для программистов, а не для рядовых пользователей.
Правильно ли я понял, что переменная используемая внутри Gosub действует только на Gosub?
Уникальные переменные это значит, что их названия не должны повторяться в других Gosub и вообще нигде больше в скрипте?
Если да, то почему?
И вы так и не ответили для чего нужны функции если есть Gosub?

16

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

Malcev пишет:

Grey, у меня вот этот код в скрипте появляется 20 раз...

У Вас уже есть всё под рукой, мало одной функции?, сделайте две, три..., лишбы как говорится - работало.

x1:=y1:=0, x2:=(y2:=1200)-200
Path:="c:\boomtime\", Tint:=""

...
Loop
{
   If (v1>Sr)
   {
      SoundPlay, % Path "finish.mp3", 1
      Return
   }
   Else
      MouseMove, h1, v1
   If (A_Cursor!="Unknown")
      v1:=v1+50
   Else
      Break
}
MouseClick,, h1, v1,, 0
Sleep, 500
SameFuncName()
...

SameFuncName()
{
   global
   Loop
      If !SameFuncName2(x, y, x1, y1, x2, y2, "", Path "loaded.png")
         Break
   If !SameFuncName2(x, y, x1, y1, x2, y2, "", Path "error.png")
   {
      SoundPlay, % Path "finish.mp3", 1
      Return
   }
   If !SameFuncName2(x, y, x1, y1, x2, y2, "", Path "ocenena.png")
      Send, !{F4}
   If !SameFuncName2(x, y, x1, y1, x2, y2, "", Path "ocenka.png")
   {
      Send, % ocenka
      Sleep, 500
      MouseClick,, x, y,, 0
      Sleep, 1000
      If !SameFuncName2(x, y, x1, y1, x2, y2, "", Path "zakaz.png")
      {
         Sleep, 500
         Send, % pokupka
         MouseClick,, x, y,, 0
         Sleep, 500
         Send, !{F4}
      }
      Else
         Send, !{F4}
   }
   Sleep, 500
}

SameFuncName2(ByRef OutX, ByRef OutY, X1, Y1, X2, Y2, Variation, FilePath)
{
   ImageSearch, OutX, OutY, X1, Y1, X2, Y2, % Variation . FilePath
   Return, ErrorLevel
}
Malcev пишет:

...зачем тогда нужны функции, если есть такая замечательная вещь, как Gosub?

Собственно на это уже было разъяснение:

Grey пишет:

...можно вызвать в параметрах любой команды, она может вызвать саму себя, возвратить результат/ы.

Можно почитать ещё тут, если хотите найти доскональный ответ.

17

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.


text:="{tab 2}{right 4}{PgDn}"
Send, % text

А получится представить таким же образом сразу несколько строк:


SetTimer, WinOnTop, 100
WinTtlCls = Capture
Gosub, RunRunRun

18

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

DD пишет:

А получится представить таким же образом сразу несколько строк:..

Нет, можно всё поместить на пример в функцию:

Capture:="test"
Space::Test()

WinOnTop:
   SoundBeep
   Return

RunRunRun:
   TrayTip,, % WinTtlCls
   Sleep, 750
   TrayTip
   Return

Test()
{
   global
   SetTimer, WinOnTop, -1000
   WinTtlCls:=Capture
   Gosub, RunRunRun
}

Ну максимум можно так:

SetTimer, WinOnTop, 100, WinTtlCls=Capture
Gosub, RunRunRun

19

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

Вроде понял  - мы вызываем функцию, которая вызывает другую функцию.
Спасибо!
Подниму свои вопросы, чтобы не затерялись.
Правильно ли я понял, что переменная используемая внутри Gosub действует только на Gosub?
Уникальные переменные это значит, что их названия не должны повторяться в других Gosub и вообще нигде больше в скрипте?
Если да, то почему?

20 (изменено: creature.ws, 2012-02-18 23:17:16)

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

Тема преисполненная цитатами справки и перефразированием справки.

Нет, не правильно. Даже не смотря на специфичность термина «действует»
GoSub - команда выполняющая переход к метке указанной в виде имени метки в качестве первого параметра команды GoSub.
Метку можно поставить в любой строке скрипта.
После перехода к данной метке выполнение продолжится от строки с именем метки до первого Return|Exit|ExitApp.
С переменными «внутри GoSub» (у GOSUB нет «внутри» с пользовательской точки зрения, это же команда) следует поступать так же, как и в остальном скрипте.

Я ответил на два ваших вопроса?

21 (изменено: Malcev, 2012-02-18 23:26:58)

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

Не совсем.
Про действие GoSub я всё понял после вашего примера.
Но вы меня чуть запутали вот этой фразой

Для пользователя различия при использовании функций(|процедур) или Меток и GoSub заключается в «области видимости» переменных. При использовании меток имена переменных должны быть уникальны.

Я так и не понял, что вы этим хотели сказать
Под этим

Для пользователя различия при использовании функций(|процедур) или Меток и GoSub заключается в «области видимости» переменных

вы подразумевали это?

функция похожа на подпрограмму (Gosub), отличаясь от нее только способностью принимать параметры (входные данные) от вызывающего оператора. Кроме того, функция при желании может возвращать значения вызывающему оператору.

И опять же - что же такое уникальные имена переменных?

22

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

Если вы «всё поняли» про действие Gosub, то мне нечего добавить к сказанному. Повторяться в четвёртый раз не буду, увольте

23

Re: AHK: Как заменить переменной повторяющуюся часть скрипта.

Ну и на том спасибо.