Сайт Информационных Технологий

4.4.3 Фрейм как совокупность процедур.

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

Строки описания характеризуются следующими моментами:

  1. Каждая строка описания фрейма относится либо к фрейму в целом, либо к одной из экранных форм фрейма, либо к одному из элементов одной из экранных форм фрейма.
  2. Каждая строка содержит одну (и только одну) функцию qW, которая, в свою очередь, может состоять из нескольких вызовов других функций.
  3. Каждая строка описания фрейма, кроме строк содержащих функцию def0, должна иметь некоторый программный М-код. Строки с def0 могут его не иметь. Слово “строка” не следует понимать слишком буквально - включенный М-код может состоять и из нескольких строк.
  4. Каждая строка описания фрейма может иметь (или не иметь) отнесенное к этой строке понятие (иногда несколько понятий), в зависимости от типа включенной в строку функции, в зависимости от возможности и обязательности связывания этой функции с понятиями.
  5. Кроме того, строка описания может иметь или не иметь отнесенное к этой строке текстовое пояснение.

В общем случае строки описания фрейма бывают двух типов - строки описания с функцией def0 и строки описания с переопределенной функцией.

Строка описания с переопределенной функцией.

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

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

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

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

Если в момент вызова некоторой функции qW'а эта функция не переопределена на уровне текущих объектов (т.е. отсутствует строки описания с переопределением этой функции), то будет вызван по имени и исполнен тот вариант этой функции, который находится в системе qW по умолчанию. Если вызывающая функция чисто qW'овская, то умолчание для вызываемой функции, разумеется, имеется. Если же вызывающая функция не qW'овская, а, например, Ваша, то, разумеется, Вы сами несете ответственность за то, что она будет вызывать.

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

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

Переопределенная функция может быть вызвана из двух принципиально разных "точек вызова". Во-первых, любая функция qW может быть вызвана из тела (програмного текста) другой функции с помощью конструкций $$F и D, о чем пойдет речь в параграфе "Функции qW". Во-вторых, некоторые функции qW могут быть вызваны из обработчика событий qW. По завершении выполнения переопределенной функции в первом случае происходит возврат в тело вызвавшей функции, во втором случае система будет исполнять отработку или ожидать появления следующего события, о чем пойдет речь в параграфе "События qW".

Строка описания с функцией def0.

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

Если Вы в списке строк описания фрейма оставите только строки с def0, то это подмножество строк позволит Вам представить фрейм как совокупность входящих в него экранных форм, а каждую из экранных форм - как совокупность входящих в нее элементов. Фреймы, экранные формы и элементы экранных форм имеют код. Код (номер) фрейма, как уже было сказано, число в интервале 0-999. Код (номер) экранной формы – один символ, чаще всего цифра, код (номер) элемента – число. Коды фрейма и экранной формы задает Пользователь, код элемента подставляет qW.

Функция def0 не содержит М-кода по умолчанию (кроме просто q “” – кода завершения). В зависимости от того что она определяет, в строке описания фрейма с этой функцией (в отличие от других функций) может как быть так и не быть М-кода переопределения.

Как правило, М-код функции def0 вызывается только из обработчика событий qW по событию типа "выбор", связанному с объектом, который определяется строкой описания с этой самой def0. Если, например, строка с def0 описывает элемент экранной формы типа "метка", для которого нет события типа "выбор", то написание М-кода для этой функции вряд-ли будет иметь какой-либо смысл.


Site of Information Technologies
Designed by  inftech@webservis.ru.