Новости | Почему Мак? | Методика | Работы учеников | Макинтош | SOS! | Ссылки | Об участниках |
---|
Реакция объекта на то или иное событие описывается подпрограммой-обработчиком (handler). В простейшем случае они оформляются вот так:
on событие ([параметр[, параметр]...])
[оператор]...
end событие
Вот, например, как можно осуществить поиск наименьшего числа в заданном списке:
on minimum(numList)
local min
-- возьмем первое число
set min to item 1 of numList
-- и просмотрим все элементы списка
repeat with numRef in numList
set num to contents of numRef
-- если очередное число меньше,
-- берем его за минимум
if num < min then set min to num
end repeat
return min
end minimum
Обратите внимание: если обработчик должен возвращать какой-либо результат, это делается с помощью оператора Return. Таких операторов может быть и несколько, выполнение любого из них будет завершать работу обработчика. (Замечу, что можно обойтись и без Return. В этом случае будет возвращен результат последнего исполненного оператора. Но не рекомендую так делать -- если не хотите лишних проблем в процессе отладки скриптов)
Иногда разработчику скрипта бывает удобнее вместо упорядоченной записи параметров воспользоваться метками (в результате вызов обработчика становится более похожим на естественную английскую фразу). Оформляется подпрограмма с помеченными параметрами следующим образом:
on событие
[ переменная-параметр ]
[ спецметка переменная-параметр ]...
[ given метка:переменная-параметр [, метка:переменная-параметр ]...]
[ оператор ]...
end событие
Имена меток можно выбирать какие угодно, но есть некоторое количество наиболее распространенных, использование которых упрощено. Среди этих спецметок: above, from, around, at, below, beside, between, by, for, from, instead of, into, over, thru, under
и некоторые другие.
При вызове такого обработчика порядок фактических параметров (за исключением "непосредственного" -- непомеченного, который должен всегда идти первым) роли не играет. Для логических параметров можно при вызове вместо указания значений "false" или "true" ставить перед соответствующей меткой соответственно "without" или "with" (в этом случае, к тому же, можно обойтись без "given").
Например, несколько модифицируем подпрограмму поиска минимума, чтоб она могла при необходимости округлить полученный результат:
on minimum of numList given rounding: roundFlag
local min
set min to item 1 of numList
repeat with numRef in numList
set num to contents of numRef
if num < min then set min to num
end repeat
if roundFlag then set min to (min + 0.5) div 1
return min
end minimum
Вызвать ее можно будет либо так:
minimum of {2.5, 5, 3.2, 43, 5.1, 1.5, 3, 7} given rounding:true
либо вот так:
minimum of {2.5, 5, 3.2, 43, 5.1, 1.5, 3, 7} with rounding
В скриптах, сохраненных как приложения (Application либо, в новом ScriptEditor, Classic Applet/MacOS X Applet) используются обработчики для нескольких системных событий.
Во-первых, любая программа при запуске получает сообщение "run". Обработчик для него можно специально не оформлять, так как по умолчанию им считается все, что не входит ни в какие другие обработчики.
Следующее событие -- "open". Его обработчик -- основной элемент дроплетов -- оформляется вот так:
on open список файлов
[оператор]...
end open
Еще два события могут обрабатываться только "остающимися открытыми" (stay open) апплетами. Наиболее важное из них -- "idle" -- периодически передается программе, если не происходит никаких других внешних событий. Это очень удобно, если Вы хотите заставить компьютер выполнять в фоновом режиме какую-либо операцию через определенные промежутки времени. Обработчик не имеет никаких параметров:
on idle
[оператор]...
end idle
Есть здесь одна тонкость. Первоначально пауза между событиями idle устанавливается в 30 секунд, а затем (Внимание!) -- приравнивается значению, возвращенному обработчиком (если это -- число). Поэтому, чтобы избежать непредсказуемого поведения скрипта, рекомендую последним оператором обработчика записывать return -- естественно, с параметром-числом, равным необходимому интервалу в секундах.
Обработчик еще одного события -- "quit". (На всякий случай, подскажу: можно завершить скрипт, минуя обработчик quit, если нажать Command-Shift-Q) Этот обработчик предназначен для тех случаев, когда нужно, например, подстраховаться от случайного завершения программы:
on quit
[оператор]...
end quit
Например:
on quit
display dialog "Завершить?"
buttons {"Нет", "Да"} default button "Да"
if the button returned of the result is "Да" then
continue quit
end if
end quit
Обратите внимание: чтоб апплет мог корректно завершиться, в обработчике обязательно должен выполниться оператор "continue quit".
Ведущий раздела: Михаил Евгеньевич Крекин Если Вы хотите к нам присоединиться: |