Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
всё о скриптах JAWS.docx
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
312.03 Кб
Скачать

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

является ложным, имея в виду, что есть фрейм, тогда выполнение

перескакивает в другую точку скрипта, которая обрабатывает текст,

ассоциированный с фреймом. Предполагая, что фрейма нет, далее

обрабатываются следующие утверждения: