
- •Часть I: начало работы со скриптами
- •3.3 В Jaws for Windows появилась возможность загружать файлы
- •Void, если вам не нужно, чтобы ваша функция возвращала какое-либо
- •Insert Function Call - выводит диалог вставки функции, который
- •Insert PerformScript (вставить выполнение скрипта) - при выборе этой
- •InvisibleCursor() - активизирует невидимый курсор.
- •InvisibleCursor() ; активизируется невидимый курсор
- •InvisibleCursor () ; активизируется невидимый курсор
- •InvisibleCursor(), нажимайте Enter, чтобы вставить ее в наш скрипт.
- •Часть II
- •Include "hjglobal.Jsh"
- •IntVar на 1)
- •If (nAttributes & attrib_highlight) Then
- •Visual Basic.
- •If GetExcelVersion Then
- •If (nAttributes & attrib_highlight) then
- •1. Используйте комментарии, комментарии и еще раз комментарии!
- •InvisibleCursor() - активизирует невидимый курсор.
- •2. Диспетчер скриптов проверяет .Jsd файл на наличие строк
- •Include файлы проверяются, когда они включаются. Всегда ставьте
- •If (IsSameScript ()) Then
- •Import Macro File: используется для импорта файла макроса из ранних версий
- •If (GetAttributes() & attrib_underline) then ... (более подробное описание
- •VerbosityLevel - контролирует количество информации, произносимой jfw,
If GetExcelVersion Then
Когда вы видите такие утверждения, понятно, что мы подразумеваем
"== true". Оно опускается для удобства, но каждый должен понимать, что
"== true" или "== 1" (которые, как мы теперь знаем, являются эквивалентными
утверждениями),всегда подразумевается в такого рода утверждениях.
Домашнее задание # 6
Jaws произносит большие буквы, озвучивая их с другой высотой тона.
Некоторые пользователи хотели бы слышать перед словами, целиком
написанными заглавными буквами, сообщение "Все большие" ("all caps"), когда
они произносятся по буквам. Напишите функцию под именем SayAllCaps,
которая будет выполнять следующее:
1. Она должна принимать в качестве параметра слово, на котором находится
курсор, и это слово и нужно будет проверять. Используйте CurrentWord в
качестве параметра типа String, который будет принимать данные из
вызывающего скрипта.
2. Она должна проверять слово, чтобы посмотреть, содержит ли слово буквы,
которые не являются заглавными. Как только она найдет такое слово, она
должна будет возвратить нулевую строку, то есть пару кавычек, и ничего
между ними. Если она найдет, что все буквы являются заглавными, она
должна будет возвратить строку "all caps".
Совет: это довольно сложная работа, поэтому мы собираемся дать вам
подсказку. Вы должны будете использовать встроенную функцию,
StringContains, чтобы определить, содержит ли слово какие-либо незаглавные
буквы. (это единственная встроенная функция Jaws, которая является
чувствительной к регистру). Как только тест определяет, что представленная
буква не является заглавной, должен осуществляться возврат пустой строки,
поскольку дальнейшего тестирования не требуется. Если букв в нижнем
регистре найдено не будет, она должна возвратить строку "all caps". Функция
также должна возвращать нулевую строку, если встретится какое-либо число,
чтобы предотвратить появление сообщения "all caps" на каждой встретившейся
цифре. И наконец, функция должна содержать код, который не давал бы ей
выдавать сообщение "All Caps", если курсор находится на пустой строке, или
на знаке препинания, или на любом другом неалфавитном символе. Чтобы
выполнить эту задачу, вы должны знать, что все такие неалфавитные символы
имеют значение меньшее, чем буква A или большее, чем буква Z. Вы должны
протестировать слово, чтобы посмотреть, удовлетворяет ли текущее слово
этому критерию и возвращать нулевую строку, если удовлетворяет.
Наконец, чтобы использовать эту функцию в народном хозяйстве, конечная
часть задачи состоит в том, чтобы модифицировать скрипт, который
называется SayWord, который можно найти в DEFAULT.JSS. Вы должны
модифицировать этот скрипт, чтобы он вызывал функцию SayAllCaps в
нужное время и выполнял тест. SayWord активизируется, когда вы нажимаете
комбинацию клавиш Insert+5 на цифровой клавиатуре. Скрипт SayWord имеет
начальный раздел, который использует встроенную функцию IsSameScript
чтобы проверить, не нажали ли вы Insert+5 на цифровой клавиатуре дважды
быстро. Если быстро нажать эту комбинацию клавиш дважды, Jaws получить
задание произнести слово по буквам, а не просто озвучить его. Поместите
свой вызов функции SayAllCaps в функцию в нужное место и вызовите ее
с таким расчетом, чтобы она озвучивала строку, возвращенную функцией,
сразу же перед тем, как она произносит слово по буквам. Если функция
нашла, что не все слово написано в верхнем регистре, она вернет нулевую
строку, и таким образом, не скажет ничего. Если функция обнаружила, что
все слово написано в верхнем регистре, она возвратит строку "All Caps",
которую вы затем услышите непосредственно перед тем, как слово будет
произнесено по буквам.
Последний совет: вы должны будете вызывать функцию внутри утверждения
SayString, чтобы услышать, как будет озвучена ваша возвращенная строка.
Функции событий
Существует также особая категория определяемых пользователем функций,
название которых оканчивается словом Event (Событие). Такие функции
называются функциями событий, и они отрабатывают автоматически, всякий
раз, когда происходит ассоциированное с ними событие. Например, функция,
которая называется MouseMovedEvent работает, всякий раз, когда указатель
мыши изменяет положение. Задача таких функций событий состоит в том,
чтобы позволить Jaws выполнять специфические задачи автоматически, не
ожидая, когда пользователь инициирует действие с помощью нажатия клавиш.
Здесь требуется некоторое прояснение. Мы называем эти функции событий
определяемыми пользователем функциями, потому что некоторые пользователи
пишут или модифицируют утверждения, которые в них содержатся. Однако,
они отличаются от других определяемых пользователем функций, потому что
пользователи не могут изобретать новые функции событий. Те, которые
суещствуют, являются таковыми, поскольку они были запрограммированы в
Jaws, чтобы там существовать. Пользователи могут изменять код, которым они
пользуются, но не могут изобретать новый. Существует несколько таких
конкретных системных событий, которые могут запустить функцию. Когда
происходят такие события, они часто передают параметры в функции, которые
используются кодом функций событий. Вот пример функции такого типа,
AutoStartEvent, которую вы найдете в большинстве файлов скриптов.
Function AutoStartEvent()
If (GetWindowName (GetFocus ())== wn292)
&& SDMGetFocus (GetFocus ())== 18 Then ; on check box
SDMSayControl (GetFocus (), 17) ; say the tip of the day
SDMSayControl (GetFocus (), 18) ; say check box
EndIf ; tip of the day
If (WinWordFirstTime == 0) Then
let WinWordFirstTime = 1
let GlobalWinwordVersion = FALSE
if GetVerbosity() == beginner Then
SayString(msg293) ;"Use Insert plus the letter H for help in various dialog boxes"
EndIf ; verbosity beginner
EndIf ; first time
EndFunction
AutoStartEvent происходит всякий раз, когда загружается файл скриптов. Эта
функция взята из файла скриптов для Microsoft Word. Она озвучивает совет
дня, если он является видимым, устанавливает несколько переменных, а затем
озвучивает подсказку Jaws. Она также проверяет, является ли это первый раз,
когда функция AutoStartEvent отрабатывает во время текущей сессии Jaws.
Если это так, она изменяет значение переменной WinWordFirstTime с 0 на 1.
Когда в следующий раз AutoStartEvent будет выполнять свою работу, она
пропустит сообщение-подсказку. Это полезный способ, который можно
симмитировать, когда вы хотите, чтобы скрипт делал что-нибудь, когда
приложение загружается в первый раз, но хотите избежать этого при
последующих загрузках. Если вы хотите, чтобы что-нибудь происходило при
каждой загрузке приложения, просто поместите код в функцию
AutoStartEvent, без всяких окружающих его условных утверждений. Эта
функция не принимает никаких параметров и не возвращает ничего. Теперь
давайте рассмотрим более сложную функцию, которая принимает
передаваемые ей параметры. Это функция NewTextEvent, которая обрабатывает
весь новый текст, появляющийся на экране.
Void Function NewTextEvent (handle hwnd, string buffer, Int nAttributes,
Int nTextColor, Int nBackgroundColor, Int nEcho, string sFrameName)
; Обрабатывает весь новый текст. Если текст содержится во
; фрейме, то имя фрейма передается в качестве параметра
if (ProcessSelectText(nAttributes, buffer)) then
return
EndIf
if (sFrameName == "") then
; Этот текст не ассоциирован с фреймом
if (nAttributes & ATTRIB_HIGHLIGHT) then
SayHighlightedText(hwnd, buffer)
else
SayNonHighlightedText(hwnd, buffer)
EndIf
else
; Этот текст ассоциирован с фреймом
if (nEcho == ECHO_NONE) then
return; frame is being silenced
EndIf
if (nEcho == ECHO_ALL ||
(nAttributes & ATTRIB_HIGHLIGHT)) then
; if Frame echo is set to all or the text being written is highlighted
SayString(buffer)
EndIf
EndIf
EndFunction
Это функция NewTextEvent из файла скриптов по умолчанию. Обратите
внимание, что можно сказать, что эта функция ничего не возвращает, потому
что начальный оператор функции начинается со слова Void. Все параметры
для этого события объявлены между левой и правой скобками в начальном
операторе функции. (помните, что такие параметры первоначально объявлялись
в разделе Параметры диалога Новый скрипт, который используется для
определения и документирования нового скрипта или функции). Вызовы для
этой функции событий должны содержать переменную для каждой из
предзаданных параметров между скобками утверждения, вызывающего
функцию. Далее приводится описание каждого параметра для NewTextEvent:
Handle hwnd - это оконная ручка того окна, которое получает текст.
String buffer - это действительный текст, который пишется в окне.
Int nAttributes - это атрибут текста, который пишется.
Int nTextColor - это цвет текста, который пишется.
Int nBackgroundColor - это цвет фона текста, который пишется7
Int nEcho - уровень озвучивания, установленный для фрейма,если таковой
есть, который получает текст.
String sFrameName - имя фрейма, если таковое есть, который получает текст.
Как мы уже сказали раньше, эта функция вызывается автоматически всякий
раз, когда на экране пишется новый текст. Jaws автоматически передает
значения этих семи параметров в функцию, когда она вызывается. Используя
логику и выполняя сравнения этих данных, функция может определить,
какого рода текст был написан, ассоциировал ли он с фреймом, и что Jaws
должен озвучивать, и должен ли он вообще что-то озвучивать. Если бы это не
была функция события, пользователю пришлось бы вызывать ее из другой
функции или скрипта, и для вызова этой функции ему пришлось бы указать
переменные, которые используются для передачи требуемой информации. Но
поскольку это функция события, Jaws автоматически выполняет эту работу
всякий раз, когда на экране появляется новый текст.
Есть смысл изучить эту функцию события, чтобы понять, как Jaws выполняет
такие сравнения и как функции вызываются из других функций.
Первая строка после начальных комментариев в этой функции является
следующей
if (ProcessSelectText(nAttributes, buffer)) then
Эта:строка является оператором If-Then, вызывающий функцию по имени
ProcessSelectText. Эта функция занимается озвучиванием текста, по мере его
выделения или снятия выделения. Синтаксис этого утверждения абсолютно
идентичен тому, как если бы было написано
if (ProcessSelectText(nAttributes, buffer) == True) then
Та часть, которая говорит "== true" всегда подразумевается, даже если она
опускается. Поэтому, если этот вызов функции возвращает значение True,
тогда следующая строка, Return, будет выполнена. А происходит то, что
функция NewTextEvent передает задачу определения,происходит ли выделение
текста, или происходит снятие выделения , в функцию ProcessSelectText.
Если эта функция решает, что происходит выделение текста или выделение
снимается, она производит необходимое
озвучивание и функции NewTextEvent больше делать нечего. Таким образом,
когда управление возвращается в функцию NewTextEvent возвращением
истины, то функция NewTextEvent завершает работу через свое собственное
утверждение Return, и работа окончена. Если функция ProcessSelectText
возвращает False, значит, текст не помечается для выделения или для снятия
выделения, утверждение If-Then является ложным и функция NewTextEvent
продолжит работу. Следующая строка в этой функции такая:
if (sFrameName == "") then
Поскольку параметр sFrameName передает имя любого фрейма, содержащего
новый текст, в функцию NewTextEvent, этот параметр будет иметь нулевое
или пустое значение, если текст не ассоциирован с каким-либо фреймом.
Нулевое значение для имени фрейма указывается двумя кавычками, между
которыми нет никакого текста. Таким образом, если с текстом не
ассоциировано никаких фреймов, никакого имени фрейма не будет, нулевое
значение, и утверждение If-Then будет истинным. Тогда будет выполняться
следующее утверждение в последовательности. Если утверждение If-Then
является ложным, имея в виду, что есть фрейм, тогда выполнение
перескакивает в другую точку скрипта, которая обрабатывает текст,
ассоциированный с фреймом. Предполагая, что фрейма нет, далее
обрабатываются следующие утверждения: