Proc
Описание
Позволяет выделить участок кода в отдельную процедуру и вызвать ее передавая параметры. Процедуры имеют отдельную область видимость переменных относительно скриптов.
Синтаксис
Привязка к окну: нет.
Работа со свернутым окном: да.
Вызов процедуры:
call <имя_процедуры> <передаваемый параметр1> <передаваемый параметр2>...<передаваемый параметрN>
Тело процедуры:
proc <имя процедуры> <переменная для приема параметра1><переменная для приема параметра2>...<переменная для приема параметраN>
<ваш код>
end_proc
set #a 1 set #b 2 call test #a #b proc test #a1 #b1 msg #a1 #b1 end_proc
В этом коде переменные #a и #b будут переданы в процедуру под именами #a1 и #b1. Исходные переменные для процедуры будут невидимы, т.к. она по сути является параллельным независимым скриптом. Для обращения к другим скриптам внутри процедуры и возвращения результата необходимо использовать ссылки на параллельные скрипты:
<имя_переменной.номер_вкладки> #a.3 - сслыка на переменную #a в третьей вкладки скрипта.
Для возвращения результата используйте передачу переменной current_script.
Примеры
// Пример 1 set #a 10 set #b 13 call plus #a #b //передаём в процедуру 2 переменные msg $plus //вернули в скрипт результат из процедуры, обратите внимание переменная имеет тоже имя что процедура End_script proc plus #x #y //в процедуре переданные переменные будут с именами #x #y, хотя можно и также было назвать #a #b set #z #x + #y //сложим эти переменные set $result #z //присвоим зарезервированной переменной '$result' результат сложения, чтобы вернуть его в скрипт end_proc
// Пример 2 // Проверяем цвет в точке и время ожидания, если цвет будет отсутствовать 5 секунд будет сообщение об этом call proverka 351 278 14320907 5000 //передаём в процедуру X Y Color Timeout if $proverka = 1 //проверяем вышло ли время для ожидания цвета или нет msg Время вышло, прошло timer мсек //что делать если время вышло End_script end_if msg Цвет найден, прошло timer мсек End_script proc proverka #x #y #c #time while_not #x #y #c //проверяем пока не найдётся нужный цвет if timer > #time //проверяем не вышло ли время set $result 1 //если вышло назначаем переменную break //выходим из while и процедуры end_if end_while end_proc
// Пример 3 set #cfound 0 // переменная для получение результатов поиска call checkcolor 969, 64 1251183 if #cfound = 1 msg Цвет найден! else msg Цвет не обнаружен! end_if end_script // Проверяет в текущем рабочем окне пиксель с координатами #x, #y на соответствие цвету #c. // Результат: глобальная переменная скрипта #cfound=1, если цвет найден; #cfound=0, если не найден proc checkcolor #x #y #c set #cs current_script set #a findcolor (#x, #y #x, #y 1 1 #c %arr workwindow.#cs ) if #a > 0 set #cfound.#cs 1 else set #cfound.#cs 0 end_if end_proc
Смотрите также
История развития
1.03 beta 4
Добавил команды для работы с процедурами. call <имя> // Вызов процедуры. процедура с указанным именем ищется сначала в текущем скрипте, а затем, если не найдена, в "файле процедур" - скрипт с номером 99. Загрузить туда что-либо можно с помощью соответствующего пункта меню. Поддерживается вложенный вызов процедур. proc <имя> // Начало процедуры. Процедуры можно располагать в любом месте программы. При обнаружении начала процедуры, автоматически ищется ее конец, и выполнение продолжается со следующей строки. Вложенное описание не поддерживается. end_proc // Конец процедуры
call saying_message end_script proc saying_message say test passed end_proc
2.28
добавил возможность передавать в подпрограммы массивы. следите за соответствием типов переменных
передаем массив по ссылке. т.е. изменение его в процедуре может привести к изменению в родительском скрипте.
но если в процедуре изменится его размерность, то теоретически после этого изменения произойдет передача по значению (копирование)
set %var [1 1] abc set %var [1 2] 123 set #e 1 set delimiter '_' call test2 %var [1 2] %var [#e] %var %var.5 end_script proc test2 #v1 $v2 %v3 %v4 set delimiter '^' set logging Dump: #v1 $v2 %v3 [1] %v4 [1] // Dump: 123 abc_123 abc^123 abc^123 end_proc
Добавил возврат строкового значения из подпрограммы, с помощью зарезервированной переменной '$result'. при выходе из подпрограммы по ключевому слову 'end_proc', значение переменной '$result' присваивается строковой переменной с именем подпрограммы
call test msg $test end_script proc test set $result Test Passed end_proc
2.39
Исправил ошибку, возникающую, при указании комментария в описании процедуры. "proc test // comment".
2.41
Исправил ошибку "EConvertError '^xx'", где "хх" номер скрипта, иногда возникающую при выполнении процедур.
Исправил присваивание 'workwindow' в процедурах. Присваивание срабатывало только на вызывающий скрипт.