<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>bind</title> </head> <body> <h1>bind</h1> <p>Команда <strong>bind</strong> позволяет привязать выполнение скриптов Tcl к X событиям. Команда назначает событиям ввода от "Мыши" и клавиатуры (Х событиям) исполнение скрипта Tcl.</p> <h2><a name="СИНТАКСИС"></a>СИНТАКСИС</h2> <pre> <strong>bind</strong> <em>тег</em> <strong>bind</strong> <em>тег последовательность</em> <strong>bind</strong> <em>тег последовательность скрипт</em> <strong>bind</strong> <em>тег последовательность +скрипт</em> </pre> <h2><a name="ОПИСАНИЕ"></a>ОПИСАНИЕ</h2> <p>Команда <strong>bind</strong> привязывает Tcl скрипты к X событиям. Если заданы все три аргумента команды, то при каждом наступлении события <em>последовательность</em> в окне (окнах), описанных <em>тег</em>ом, будет выполняться <em>скрипт</em> (скрипт Tcl). Если аргументу <em>скрипт</em> предшествует знак +, то скрипт добавляется к уже существующим привязкам к <em>последовательности</em>; в противном случае он замещает все имеющиеся привязки. Если аргумент <em>скрипт</em> пуст, то все имеющиеся привязки к <em>последовательности</em> отменяются, и <em>последовательность</em> становится несвязанной. Если аргумент <em>скрипт</em> присутствует, то команда <strong>bind</strong> возвращает пустую строку.</p> <p>Если при отсутствии аргумента <em>скрипт</em> аргумент <em>последовательность</em> задан, то команда возвращает скрипт, привязанный к данной последовательности, или, в случае отсутствия такого скрипта, пустую строку. Если не задан ни один из аргументов <em>последовательность</em> и <em>скрипт</em>, то команда возвращает список, элементами которого служат все последовательности, имеющие привязки к окну <em>тег</em>.</p> <p>Аргумент <em>тег</em> перечисляет окна, к которым выполняется привязка. Если значение аргумента начинается с точки, скажем ".a.b.c", то оно должно представлять собой путь к окну; в противном случае оно может быть произвольной строкой. Каждому окну приписан некоторый список тегов, и привязка к данному окну осуществляется, если значение аргумента <em>тег</em> присутствует в этом списке. Команда <a href="bindtags.html"><strong>bindtags</strong></a> позволяет приписать окну произвольный набор тегов привязки; кроме того, по умолчанию окнам приписаны следующие теги:</p> <ul> <li>тег, являющийся именем внутреннего окна, приписывается этому окну;</li> <li>тег, являющийся именем окна верхнего уровня, приписывается этому окну и всем его внутренним окнам;</li> <li>тег, являющийся именем класса примитивов, скажем <strong>Button</strong>, приписывается всем примитивам этого класса;</li> <li>тег с именем <strong>all</strong> приписывается всем окнам приложения.</li> </ul> <h2><a name="ОБРАЗЦЫ_СОБЫТИЙ"></a>ОБРАЗЦЫ СОБЫТИЙ</h2> <p>Аргумент <em>последовательность</em> представляет собой последовательность одного или нескольких образцов событий. Каждый образец может быть записан в одном из трех видов. В простейшем случае это символ ASCII, скажем <strong>a</strong> или <strong>|</strong>. Этот символ не может быть пробелом или знаком <. Этот вид образцов соответствует событию <strong>KeyPress</strong> для конкретной клавиши. Образцы второго вида длиннее, однако, этот вид носит более общий характер. Его синтаксис выглядит следующим образом:</p> <pre> <<em>модификатор-модификатор-тип-детализация</em>> </pre> <p>Образец события целиком заключен в угловые скобки. Внутри угловых скобок располагаются несколько модификаторов (быть может, ни одного), тип события и дополнительная порция информации (<em>детализация</em>), указывающая конкретную кнопку или комбинацию клавиш. Одно из полей <em>тип</em> или <em>детализация</em> должно обязательно присутствовать, остальные могут быть опущены. Поля разделяются пробелами или дефисами.</p> <p>Третья форма образца используется для задания поименованного виртуального события, определенного пользователем. У нее следующий синтаксис:</p> <pre> <<<em>имя</em>>> </pre> <p>Образец события целиком заключен в двойные угловые скобки. Внутри этих скобок содержится определенное пользователем имя виртуального события. С виртуальным событием нельзя комбинировать модификаторы, такие как <strong>Shift</strong>или <strong>Control</strong>. Привязки к виртуальному событию можно создавать до описания самого события; при динамическом изменении этого описания все окна, привязанные к событию, будут обращаться к новому описанию.</p> <h2><a name="МОДИФИКАТОРЫ"></a>МОДИФИКАТОРЫ</h2> <p>Модификаторы могут быть следующими:</p> <ul> <li><strong>Alt</strong></li> <li><strong>Button1</strong>, <strong>B1</strong></li> <li><strong>Button2</strong>, <strong>B2</strong></li> <li><strong>Button3</strong>, <strong>B3</strong></li> <li><strong>Button4</strong>, <strong>B4</strong></li> <li><strong>Button5</strong>, <strong>B5</strong></li> <li><strong>Control</strong></li> <li><strong>Double</strong></li> <li><strong>Lock</strong></li> <li><strong>Meta</strong>, <strong>M</strong></li> <li><strong>Mod1</strong>, <strong>M1</strong></li> <li><strong>Mod2</strong>, <strong>M2</strong></li> <li><strong>Mod3</strong>, <strong>M3</strong></li> <li><strong>Mod4</strong>, <strong>M4</strong></li> <li><strong>Mod5</strong>, <strong>M5</strong></li> <li><strong>Shift</strong></li> <li><strong>Triple</strong></li> </ul> <p>Если в строке приведено несколько элементов, разделенных запятыми, то они взаимозаменяемы. У большинства модификаторов есть очевидное X значение. Например, модификатор <strong>Button1</strong> требует нажатия кнопки 1 для наступления события. Чтобы привязка соответствовала данному событию, среди модификаторов события должны содержаться все модификаторы, заданные в образце события. Кроме того событие может содержать и другие модификаторы, не приведенные в описании привязки. Например, при нажатии кнопки 1 одновременно с нажатием клавиш <strong>Shift</strong> и <strong>Ctrl</strong> событие подойдет под образец <<strong>Control-Button-1</strong>>, но не подойдет под образец <<strong>Mod1-Button-1</strong>>. Если ни один из модификаторов не был задан, то в событии может присутствовать любая комбинация модификаторов.</p> <p>Модификаторы <strong>Meta</strong> и <strong>M</strong> заменяют любой из идентификаторов от <strong>M1</strong> до <strong>M5</strong>, ассоциированный с метаклавишами на клавиатуре (коды клавиш <strong>Meta_R</strong> и <strong>Meta_L</strong>). При отсутствии метаклавиш или в случае, если они не ассоциированы ни с каким модификатором, модификаторы <strong>Meta</strong> и <strong>M</strong> не будут соответствовать никакому событию. Аналогично модификатор <strong>Alt</strong> заменяет любой из модификаторов, ассоциированных с alt-клавишами на клавиатуре (коды клавиш <strong>Alt_L</strong> и <strong>Alt_R</strong>).</p> <p>Модификаторы <strong>Double</strong>и <strong>Triple</strong> обеспечивают удобную обработку двойного щелчка .Мыши. и других повторяющихся событий. Они требуют, чтобы данное событие повторилось дважды или трижды, и накладывают ограничения на время и место его повторения: для того, чтобы последовательность событий подходила под образец <strong>Double</strong> или <strong>Triple</strong>, промежуток времени между событиями должен быть коротким, а "Мышь" не должна сдвигаться. Например, комбинация <<strong>Double-Button-1</strong>> эквивалентна паре <<strong>Button-1<em>><</em>Button-1</strong>> с дополнительными временными и пространственными ограничениями.</p> <h2><a name="ТИПЫ_СОБЫТИЙ"></a>ТИПЫ СОБЫТИЙ</h2> <p>Значением поля <em>тип</em> может быть любой из стандартных типов X событий, а также некоторые дополнительные сокращения. Ниже приведен список всех допустимых значений. Два имени, составляющие пару, синонимичны.</p> <ul> <li><strong>Activate</strong></li> <li><strong>Button</strong></li> <li><strong>ButtonPress</strong></li> <li><strong>ButtonRelease</strong></li> <li><strong>Circulate</strong></li> <li><strong>Colormap</strong></li> <li><strong>Configure</strong></li> <li><strong>Deactivate</strong></li> <li><strong>Destroy</strong></li> <li><strong>Enter</strong></li> <li><strong>Expose</strong></li> <li><strong>FocusIn</strong></li> <li><strong>FocusOut</strong></li> <li><strong>Gravity</strong></li> <li><strong>Key Unmap</strong></li> <li><strong>KeyPress</strong></li> <li><strong>KeyRelease</strong></li> <li><strong>Leave</strong></li> <li><strong>Map</strong></li> <li><strong>Motion</strong></li> <li><strong>Property</strong></li> <li><strong>Reparent</strong></li> <li><strong>Visibility</strong></li> </ul> <p>Последней частью длинной спецификации события является <em>детализация</em>. Для типов <strong>ButtonPress</strong> и <strong>ButtonRelease</strong> это номер кнопки (1-5). Если номер кнопки задан, то под образец подойдет только событие на указанной кнопке; если номер кнопки не задан, то под образец подойдет событие на любой из кнопок. Замечание: задание номера кнопки отличается от задания модификатора кнопки: в первом случае требуется, чтобы кнопка была нажата или отжата; во втором чтобы какая-то другая кнопка была отжата при наступлении события. Если номер кнопки задан, то поле <em>тип</em> можно опустить: по умолчанию оно будет иметь значение <strong>ButtonPress</strong>. Например, спецификатор <<strong>1</strong>> эквивалентен спецификатору <<strong>ButtonPress-1</strong>>. <p>Для типов <strong>KeyPress</strong> и <strong>KeyRelease</strong> детализацию можно указать в виде описателя X клавиши. В их число входят все алфавитно-цифровые символы ASCII (например, описатель <strong>a</strong> служит для описания символа ASCII "a"), а также описатели для неалфавитно-цифровых символов (описатель <strong>comma</strong> для запятой) и описатели для всех не ASCII-клавиш клавиатуры (<strong>Shift_L</strong> для левой клавиши верхнего регистра, <strong>F1</strong> для первой функциональной клавиши при ее наличии). Мы не приводим здесь полный список клавиш. Он меняется от системы к системе, и его можно найти в других частях X документации. При необходимости можно получить описатель клавиши с помощью обозначения <strong>%K</strong>, описанного ниже. Если приведена <em>детализация</em> описателя клавиши, то поле <em>тип</em> может отсутствовать, по умолчанию принимается значение <strong>KeyPress</strong>. Например, спецификатор <<strong>Control-comma</strong>> эквивалентен спецификатору <<strong>Control-KeyPress-comma</strong>>.</p> <h2><a name="ПОДСТАНОВКИ_И_СКРИПТЫ_ПРИВЯЗКИ"></a>ПОДСТАНОВКИ И СКРИПТЫ ПРИВЯЗКИ</h2> <p>Аргумент <em>скрипт</em> команды <strong>bind</strong> должен быть скриптом Tcl; при каждом наступлении события происходит выполнение этого скрипта. <em>Команда</em> выполняется тем же интерпретатором, что и команда <strong>bind</strong>, причем интерпретация происходит на верхнем уровне (доступны только значения глобальных переменных). Если в <em>скрипт</em>е есть символы <strong>%</strong>, то его исполнение не будет осуществляться непосредственно. Каждый символ <strong>%</strong> и символ, следующий за ним, заменяются данными о происшедшем событии, в результате чего генерируется новый скрипт. Подстановка осуществляется в соответствии с приводимым ниже списком символов. Если не оговорено противное, то подставляемая строка представляет собой десятичное содержимое указанного поля события. Некоторые подстановки допустимы только для событий определенных типов: при использовании их с событиями других типов результат подстановки не определен.</p> <dl> <dt><strong>%%</strong></dt> <dd>Заменяется однократным процентом.</dd> <dt><strong>%#</strong></dt> <dd>Номер последнего обработанного сервером запроса клиента (<em>сериальное</em> поле события). Допустимо для событий всех типов.</dd> <dt><strong>%a</strong></dt> <dd>Поле <em>выше</em> события, отформатированное как шестнадцатеричное число. Допустимо только для событий <strong>Configure</strong>.</dd> <dt><strong>%b</strong></dt> <dd>Номер нажатой или отпущенной кнопки. Допустимо только для событий <strong>ButtonPress</strong> и <strong>ButtonRelease</strong>.</dd> <dt><strong>%c</strong></dt> <dd>Поле <em>счетчик</em> события. Допустимо только для событий <strong>Expose</strong>.</dd> <dd><strong>%d</strong></dd> <dd>Поле <em>детализация</em> события. Символы <strong>%d</strong> заменяются строкой детализации. Для событий <strong>Enter</strong>, <strong>Leave</strong>, <strong>FocusIn</strong>, <strong>FocusOut</strong> строка должна быть одной из следующих: <strong>NotifyAncestor</strong>, <strong>NotifyNonlinearVirtual</strong> <strong>NotifyDetailNone</strong>, <strong>NotifyPointer</strong>, <strong>NotifyInterior</strong>, <strong>NotifyPointerRoot</strong>, <strong>NotifyNonlinear</strong>, <strong>NotifyVirtual</strong>. <p>Для прочих событий подставляемая строка не определена.</p> </dd> <dt><strong>%f</strong></dt> <dd>Поле <em>фокус</em> события (<strong>0</strong> или <strong>1</strong>). Допустимо только для событий <strong>Enter</strong> и <strong>Leave</strong>.</dd> <dt><strong>%h</strong></dt> <dd>Поле <em>высота</em> события. Допустимо только для событий <strong>Configure</strong> и <strong>Expose</strong>.</dd> <dt><strong>%k</strong></dt> <dd>Поле <em>код_клавиши</em> события. Допустимо только для событий <strong>KeyPress</strong> и <strong>KeyRelease</strong>.</dd> <dt><strong>%m</strong></dt> <dd>Поле <em>режим</em> события. Подставляется одна из строк <strong>NotifyNormal</strong>, <strong>NotifyGrab</strong>, <strong>NotifyUngrab</strong> или <strong>NotifyWhileGrabbed</strong>. Допустимо только для событий <strong>Enter</strong>, <strong>FocusIn</strong>, <strong>FocusOut</strong> и <strong>Leave</strong>.</dd> <dt><strong>%o</strong></dt> <dd>Поле <em>подавить_перенаправление</em> события.Допустимо только для событий <strong>Map</strong>, <strong>Reparent</strong> и <strong>Configure</strong>.</dd> <dt><strong>%p</strong></dt> <dd>Поле <em>размещать</em> события. Строка подстановки имеет вид <strong>PlaceOnTop</strong> или <strong>PlaceOnBottom</strong>. Допустимо только для событий <strong>Circulate</strong>.</dd> <dt><strong>%s</strong></dt> <dd>Поле <em>состояние</em> события. Для событий <strong>ButtonPress</strong>, <strong>ButtonRelease</strong>, <strong>Enter</strong>, <strong>KeyPress</strong>, <strong>KeyRelease</strong>, <strong>Leave</strong> и <strong>Motion</strong> происходит подстановка десятичного числа. Для события <strong>Visibility</strong> подставляется одна из строк <strong>isibilityUnobscured</strong>, <strong>VisibilityPartiallyObscured</strong> или <strong>VisibilityFullyObscured</strong>.</dd> <dt><strong>%t</strong></dt> <dd>Поле <em>время</em> события. Допустимо только для событий, содержащих поле <em>время</em>.</dd> <dt><strong>%w</strong></dt> <dd>Поле <em>ширина</em> события. Допустимо только для событий <strong>Configure</strong> и <strong>Expose</strong>.</dd> <dt><strong>%x</strong></dt> <dd>Поле <em>x</em> события. Допустимо только для событий, содержащих поле <em>x</em>.</dd> <dt> <strong>%y</strong></dt> <dd> Поле <em>y</em> события.Допустимо только для событий, содержащих поле <em>y</em>.</dd> <dt><strong>%A</strong></dt> <dd>Заменяется символом ASCII, отвечающим происшедшему событию,или пустой строкой, если событию не соответствует никакой символ ASCII (например, нажата клавиша верхнего регистра). Работу по переводу события в ASCII символ выполняет <strong>XLookupString</strong>. Допустимо только для событий <strong>KeyPress</strong> и <strong>KeyRelease</strong>.</dd> <dt><strong>%B</strong></dt> <dd>Поле <em>ширина_бордюра</em> события.Допустимо только для событий <strong>Configure</strong>.</dd> <dt><strong>%E</strong></dt> <dd>Поле <em>послать_событие</em> события.Допустимо для событий всех типов.</dd> <dt><strong>%K</strong></dt> <dd>Код клавиши, соответствующей данному событию, представленный текстовой строкой. Допустимо только для событий <strong>KeyPress</strong> и <strong>KeyRelease</strong>.</dd> <dt><strong>%N</strong></dt> <dd>Код клавиши, соответствующей данному событию, представленный десятичным числом. Допустимо только для событий <strong>KeyPress</strong> и <strong>KeyRelease</strong>.</dd> <dt> <strong>%R</strong></dt> <dd>Идентификатор корневого окна события.Допустимо только для событий содержащих поле <em>корень</em>.</dd> <dt> <strong>%S</strong></dt> <dd>Идентификатор подокна события, представленный в виде шестнадцатиричного числа. Допустимо только для событий содержащих поле <em>подокно</em>.</dd> <dt><strong>%T</strong></dt> <dd>Поле <em>тип</em> события. Допустимо для событий всех типов.</dd> <dt><strong>%W</strong></dt> <dd>Путь к окну, к которому отнесено событие (поле <em>окно</em> события). Допустимо для событий всех типов.</dd> <dt> <strong>%X</strong></dt> <dd>Поле <em>x_корень</em> события. При использовании виртуально-корневого менеджера окон подставляемое значение равняется x-координате в виртуальном корне. Допустимо только для событий <strong>ButtonPress</strong>, <strong>ButtonRelease</strong>, <strong>KeyPress</strong>, <strong>KeyRelease</strong> и <strong>Motion</strong>.</dd> <dt><strong>%Y</strong></dt> <dd>Поле <em>y_корень</em> события. При использовании виртуально-корневого менеджера окон подставляемое значение равняется y-координате в виртуальном корне. Допустимо только для событий <strong>ButtonPress</strong>, <strong>ButtonRelease</strong>, <strong>KeyPress</strong>, <strong>KeyRelease</strong> и <strong>Motion</strong>.</dd> </dl> <p>Строка подстановки для %-замещения форматируется как обычный элемент списка Tcl. Это означает, что при наличии в строке пробелов она заключается в фигурные скобки, а специальным символам, таким как `$' и `{' может предшествовать обратная косая черта. Такая строка нормально обрабатывается синтаксическим анализатором Tcl при выполнении скрипта. Строки подстановки по большей части являются числами или корректно определенными строками как, например, <strong>Above</strong>; такие строки не нуждаются ни в каком специальном форматировании. Чаще всего форматирования требуют строки, замещающие <strong>%A</strong>. Если, например, скрипт имеет вид</p> <pre>insert %A</pre> <p>и вводимым символом является открывающая квадратная скобка, то реально исполняемым скриптом будет</p> <pre>insert \[</pre> <p>т.е. в качестве первого аргумента <strong>insert</strong> получит исходную строку подстановки (открывающую квадратную скобку). Если бы обратная косая черта не была добавлена, Tcl не смог бы правильно обработать скрипт.</p> <h2><a name="НЕСКОЛЬКО_ПРИВЯЗОК_ОТВЕЧАЮЩИХ_ОБРАЗЦУ"></a>НЕСКОЛЬКО ПРИВЯЗОК, ОТВЕЧАЮЩИХ ОБРАЗЦУ</h2> <p>Данному X событию может отвечать несколько привязок. Если эти привязки соответствуют различным <em>тег</em>ам, то все они выполняются по очереди. По умолчанию сначала исполняется привязка для примитива, затем привязка класса, затем привязка верхнего уровня и привязка <strong>all</strong>. Этот порядок для конкретного окна можно поменять с помощью команды <a href="bindtags.html"><strong>bindtags</strong></a>, которая позволяет также выполнить дополнительные привязки к окну.</p> <p>Управление обработкой скриптов, отвечающих образцу, осуществляется командами <a href="../tcl/continue.html"><strong>continue</strong></a> и <a href="../tcl/break.html"><strong>break</strong></a> в привязанном скрипте. При выполнении команды <a href="../tcl/continue.html"><strong>continue</strong></a> выполнение текущего привязанного скрипта прерывается и Tk переходит к выполнению скриптов, соответствующих остальным <em>тег</em>ам. При выполнении команды <a href="../tcl/break.html"><strong>break</strong></a> выполнение текущего привязанного скрипта прерывается и никакие другие скрипты не выполняются.</p> <p>Если данному событию соответствует несколько привязок с одним и тем же тегом, то из них выбирается наиболее конкретная привязка и выполняется ее скрипт. Выбор наиболее конкретной привязки осуществляется по следующим критериям:</p> <ol type="a"> <li>образец события, задающий конкретную кнопку или клавишу, более конкретен, чем тот, в котором такой спецификации не задано;</li> <li>более длинная последовательность (по числу отвечающих образцу событий) конкретнее более короткой;</li> <li>если модификаторы первого образца содержатся среди модификаторов второго, то образец с большим числом модификаторов более конкретен;</li> <li>виртуальное событие, физический образец которого соответствует последовательности, менее конкретно, чем тот же самый физический образец, не связанный ни с каким виртуальным событием;</li> <li><p>если последовательность отвечает двум или более виртуальным событиям, то из них выбирается какое-нибудь одно, однако порядок выбора не определен.</p> <p>Если в подходящей последовательности событий больше одного события, то критерии 1 - 5 применяются ко всем событиям, начиная с самого последнего и до самого первого события последовательности. Если критерии не позволяют определить победителя, то победителем становится событие, зарегистрированное последним.</p> </ol> <p>Если одна и та же последовательность осуществляет переключение к двум (или более) виртуальным событиям, и теги окон этих виртуальных событий совпадают, то переключение произойдет лишь к одному из этих виртуальных событий, выбранному случайным образом:</p> <pre> event add <<Paste>> <Control-y> event add <<Paste>> <Button-2> event add <<Scroll>> <Button-2> bind Entry <<Paste>> {puts Paste} bind Entry <<Scroll>> {puts Scroll} </pre> <p>При нажатии <strong>Control-y</strong> будет выполнена привязка <<<strong>Paste</strong>>>, а при нажатии кнопки 2 одна из привязок <<<strong>Paste</strong>>> или <<<strong>Scroll</strong>>>, причем определить какой именно будет эта привязка, невозможно.</p> <p>Если X событие не подходит ни под одну из существующих привязок, то событие игнорируется. Наступление не привязанного события не считается ошибкой.</p> <h2><a name="ПОСЛЕДОВАТЕЛЬНОСТИ_НЕСКОЛЬКИХ_СОБЫТИЙ_И_ИГНОРИРУЕМЫЕ_СОБЫТИЯ"></a>ПОСЛЕДОВАТЕЛЬНОСТИ НЕСКОЛЬКИХ СОБЫТИЙ И ИГНОРИРУЕМЫЕ СОБЫТИЯ</h2> <p>Если аргумент <em>последовательность</em> в команде <strong>bind</strong> состоит из нескольких образцов событий, то скрипт выполняется в случае, если последние события (включая самое последнее) подходят под данную последовательность. Это означает, например, что при неоднократном последовательном нажатии кнопки 1 каждое из нажатий, за исключением самого первого, отвечает образцу <<strong>Doudble-ButtonPress-1</strong>>. Если в последовательности событий происходят посторонние события, то они игнорируются, за исключением событий <strong>KeyPress</strong> и <strong>ButtonPress</strong>. Например, нажатия на кнопку 1 будут соответствовать образцу <<strong>Doudble-ButtonPress-1</strong>>, даже если их перемежают события <strong>ButtonRelease</strong> или <strong>Motion</strong>. Кроме того событию <strong>KeyPress</strong>может предшествовать произвольная последовательность событий <strong>KeyPress</strong> для модификаторов, среди которых нет модификаторов, нарушающих соответствие образцу. Например, последовательности событий <strong>aB</strong> отвечает нажатие на клавишу <strong>a</strong>, отпускание клавиши <strong>a</strong>, нажатие на клавишу <strong>Shift</strong> и нажатие на клавишу <strong>b</strong>, так как нажатие на клавишу модификатора <strong>Shift</strong> игнорируется. И, наконец, если последовательно происходит несколько событий <strong>Motion</strong>, то для установления соответствия привязке берется последнее из них.</p> <h2><a name="ОШИБКИ"></a>ОШИБКИ</h2> <p>При возникновении ошибки в процессе исполнения привязанного скрипта для выдачи сообщения об ошибке используется механизм <a href="../tcl/bgerror.html"><strong>bgerror</strong></a>. Команда <a href="../tcl/bgerror.html"><strong>bgerror</strong></a> исполняется на верхнем уровне (вне контекста любой из процедур Tcl).</p> </body> </html>