Всё, что вы хотели знать о написании скриптов для JFW, но не знали, кого спросить

(Переработанный и дополненный вариант)
Источник:www.tiflocomp.ru
Дата публикации:2004
Twitter Facebook Vkontakte

Часть II. Создаём сложные файлы скриптов

Функции, определяемые пользователем

С помощью языка сценариев можно написать определяемую пользователем функцию (или пользовательскую функцию). Разница между встроенной функцией и функцией, определяемой пользователем,состоит в том, что функции, определяемые пользователем, можно модифицировать, в то время как встроенные функции модифицировать нельзя, так как они запрограммированы в Jaws.

Разница между определяемой пользователем функцией и скриптом состоит в том, что скрипт может быть привязан к клавише и не возвращает никакого значения, а пользовательская функция не может быть привязана к клавише и возвращает значение определенного типа. Пользовательские функции запускаются всякий раз, когда они вызываются из скрипта или из другой определяемой пользователем функции.

Простые функции

Определяемые пользователем функции обычно создаются как самостоятельные модули скриптового кода, который предназначен для выполнения конкретной задачи. Это особенно полезно, когда работа, которую должна выполнить функция, будет выполняться большое количество раз и разными скриптами. Это позволяет многократно использовать код функции, не переписывая его несколько раз. Все, что должен сделать пользователь, это вызвать функцию из другого скрипта или функции, и работа будет выполнена. Затем вызванная функция возвращает управление обратно вызывающему скрипту или функции, который, в свою очередь, продолжает свою работу.

Простейший тип функции не принимает никаких данных (параметров) и не возвращает никаких значений в вызывающий скрипт. Давайте рассмотрим пример определяемой пользователем функции, который взят из файла скриптов для Microsoft Excel, EXCEL.JSS. Этот скрипт называется NextSheet, и в его задачу входит переместить фокус к следующей таблице. Вот код из скрипта:

Script NextSheet() ;переходит в следующую таблицу и читает номер
{CONTROL+PPAGE DOWN}
Delay (1)
SayWindowPromptAndText()
EndScript

Обратите внимание, что скрипт вызывает функцию, которая называется SayWindowPromptAndText. Вы не найдете этой функции среди встроенных функций Jaws. Это пользовательская функция, которая была написана программистами из Henter-Joyce и включена в EXCEL.JSS. Ниже приводится код для SayWindowPromptAndText.

Function SayWindowPromptAndText ()
SaveCursor ()
InvisibleCursor ()
RouteInvisibleToPC ()
If (FindLastAttribute (ATTRIB_BOLD)) Then
SayChunk ()
Else SayString (msg121) ;"bolded sheet tab not found"
EndIf
EndFunction

Давайте теперь пройдемся по процедуре создания простой пользовательской функции. В качестве примера рассмотрим создание функции, которая будет озвучивать наше имя, точно также, как мы это сделали в нашем первом скрипте. Как и прежде, мы поместим эту функцию в файл скриптов для редактора "Блокнот" (Notepad).

  1. Откройте Блокнот через главное меню/Программы/Стандартные.
  2. Откройте диспетчер скриптов, нажав Insert+0 или Insert+F2, после чего s и Enter. Jaws сообщит вам, что вы находитесь в файле notepad.jss, исходном файле скриптов для Блокнота.
  3. В меню Скрипт выберите пункт Новый скрипт, или нажмите клавишу-ускоритель, CTRL+E.
  4. Появится диалог нового скрипта, теперь мы можем назвать нашу функцию и ввести ее описание. Когда появляется диалог нового скрипта, курсор находится в поле имени скрипта. Наберите SayName (СказатьИмя). Убедитесь, что буквы S и N являются большими и не делайте пробелов.
  5. Дважды нажмите Tab, чтобы переместиться к полю Synopsis. Наберите слова "Say our name". (пропустив блок проверки Can be attached to key (может быть привязан к клавише) без его включения мы сказали диспетчеру скриптов, что мы создаем функцию, а не скрипт).
  6. Нажмите Tab, чтобы переместиться в поле Description (Описание) и наберите слова "The name of the person who wrote this function." (Имя человека, написавшего эту функцию).
  7. Нажмите Tab, чтобы переместиться в поле Категория, и наберите Test. Поле Категория - это комбобокс, в котором вы можете либо вписать название категории, либо просто выбрать одно из имеющихся.
  8. Нажмите Tab, чтобы переместиться в поле Function returns (Возвращаемое значение) и спуститесь к значению Void. Мы выбираем Void, потому что наша функция не возвращает никакой информации в вызывающий скрипт.
  9. Больше нам никаких полей заполнять не нужно, поэтому клавишей Tab перемещайтесь к кнопке OK, и нажимайте клавишу Enter, чтобы закрыть диалог нового скрипта и вставить пустую функцию в область редактирования.
  10. Теперь мы снова находимся в главной текстовой области диспетчера скриптов и мы имеем пустую функцию, где в первой строке написано "Void Function SayName ()", а в последней строке написано "EndFunction". Мы помещены между двумя этими строками. Клавишей "Стрелка вверх" поднимайтесь до первой пустой строки после первой строки, и вы готовы к тому, чтобы написать тело функции.
  11. Для этой функции вам понадобится только одна строка, и это будет та же самая строка, которую мы использовали для нашего первого скрипта. Эта строка будет SayString ("My name is XXX"), где XXX - ваше имя. Чтобы вставить эту строку в вашу функцию, нажмите CTRL+I, чтобы открыть диалог Insert function (вставить функцию). Затем наберите s,a и y. Вы должны услышать, как Jaws скажет SayString, имя встроенной функции, которая была выделена. Нажмите Enter, чтобы принять эту функцию.
  12. Теперь вам будет предложено ввести строку, которая должна озвучиваться. Наберите "My name is XXX", и не забудьте включить кавычки. После того, как вы нажмете Enter, вы вернетесь в область редактирования, где ваша функция теперь закончена.
  13. Теперь на вашей странице должно быть три строки, в точности так, как они выглядят ниже. Помните, что близко - значит, недостаточно хорошо, поскольку компьютеры ожидают, что мы будем точными и совершенными. Кроме того, несколько пустых строк роли не играют. Jaws игнорирует пустые строки в функциях.

    Void Function SayName()
    SayString ("My name is XXX")
    EndFunction
    
  14. Теперь мы должны сохранить и скомпилировать файл скриптов для Блокнота. Нажмите CTRL+S, и вы должны услышать "Compile Complete" (Компиляция завершена). Если что-то не так, вернитесь и вновь проследите все шаги и попробуйте снова.

Теперь мы создали функцию, которая будет выполнять ту же самую работу, что и наш первый скрипт. Эту функцию можно вызвать всякий раз, когда нам понадобится озвучить наше имя. Чтобы вызвать функцию, мы должны будем использовать скрипт, код которого приведен ниже.

Script SpeakName ()
SayName ()
EndScript

Этот простой скрипт будет вызывать функцию, которая будет озвучивать наше имя. Теперь может показаться немного глупо, проходить через все эти проблемы, когда мы могли бы выполнить ту же самую задачу с помощью нашего первого скрипта. Конечно, для простого случая, как этот, может быть оно и так. Однако, функции могут быть длинными и сложными. В случаях таких сложных функций будет очевидным, что будет проще создать код один раз, а потом вызывать его всякий раз, когда он нам понадобится. Иначе нам пришлось бы воссоздавать весь этот код для каждого конкретного скрипта, где он понадобится.

Определяемая пользователем функция, которую мы обсуждали несколькими абзацами выше, это самый простой вид определяемых пользователем функций, потому что он не требует никаких параметров и не возвращает никаких значений в вызывающий скрипт. Однако, определяемые пользователем функции могут делать и то, и другое. Давайте рассмотрим примеры таких функций.

Функции с параметрами

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

Помните, что параметр объявляется как переменная, но помещается между скобками, следующими после имени функции, а не после слова "var".

Function ScriptAndAppNames (string sFileName)
If (GetVerbosity() == beginner) Then 	
SayString(sFileName + " settings are loaded")
else 	
SayString (sFileName+" Settings")
EndIf
If(GetVerbosity() == beginner) Then 	
SayString ("The application currently being used is the ")
EndIf
SayString (GetAppFileName ())
SpellString (GetAppFileName ())
EndFunction

Можно представить, что строковый параметр, sFileName, является дверью, через которую мы можем передать имя текущего файла скриптов в функцию, когда она вызывается. Параметр sFileName не равен filename, он более похож на переменную, которая будет временно хранить имя файла, чтобы имя файла можно было передать в функцию, которая будет его использовать. Вызов функции будет записан следующим образом:

ScriptAndAppNames ("ApplicationName")

где ApplicationName представляет имя приложения, которое вы хотите передать в функцию. Этот вызов функции говорит, что строка (string) "ApplicationName", должна быть передана в функцию, ScriptAndAppNames, через параметр sFileName. Тогда функция будет "знать" эту информацию. Следовательно, она может быть использована в речевых сообщениях, которые содержатся в утверждениях типа SayString. Здесь информация о параметре соединяется с фиксированным текстом, чтобы завершить сообщения, которые будут озвучены во время выполнения.

Давайте возьмем функцию, которую мы написали прежде, SayName, и переформулируем ее таким образом, чтобы она принимала наше имя в качестве параметра, вместо того, чтобы иметь наше имя в коде функции. Выполните шаги, приведенные ниже.

  1. Откройте блокнот, через главное меню/программы/стандартные.
  2. Откройте диспетчер скриптов, нажав Insert+0, или нажав Insert+F2, а затем s, а затем Enter. Jaws сообщит вам, что вы находитесь в NOTEPAD.JSS, исходном файле скриптов для Блокнота. Выберите New Script из меню Script, или нажмите клавишу-ускоритель, CTRL+E.
  3. Появляется диалог нового скрипта, и теперь мы можем назвать нашу функцию и написать ее документацию. Когда появляется диалог нового скрипта, курсор находится в поле ScriptName (Имя скрипта). Наберите SayName. Убедитесь, что буквы S и N являются большими, и не вставляйте пробелы между словами.
  4. Дважды нажмите клавишу Tab, чтобы переместиться к полю Synopsis. Наберите слова "Say our Name". (Пропустив блок проверки Can be Attached to key, и не включив его, мы сообщили диспетчеру скриптов, что создаем функцию, а не скрипт).
  5. Нажмите Tab, чтобы переместиться в поле Description и наберите слова "The name of the person who wrote this function.".
  6. Нажмите Tab, чтобы переместиться в поле Категория, и наберите слово Test. Поле Категория - это комбобокс, и категорию можно либо вписать, либо выбрать из уже имеющихся.
  7. Нажмите Enter, чтобы переместиться в поле Function Returns (Возвраты функции) и выберите Void. Мы выбираем Void, потому что наша функция не возвращает никакой информации в вызывающий скрипт.
  8. Нажмите CTRL+Tab, чтобы переместиться в поле Parameters (Параметры). Вы окажетесь в поле Existing Parameters (существующие параметры). Это поле пусто, поскольку еще не существует никаких параметров.
  9. Клавишей Tab переместитесь в поле редактирования New Parameter (Новый параметр) и наберите "UserName".
  10. Нажмите клавишу Tab дважды, пока не попадете в поле редактирования Description (описание) и наберите "The name of the user".
  11. Клавишей Tab переместитесь в список допустимых типов и выберите String.
  12. Клавишей Tab переместитесь к кнопке Add (добавить) и нажмите пробел, чтобы добавить параметр. Вы вернетесь в поле редактирования нового параметра, но снова мы его использовать не будем, поскольку мы добавляем только один параметр. Клавишей Tab переместитесь к кнопке OK и нажмите Enter.
  13. Теперь мы снова находимся в главной текстовой области диспетчера скриптов, и у нас есть пустая функция, где в первой строке написано "Void Function SayName (String UserName)", а в последней строке написано "EndFunction". Мы находимся между двумя этими строками. Клавишами-стрелками поднимитесь на первую пустую строку после первой строки и вы готовы к тому, чтобы написать тело функции.
  14. Для этой функции вам понадобится только одна строка, но она будет немного отличаться от строки, которую мы использовали для нашего первого скрипта и функции SayName, которую мы писали прежде. Эта строка будет SayString ("My name is " + UserName), где UserName является параметром, который передает ваше имя в функцию. Чтобы вставить эту строку в функцию, нажмите Ctrl+I, чтобы открыть диалог "Вставить функцию". Затем наберите s, a и y. Вы должны услышать, как Jaws скажет SayString, имя встроенной функции, которая была выбрана. Нажмите Enter, чтобы принять эту функцию.
  15. Теперь вам будет предложено ввести строку, которую нужно озвучивать, или переменную, которая представляет строку. Наберите "My name +UserName", и не забудьте про кавычки. После того, как вы нажмете Enter, вы вернетесь в область редактирования, где ваша функция теперь готова.
  16. Теперь у вас на экране должны присутствовать три строки, в точности такие, как на этой странице. Помните, что близко - это не очень-то хорошо, поскольку компьютеры ожидают от нас, что мы будем точными и совершенными. Кроме того, несколько пустых строк значения не имеют. Jaws игнорирует пустые строки в функциях.
    Void Function SayName(String UserName)
    SayString ("My name is " + UserName)
    EndFunction
    
  17. Теперь нам нужно сохранить и скомпилировать файл скриптов для NotePad. Нажмите Ctrl+S, и вы должны услышать "Compile complete". Если это не так, вернитесь и вновь проделайте все вышеописанные шаги и попытайтесь еще раз.

Теперь мы создали функцию, которая будет выполнять ту же работу, что и наша предыдущая функция. Однако, имя, которое нужно озвучить, не закодировано в функцию, оно передается как параметр. Эту функцию можно вызывать всякий раз, когда нам нужно озвучить наше имя. Чтобы вызвать функцию, мы будем использовать скрипт, сформулированный, как показано ниже.

Script SpeakName ()
SayName ("XXX")
EndScript

Когда вызывается функция SayName, строка "XXX", которая представляет наше имя, передается в функцию через параметр UserName. Теперь у функции есть эти данные и она может озвучить его как часть сообщения SayString.

Функции, возвращающие значения

Теперь давайте рассмотрим функцию, которая возвращает значение. Возвращаемое значение - это данные, которые посылаются функцией в вызывающий скрипт, когда она завершает работу. Эти возвращенные данные затем могут быть использованы вызывающим скриптом или функцией. Обратите внимание, что тип возвращаемого значения (то есть, string, Int, Object, handle, или Void) объявляется перед именем функции.

Следующая функция взята из EXCEL.JSS, файла скриптов для Microsoft Excel.

Int Function GetExcelVersion()
var 	
handle WinHandle
let WinHandle = GetAppMainWindow (GetFocus())
let WinHandle = GetFirstChild (WinHandle)
If (GetWindowClass (WinHandle) == "Excel4") then 	
return TRUE ;This is Excel 97
Else 	return FALSE ; this is Excel95 or earlier
EndIf
EndFunction

Вы, вероятно, догадались, что задача этой функции состоит в том, чтобы определить, находимся мы в Excel 97 или нет. А происходит следующее: функция выполняет тест, чтобы узнать, находимся ли мы в Excel 97. Если да, функция возвращает, или посылает обратно, значение True, Истина, обратно в вызывающий скрипт. Если нет, возвращается значение False, или ложь. Под возвратом этого значения мы просто имеем в виду, что мы информируем вызывающий скрипт о результатах определения. Вызывающий скрипт может потом продолжать и делать что-то другое, в зависимости от того, является значение True или False, то есть находимся ли мы в действительности в Excel 97 или нет. Вот пример того, как можно вызвать эту функцию таким образом, чтобы возвращенную информацию можно было использовать для принятия решения.

If GetExcelVersion== true Then
(набор команд, которые нужно выполнить для Excel 97)
Else 	
(набор команд, которые нужно выполнить для других версий Excel)
EndIf

Другими словами, если GetExcelVersion является истинной, то есть, возвращает True, то мы выполним один набор утверждений. Если она не является истинной, то есть возвращает False, то мы выполним другой набор.

Кстати, вам пора выучить сокращение, которое авторы скриптов часто используют в таких ситуациях, как эта. Следующее утверждение немного короче, чем If GetExcelVersion== true Then, но оно означает абсолютно то же самое.

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 - это цвет фона текста, который появился в окне.
  • 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 является ложным, имея в виду, что есть фрейм, тогда выполнение перескакивает в другую точку скрипта, которая обрабатывает текст, ассоциированный с фреймом.

Предполагая, что фрейма нет, далее обрабатываются следующие утверждения:

if (nAttributes & ATTRIB_HIGHLIGHT) then 		
SayHighlightedText(hwnd, buffer)

Первая из двух строк является знаменитым поразрядным If-Then утверждением, о котором мы говорили в разделе о поразрядных операторах. Если обнаружится, что это утверждение истинно, мы знаем, что текст является выделенным и обработка передается в следующую строку, которая является вызовом функции SayHighlightedText. Эта функция обрабатывает озвучивание всего нового выделенного текста. Если поразрядное If-Then утверждение является ложным, функция SayHighlightedText не вызывается а вместо этого выполняются следующие строки.

Там находится:

else 		
SayNonHighlightedText(hwnd, buffer)

Другими словами, если текст выделен цветом, вызываем функцию SayHighlightedText. В противном случае вызываем функцию SayNonHighlightedText. Вы, вероятно, уже догадались, что функция SayNonHighlightedText вызывается, чтобы обрабатывать озвучивание текста, не выделенного цветом.

Так что же происходит, если скрипт решил, что текст ассоциирован с каким-либо фреймом? В этом случае обработка функций перескочит к следующей строке:

if (nEcho == ECHO_NONE) then

Эта строка сравнивает значение параметра nEcho с константой ECHO_NONE. Если выяснится, что они равны, это означает, что эхо фрейма установлено в значении"Нет", и ничего говорить не надо. В этом случае выполняется простой возврат (Return), ничего не озвучивается и все дела. Если это утверждение If-Then возвращает False, эхо не установлено в значение "Нет" и необходимо проделать еще кое-какую работу. Тогда необходимо обработать следующую строку:

if (nEcho == ECHO_ALL || 	 (nAttributes & ATTRIB_HIGHLIGHT)) then

Первая часть этого If-Then утверждения спрашивает, является ли nEcho равным Echo_All. Другими словами, не установлено ли эхо фрейма в значение "Озвучивать весь текст"? Вторая часть утверждения If-Then является нашей старой доброй поразрядной операцией, которая определяет, является ли текст выделенным цветом. Если оба эти утверждения оказываются верными (вспомните, что оператор || является оператором Или), то выполняется следующая строка функции. В этой строке написано:

SayString(buffer)

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

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

Список событийных функций

Далее приведен список специальных функций, запускаемых системными событиями. Если вы хотите использовать эти функции для создания собственных скриптов, вы должны использовать имя в точности так, как написано здесь, и задавать все предписанные переменные в вызове функции в предписанном порядке. Более подробную информацию об этих функциях можно найти в файле BUILTIN.JSD. Обратите внимание, что этот список был обновлен, чтобы включить функции событий из версии 3.3. Если вы пользуетесь более ранней версией, у вас не будет всех элементов, которые перечислены ниже.

AutoStartEvent - запускается, когда файл скриптов, содержащий эту функцию, загружается или получает фокус.
Параметры - нет.

AutoFinishEvent - запускается, когда файл скриптов, содержащий эту функцию, закрывается или теряет фокус.
Параметры - нет.

ItemNotFoundEvent - запускается, когда запрошенный элемент не был найден в модели Off-Screen.
Параметры:handle (дескриптор текущего окна).

NewTextEvent - запускается, если где-то на экране появляется новый текст.
Параметры:

  • Handle, дескриптор текущего окна;
  • String, в котором содержится появившийся текст.
  • Integer, содержащий атрибут текста.
  • Integer, содержащий цвет текста;
  • Integer, содержащий цвет фона;
  • Integer, содержащий установку эхо;
  • String, содержащий имя фрейма, где появился текст.

TopEdgeEvent - запускается, когда активный курсор доходит до верхней границы окна.
Параметры:
Handle,дескриптор окна, край которого был достигнут.

BottomEdgeEvent - запускается, когда активный курсор доходит до нижней границы окна.
Параметры:Handle,дескриптор окна, край которого был достигнут.

FocusChangedEvent - запускается, когда перемещается фокус ввода.
Параметры:

  • Handle, дескриптор текущего окна.
  • Handle, дескриптор предыдущего окна.

MenuModeEvent - запускается, когда фокус ввода попадает в меню.
Параметры:

  • Handle, дескриптор активного окна.
  • Integer, содержащий режим меню.

CursorChangedEvent - запускается, когда изменяется форма указателя мыши (Jaws курсор).
Параметры:Integer, содержащий новую форму указателя.

WindowCreatedEvent - запускается, когда появляется новое окно.
Параметры:

  • Handle, дескриптор нового окна.
  • Integer, содержащий координату левого края окна.
  • Integer, содержащий координату верхнего края окна.
  • Integer, содержащий координату правого края окна.
  • Integer, содержащий координату нижнего края окна.

WindowDestroyedEvent - запускается, когда окно исчезает.
Параметры:
Handle, дескриптор исчезнувшего окна.

WindowMinMaxEvent - запускается, когда изменяется статус окна свернуть/распахнуть.
Параметры:

  • Handle,дескриптор окна
  • Integer, описывающий общее действие, происходящее в окне;
  • Integer, описывающий специфическое действие, имеющее место в окне.

WindowResizedEvent - запускается, когда окно близко к тому, чтобы изменить свой размер.
Параметры:

  • Handle,дескриптор окна, которое изменяет свой размер;
  • Integer, содержащий левый край окна, изменяющего свой размер;
  • Integer, содержащий верхний край окна, изменяющего свой размер;
  • Integer, содержащий правый край окна, изменяющего свой размер;
  • Integer, содержащий нижний край окна, изменяющего свой размер;

AppWillNotSpeakEvent - эта функция событий используется только при инсталляции Jaws и не предназначена для общих задач создания скриптов.

KeyPressedEvent - запускается любым нажатием клавиш, за которыми закреплен скрипт, прежде чем отрабатывает этот скрипт.
Параметры:

  • integer, содержащее код клавиши.
  • String, содержащий имя клавиши, как оно выглядит в раскладке клавиш
  • Integer, определяющий, закреплена ли клавиша за брайлевским дисплеем;
  • Integer, определяющий, закреплена ли клавиша за скриптом;

MouseMovedEvent - запускается при перемещении мыши.
Параметры:

  • Integer, задающее координату X
  • Integer, задающий координату Y

FocusPointMovedEvent - вызывается всякий раз, когда PC курсор перемещается в другое место на экране.
Параметры:

  • Integer, задающий текущее горизонтальное положение PC курсора
  • Integer, задающий текущее вертикальное положение PC курсора
  • Integer, задающий предыдущее горизонтальное положение PC курсора
  • Integer, задающий предыдущее вертикальное положение PC курсора
  • Integer, содержащий единицу перемещения, как задано в HJConst.jsh
  • Integer, задающий направление перемещения, как указано в HJConst.jsh
  • Integer, указывающий количество времени, которое прошло со времени перемещения.

ActiveItemChangedEvent - запускается, когда изменяется активный элемент в объекте
Параметры: нет

CursorShapeChangedEvent - это событие происходит, когда изменяется форма указателя мыши.
параметры:
String, содержащий текущий тип курсора.

TooltipEvent - это событие вызывается если JCF опция OPT_PROCESSTOOLTIPEVENT установлена в значении 1 или On. Она также вызывается автоматическим маркировщиком графики. Это событие отрабатывает всякий раз, когда появляется совет на панели инструментов. В данный момент используется только для хранения текста последнего совета в глобальной переменной типа String strLastTooltip.
Параметры:

  • Handle, дескриптор совета на панели инструментов.
  • String, содержащий текст совета.

ScreenMagnifiedEvent - функция события, которая запускается всякий раз,: когда активизируется увеличение экрана, деактивизируется или уровень увеличения изменяется (используется Magic).
Параметры:

  • Integer, который указывает, включено ли увеличение.
  • Integer, который указывает уровень увеличения.

FocusChangedMagEvent - эта функция запускается, когда фокус перемещается от одного элемента управления к другому.
Параметры:

  • Handle окна, содержащего фокус.
  • Handle предыдущего окна, в котором был фокус.

ActiveItemChangedMagEvent - эта функция событий вызывается, когда выбранный элемент в списке или в дереве меняется, чтобы обрабатывать все специфические функции Magic, которые должны иметь место, когда выбранный элемент изменяется (используется Magic)

FocusPointMovedMagEvent - эта функция вызывается FocusPointMovedEvent чтобы обрабатывать специфические функции Magic, которые должны иметь место, когда указатель фокуса изменяется.
Параметры:

  • Integer, содержащий X координату курсора после изменения фокуса.
  • Integer, содержащий Y координату курсора после изменения фокуса.
  • Integer, содержащий X координату курсора перед изменением фокуса.
  • Integer, содержащий Y координату курсора перед изменением. фокуса.
  • Integer, содержащий единицу перемещения, как задано в файле HJConst.JSH.
  • Integer, содержащий направление перемещения, как указано в файле HJConst.JSH.
  • Integer, содержащий количество времени, которое прошло со времени перемещения.

NewTextMagEvent - функция, предназначенная для обработки, которая специфична для отслеживания Magic, когда на экране появляется новый текст. (используется Magic).
Параметры:

  • Handle, дескриптор текущего окна.
  • String, содержащий новый текст.
  • Integer, содержащий атрибут текста.
  • Integer, содержащий цвет текста.
  • Integer, содержащий цвет фона.
  • Integer, содержащий установку эхо.
  • String, содержащий имя фрейма, в котором появился текст.

MenuModeMagEvent - это событие срабатывает, когда статус меню изменяется (используется Magic).
Параметры:

  • Handle, дескриптор меню.
  • Integer, содержащий состояние меню, которое изменилось.

Техника создания скриптов

Изучаем приложение с помощью функций утилит

Прежде чем писать файл скриптов, мы должны иметь некоторое представление о том, что мы хотим выполнить с его помощью. Нам также часто необходимо познакомиться с окнами в нашем приложении, чтобы посмотреть, что имеется на экране и как это можно озвучить. Нам также может понадобиться подробная информация об окнах, такая, как класс, контрольный идентификатор и дескриптор (Handle), а также отношения родители-дети. В файле скриптов по умолчанию есть набор скриптов, которые называются скрипты утилит, которые могут сослужить здесь хорошую службу. Эти утилиты помогают создавать скрипты тем, что позволяют пользователю познакомиться с взаимоотношениями типа родители-дети для различных окон в приложении и предоставляют подробную информацию о каждом окне, такую, как класс, контрольный идентификатор и т.д.

Каждая из утилит описана ниже вместе с закрепленной за ней комбинацией клавиш. Все эти утилиты используются в режиме Home Row (Insert+Пробел). Режим Home Row представляет собой смещенное состояние клавиатуры, несколько напоминающее смещенное состояние, которое можно получить с помощью клавиш CapsLock и NumLock. Это означает, что вы получаете доступ к каждой функции с помощью указанной комбинации клавиш, после того, как вы включили режим Home Row путем одновременного нажатия клавиш Insert и Пробел. Чтобы выйти из режима, нажмите Insert+Пробел еще раз.

  • INSERT + H - помощь по горячим клавишам, перечисляет все утилиты вместе с закрепленными за ними горячими клавишами.
  • F1 - эта клавиша используется для озвучивания информации о текущем окне или элементе управления. Какая информация будет озвучиваться, зависит от режима вывода, который вы выбрали. Этот режим вывода задается клавишей F3 (см. ниже). Клавиша F3 похожа на селектор, который определяет, какие данные вы будете получать, а клавиша F1 в действительности предоставляет вам эти данные. Когда клавиша F1 быстро нажимается дважды подряд, информация произносится по буквам. Режим посимвольного чтения не применяется к целым числам.
  • F3 - эта клавиша задает режим вывода. Если повторно нажимать F3, режим вывода будет циклически переключаться в следующем порядке: SayTypeAndText, фокус или Handle окна, контрольный идентификатор, класс окна, тип окна, и первое действительное имя окна. Это означает, что это будут данные, которые вы услышите, если нажмете клавишу F1. Можно прокручиваться и в обратном порядке, если нажимать Shift+F3.
  • Insert+Home на цифровой клавиатуре - эта клавиша устанавливает режим вывода обратно в SayTypeAndText и ею можно пользоваться чтобы вернуться к этой настройке, вместо того, чтобы прокручиваться через все режимы.
  • INSERT + F1 - эта клавиша посылает запрошенную информацию (режим вывода) в окно сообщения. Это недоступно в тех режимах вывода, которые возвращают целочисленные значения.
  • Tab - эта клавиша перемещает Jaws курсор к следующему окну того же логического уровня, что и то, в котором вы в данный момент находитесь, и озвучивает требуемую информацию соответственно режиму вывода, который вы установили клавишей F3.
  • Shift+Tab - эта клавиша перемещает Jaws курсор к предыдущему окну того же логического уровня, что и то, в котором вы находитесь, и озвучивает требуемую информацию, соответственно режиму вывода, который вы установили клавишей F3.
  • F2 - эта клавиша перемещает Jaws курсор к первому дочернему окну текущего окна и озвучивает требуемую информацию, соответственно режиму вывода, который вы установили клавишей F3.
  • SHIFT + F2 - перемещает Jaws курсор к родительскому окну текущего окна и озвучивает требуемую информацию, соответственно режиму вывода, который вы установили клавишей F3.
  • F4 - эта клавиша является селектором, который задает режим поиска атрибутов. Режим поиска атрибутов - это стиль атрибутов, который будет разыскиваться, с помощью четырех горячих клавиш, описанных ниже. При повторном нажатии F4 атрибуты будут прокручиваться в следующем порядке: полужирный, курсив, подчеркнутый, выделенный цветом и зачеркнутый.
  • GRAVE ACCENT (клавиша с символом акцента или с русской буквой ё) - эта клавиша перемещает Jaws курсор к следующему запрошенному атрибуту. Режим поиска атрибутов задается клавишей F4, как было описано выше.
  • SHIFT + GRAVE ACCENT - эта клавиша перемещает Jaws курсор к предыдущему запрошенному атрибуту. Режим поиска атрибутов задается клавишей F4, как было описано выше.
  • CONTROL + GRAVE ACCENT - эта клавиша перемещает Jaws курсор к первому запрошенному атрибуту. Режим поиска атрибутов задается клавишей F4, как было описано выше.
  • SHIFT + CONTROL + GRAVE ACCENT - эта клавиша перемещает Jaws курсор к последнему запрошенному атрибуту. Режим поиска атрибутов задается клавишей F4, как было описано выше.
  • p - эта клавиша читает предыдущее окно. Это полезно, если необходимо определить, можно ли прочитать приглашение, прочитав предыдущее окно. Например, приглашением для поля редактирования в базе данных может быть предыдущее окно, и использование этой клавиши, когда вы находитесь в поле редактирования, озвучит приглашение, и вам, возможно, удастся написать скрипт, который с успехом будет читать приглашение, используя информацию предыдущего окна.

Использование этих утилит поможет вам собрать всю информацию, которая может вам понадобиться, относительно элементов управления, отношениях родители/дети, и атрибуты текста, чтобы использовать эту информацию в своих собственных скриптах.

Домашнее задание # 7

Откройте приложение WordPad. Затем включите режим Home Row. Используя F1 и F3 получите всю необходимую информацию о параметрах главного окна редактирования и поля редактирования имени файла в диалоге открытия файла.

Получение информации об окне с помощью скрипта ScreenSensitiveHelpTechnical

Если вам нужно быстро прочитать контрольный идентификатор окна, класс или дескриптор, то вам поможет скрипт ScreenSensitiveHelpTechnical в файле скриптов по умолчанию. Доступ к этому скрипту можно получить с помощью комбинации клавиш Ctrl+Insert+ F1, и будет озвучен контрольный идентификатор, класс и дескриптор окна, содержащего активный курсор. Это самый быстрый способ получить эту информацию, если вам не нужны все другие данные, предоставляемые скриптами утилит.

Типы файлов скриптов

Как уже было сказано выше, существует несколько типов файлов, ассоциированных с написанием скриптов. Тип файла можно узнать по его расширению.

  • JSS - исходные файлы скриптов
  • JSH - файлы заголовков (включены в .JSS файлы)
  • JSM - файлы сообщений (включены в .JSS файлы)
  • JSB - скомпилированные файлы скриптов
  • JKM - файлы раскладки клавиатуры, которые содержат комбинации клавиш, закрепленные за различными скриптами.
  • JSD - файлы документации скриптов, которые содержат имена скриптов и ассоциированные с ними синопсисы и описания.
Исходные файлы

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

Надо сказать, что имеются некоторые соображения по поводу форматирования. Хотя ваш код может быть лично вам абсолютно понятен, другие могут вообще ничего в нем не понять, поскольку они не знали, что вы имели в виду и их работа, возможно, элементизована не так, как у вас. Поэтому мы хотели бы порекомендовать несколько правил правой руки, которые облегчат другим понимание вашего кода и помогут вам понять скрипты, написанные другими.

  1. Отдельные скрипты всегда должны разделяться пустыми строками.
  2. Набирайте с отступом любой раздел кода, который является служебным по отношению к тому, который над ним и к тому, который под ним. Это помогает пользователю разобраться в логике скрипта.

    Рассмотрим следующий скрипт:

    Script CheckVerbosity()
    If GetVerbosity() == BEGINNER Then
    	SayString("Beginning verbosity is active.")
    Else
    	SayString("Beginning verbosity is not active.")
    EndIf
    EndScript
    

    Обратите внимание, что If, Else и Endif находятся на одном уровне отступа, а утверждения внутри каждой ветви отодвинуты дальше (отступ может не отображаться браузером - прим. сост.). Каков должен быть отступ, это дело ваше, но мы рекомендуем примерно 5 символов. Использование табуляции для создания отступа работает лучше, чем пробелы, поскольку отступ будет постоянным, даже если вы работаете с пропорциональными шрифтами.

  3. Каждая функция должна быть на отдельной строке.
  4. Вот несколько рекомендаций по поводу заглавных букв:
    1. Начинайте каждое утверждение с большой буквы;
    2. Многие стандартные имена функций Jaws являются комбинациями двух или более слов, которые описывают функцию. Первая буква в каждом слове в имени функции начинается с заглавной буквы. В предыдущем примере мы использовали функции GetVerbosity и SayString. Это помогает правильно их озвучивать. Когда вы создаете переменные и функции, вы должны использовать аналогичное соглашение.
  5. Структура файла скриптов также является важной.
    1. Начинайте каждый файл с комментария, в котором должно быть описано, что содержит данный файл и как им полагается пользоваться. Перечислите всю конкретную информацию, которая может понадобиться тому, кто будет читать этот файл. Вы также могли бы включить список всех переменных и как они используются. Также важно включать дату и описание любых изменений и улучшений, которые были внесены со времени первого написания файла. Теперь любой может прочитать первые несколько строк вашего файла и все о нем узнать
    2. Следующим разделом должны быть операторы включения (Include).
    3. В следующем разделе поместите все объявления глобальных переменных.
    4. В следующем разделе поместите объявления констант.
    5. Следующим элементом вашего файла скриптов должна быть функция AutoStartEvent, если вы намерены ее использовать. Любой код, ассоциированный с этой функцией, автоматически начинает работать, когда загружается файл скриптов. Обычно эта функция используется для озвучивания каких-либо ознакомительных сообщений, или для инициализации каких-нибудь глобальных переменных, если они имеют ненулевое значение. Например, в файле скриптов по умолчанию стартовые сообщения Jaws о том, как получить помощь, находятся в этой функции.
    6. Следующим скриптом должен быть скрипт, который называется ScriptFileName, скрипт, прикрепленный к клавише Insert+Q. Этот скрипт будет сообщать имя текущего активного файла скриптов и приложения. Пример того, как нужно формулировать этот скрипт, вы можете найти в файле default.jss. Вы должны заменить данные, которые передаются в функцию ScriptAndAppNames именем вашего приложения.
    7. Далее следуют скрипты и определяемые пользователем функции. Постарайтесь соблюдать логический порядок, так чтобы всякий, читающий ваш файл скриптов смог его понять. Например, если у вас есть скрипт, который выполняет какое-либо действие, и другой, выполняющий противоположное действие, поместите их один за другим. Помещайте каждую функцию над первым скриптом или функцией, которая ее вызывает. Несоблюдение этого может привести к ошибке.
  6. Используйте комментарии, комментарии и еще раз комментарии! Комментарии предоставляют своего рода план местности для всякого, кто будет бродить по вашему коду. Помещайте строку с комментарием сразу же после начальной строки каждого скрипта или функции, и в этом комментарии описывайте назначение скрипта или функции. Помещайте комментарии внутри кода, описывая любое сложное утверждение, которое может оказаться непонятным интуитивно. Поставьте себя на место того, кто будет просматривать ваш код и предоставьте ему необходимую помощь. Вы даже можете помочь сами себе, поскольку можете забыть назначение конкретного раздела.

Скомпилированные файлы

Когда вы закончите писать свой код (а этого не случится никогда, поэтому когда вы устанете писать свой код), его нужно скомпилировать, чтобы Jaws мог его использовать. Вашему файлу будет присвоено то же имя, что и у приложения, и расширение .JSB, когда вы его скомпилируете, так что Jaws будет знать, когда его загружать. Процесс компиляции автоматически выполняется диспетчером скриптов, когда вы выбираете Save (Сохранить) из меню Файл. Исходный файл с расширением .JSS сохраняется, и в это же время создается и сохраняется файл с расширением .JSB. Эта компиляция включает все файлы заголовков и сообщений, которые были включены соответствующими утверждениями в начале .JSS файла.

Include файлы

Как мы уже говорили прежде, компилятор скриптов Jaws обеспечивает включение других файлов в наш файл скриптов во время компиляции. Когда компиляция будет завершена, все, что было во включенных файлах, стало частью .JSB файла и будет доступно всякий раз, когда файл скриптов будет активным. Есть два типа файлов включения:

Файлы заголовков обозначаются расширением .JSH и содержат или операторы переменных, или операторы констант.

Файлы сообщений обозначаются расширением .JSM и содержат сообщения вместе с присвоенными им номерами.

Всегда группируйте свои утверждения включения где-нибудь поближе к началу файла скриптов.

Помещение глобальных переменных и констант в отдельный файл заголовков, а сообщений в отдельный файл сообщений помогает лучше элементизовать работу. С Jaws поставляются два файла, которые предоставляют все стандартные глобальные переменные и константы. Они называются HJGLOBAL.JSH и HJCONST.JSH. Они сделаны с таким расчетом, чтобы разработчики могли использовать любую стандартную переменную или константу, просто включив их в свои собственные файлы скриптов. Файлы сообщений также сделаны в виде файлов включения. Стандартным файлом сообщений является DEFAULT.JSM. Использовать файлы сообщений в ваших скриптах необязательно. Henter-Joyce поместил сообщения в отдельном файле для более простого перевода на другие языки. Если вы намерены писать скрипты для общего пользования, было бы неплохо соблюдать это соглашение. Если вы все же используете файл сообщений, он должен быть назван также, как4 и файл скриптов, чтобы вы могли легко его найти.



Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2019