2. Экраны Когда Вы строите экран, Вы создаете кусочек кода для своей прикладной задачи. Информация об экране сохраняется в базе данных .SCX. Эта база данных имеет соответствующее поле меморандума с расширением .SCT. Файл экрана содержит: - информацию для определения окон (если экран определен как окно) - информацию для определения размера, положения и вида всех полей и органов управления - информацию о среде (если она сохраняется вместе с экраном) - весь используемый код (определенный во фрагментах кода) для опреде- ления поведения экрана и объектов на экране. Программа GENSCRN, генератор экранов FoxPro, извлекает информацию из базы данных .SCX и создает файл экранной программы с расширением .SPR. Файл экранной программы с расширением .SCX нельзя редактировать. Когда нужно внести изменения в экран, они должны быть сделаны на самом экра- не (с помощью построителя экранов FoxPro). В этой главе подразумевается, что Вы знакомы с построителем экранов и с тем, как создавать объекты и определять фрагменты кода, а также с командами и функциями FoxPro. Примеры этой главы демонстрируют, как использовать дополнительные операторы, относящиеся к каждому READ и дополнительному оператору объектного уровня, для определения поведения экрана и объектов на экране. Все примеры взяты из прикладной задачи ORGANIZER, поставляемой в составе FoxPro. Более подробная информация об этой задаче приводится в главе "Собирая все вместе" из данного руководства. Мы рекомендуем Вам открывать эк- ранные (.SCX) файлы, чтобы посмотреть на коды во фрагментах кода для различных объектов на экране. Сравните фрагменты кода, чтобы увидеть, как объекты взаимодействуют друг с другом и с другими экранами в набо- ре экранов. Для того, чтобы увидеть, как ведут себя объекты и экраны, задачу ORGANIZER нужно выполнить. Преимущества построителя экранов Экономит много времени Требуя минимум времени на изучение, построитель экранов сразу же дает большой выигрыш во времени. Генератор кодов создает все коды для опре- деления физического размещения полей и органов управления. Он также назначает имена процедурам, исключая возможность дублирования имен в прикладной задаче. Организация и ясность Построитель экранов дает метод для инкапсуляции кодов интерфейса и от- деления их от процедурных кодов. Вы можете унифицировать объект и про- цедуры, определяющие его действия. Процедуры определяются во фрагмен- тах кодов, которые хранятся вместе с объектами. WYSIWYG "Что видишь, то и получаешь" - для определения положения поля больше не надо считать строки и столбцы. Представьте, что кто-то пытается подсчитывать элементы изображения в графической среде! Вот незадача! Когда Вы проектируете экран с помощью построителя экранов, Вы можете видеть, как будет выглядеть экран и как различные объекты взаимодейст- вуют друг с другом в генерируемом экране. При этом можно поэксперимен- тировать с различными видами экрана. Повышенная продуктивность Вы можете спроектировать "сервисные" экраны, которые могут объеди- няться с другими экранами в наборе экранов. Один и тот же сервисный экран может накладываться в одной прикладной задаче несколько раз без дублирования кодов. Кроме этого, если Вы вносите в сервисный экран из- менения, они отражаются в каждой прикладной задаче, использующей этот экран. В составе пакета поставляется несколько сервисных экранов, ко- торые можно использовать как блоки для построения прикладной задачи. Для того, чтобы использовать свой собственный стиль интерфейса, Вы мо- жете создать свою собственную библиотеку многократно используемых эк- ранов. Термины, используемые в этой главе Ниже приводится список терминов, используемых в этой главе: Code sniррets (фрагменты кода) - Фрагмент кода, связанный с объектом или экраном. Хранится вместе с экраном. Control (орган управления) - Текстовые кнопки, блоки проверки, селек- тивные кнопки, пункты управления всплывающими меню, списки или невиди- мые кнопки и пункты управления, которые могут быть определены на экра- не. Generated code (сгенерированный код) - Код, сгенерированный генерато- ром экранов GENSCRN в системе FoxPro. Object level clause (оператор объектного уровня) - Оператор для специ- ального объекта экрана. Для каждого оператора может быть определен фрагмент кода. Для всех объектов можно использовать операторы WНEN, VALID и MESSAGE. Для полей GET и EDIT можно использовать оператор ERROR. READ level clause (оператор уровня READ) - Оператор, определенный для конкретного экрана. Для каждого оператора может быть определен фраг- мент кода. Для экранов можно использовать операторы ACTIVATE, VALID, DEACTIVATE, SНOW и WНEN. Screen set (набор экранов) - Набор экранов может состоять из одного экрана или быть комбинацией нескольких экранов. Для набора экранов ге- нерируется одна программа .SPR. .SCX-файл - файл базы данных экрана .SCT-файл - файл меморандума, связанный с базой данных .SCX .SPR-файл - файл сгенерированной программы экрана .SPX-файл - откомпилированный .SPR-файл User-named рrocedures (процедуры, поименованные пользователем) - про- цедуры, которые пользователь именует и вызывает по имени во фрагменте кода или в выражении. Альтернативой им являются процедуры, поименован- ные генератором. Utility screen (сервисный экран) - Экраны, предназначенные для работы с другими экранами при объединении их в наборе экранов. Сервисные эк- раны обеспечивают в прикладных задачах согласование. Изменения, сде- ланные в сервисном экране, отражаются во всех модулях прикладной зада- чи, в которых используется сервисный экран. Сервисные экраны Сервисные экраны - это экраны, предназначенные для многократного ис- пользования в прикладной программе или в нескольких прикладных прог- раммах. Они часто комбинируются с другими экранами в наборе экранов. Сервисные экраны обычно делаются независимыми от структуры и контекста конкретной базы данных. Сервисные экраны могут использоваться различным образом. В прикладной задаче ORGANIZER сервисные экраны используются для перемещения по по- лям данных (CONTROL.SCX) и для определения положения конкретных запи- сей в полях данных (BROWSER.SCX). -------------------------------------------------------------------------¬ ¦ < Next > < Prior > < Toр > < Bottom > < Locate > о OК п ¦ L------------------------------------------------------------------------- CONTROL1.SCX Когда Вы используете сервисный экран - Вы можете использовать (разде- лять) один и тот же экран в различных прикладных задачах. - Вы обеспечиваете согласованность в рамках прикладной задачи Когда сервисный экран используется в нескольких местах, пользователю стано- вится знакомым его вид и функциональные возможности. - Любые изменения, вносимые в сервисный экран, отражаются в прикладной задаче. Когда вы модифицируете сервисный экран, администратор проектов гарантирует, что в каждой прикладной задаче будет использоваться пос- ледняя версия сервисного экрана. От Вас требуется лишь вновь построить проекты, содержащие модифицированный сервисный экран. Именование переменных в сервисных экранах Когда Вы именуете переменные в сервисных экранах, во избежание конфликта с именами переменных из базы данных (именами полей) для их имен должен использоваться префикс "m.". Переменные типа REGIONAL в сервисных экранах Так как сервисные экраны часто комбинируются с другими экранами в на- бор экранов, то при проектировании сервисных экранов лучше всего опре- делять переменные как REGIONAL. Для создания переменных и массивов пе- ременных в региональной памяти используется команда REGIONAL. Перемен- ные или массивы в памяти с идентичными именами могут создаваться без перекрытия друг друга - их значения защищаются внутри каждой "облас- ти". Использование переменных REGIONAL описывается в этой главе ниже, а также в "Руководстве по командам и функциям". Другие экраны Многие экраны создаются для работы с конкретной базой данных или прик- ладной задачей. "Несервисные" экраны: - используются только один раз - обычно адресуют информацию, уникальную только для текущей прикладной задачи Наборы экранов Набор экранов может состоять из одного экрана или быть комбинацией нескольких экранов. Для набора экранов генерируется только одна прог- рамма .SPR. Модульность частей интерфейса Экраны, объединенные в набор экранов обычно определяются как окна. Это позволяет считать, что "один экран - одно окно". Например, панель уп- равления является отдельным экраном, так как она занимает свое собст- венное окно. Не надо думать, что экран - это все, что есть на экране. Нужно считать, что экран - это объект, занимающий одно окно. Создание набора экранов Набор экранов можно создать с помощью администратора проектов. Когда Вы добавляете экран к проекту, на экране появляется окно диалога Generate Screen. Для добавления в набор экранов нужных экранов нужно выбрать текстовую кнопку Add. По кнопке из блока диалога Generate Screen вы можете поименовать набор экранов. Имя первого экрана в набо- ре экранов отображается по умолчанию в текстовом блоке. Порядок, в котором экраны помещаются в набор экранов, влияет на на доступ к экранам при выполнении. Он также влияет на генерацию фрагмен- тов кода на уровне READ в .SPR-программе. Команды выбора в блоке диа- лога Generate Screen позволяют Вам редактировать, удалять и упорядочи- вать экраны. Вы можете также подавлять генерацию некоторых сегментов кода. Информация по упорядочению экранов в наборе экранов и другим ко- мандам выбора в блоке диалога Generate Screen приводится в главе "Построитель экранов" в "Руководстве по интерфейсу". Вы можете сохранить координаты, указанные при упорядочении экранов, помещая экраны в проект и сохраняя его. Вся информация, указанная в блоке диалога Generate Screen, сохраняется в файле проекта. Когда Вы определяете и генерируете набор экранов, содержащий несколько экранов, код настройки из последовательных экранов сцепляется с кодом настройки из первого экрана. Можно написать код для одного экрана, ко- торый будет безусловно изменять нужный выход кода, написанного для предыдущего экрана. Тщательное планирование и кодирование будет гаран- тировать получение ожидаемых результатов. Фрагменты кода Когда Вы создаете экран, Вы можете определить фрагменты кода, связан- ные с конкретным оператором для конкретного объекта экрана. Вы можете также определить фрагменты кода, влияющие на весь экран. Определение фрагментов кода описывается в главе "Построитель экранов" в "Руко- водстве по интерфейсу". Когда объекту или экрану назначается оператор, Вы можете определить выражение или процедуру для оператора. г==========================================================¬ ¦ ¦ ¦ г======================================================¬ ¦ ¦ ¦ ¦ ¦ ¦ ¦ Error: ¦ ¦ ¦ ¦ --------------------------------------¬ ¦ ¦ ¦ ¦ ¦ ( ) Procedure < Edit... > ¦ ¦ ¦ ¦ ¦ ¦ () Exрression ¦ ¦ ¦ ¦ ¦ ¦ ¦ о OК п ¦ ¦ ¦ ¦ ¦ "Blank entries are not allowed" ¦ ¦ ¦ ¦ ¦ ¦ ¦ < Cancel > ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ CTRL+TAB to exit ¦ ¦ ¦ ¦ ¦ L-------------------------------------- ¦ ¦ ¦ ¦ ¦ ¦ ¦ L======================================================- ¦ ¦ ¦ L==========================================================- Примеры этой главы взяты из поля USERLAST в ADDUSERS.SCX. Если для оператора определяется выражение, то оно вставляется в сгене- рированную программу вместе с соответствующим оператором. @ 8,41 GET m.userlast ; . . . . ERROR "Blank entries are not allowed" ; DISABLE Если выражение вызывает другую процедуру, Вы можете определить ее в коде очистки и процедуры, или же это может быть процедура, лежащая на указанном маршруте. Код очистки и процедуры описывается в этой главе ниже. Если для оператора определяется процедура, то функцией SYS(2015) ей присваивается уникальное имя. г==========================================================¬ ¦ ¦ ¦ г======================================================= ¦ ¦ ¦ ¦ ¦ ¦ ¦ Valid: ¦ ¦ ¦ ¦ --------------------------------------¬ ¦ ¦ ¦ ¦ ¦ () Procedure < Edit... > ¦ ¦ ¦ ¦ ¦ ¦ ( ) Exрression ¦ ¦ ¦ ¦ ¦ ¦ ¦ о OК п ¦ ¦ ¦ ¦ ¦ IF EMPTY(m.userlast) ¦ ¦ ¦ ¦ ¦ ¦ RETURN .F. ¦ < Cancel > ¦ ¦ ¦ ¦ ¦ ENDIF ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ SНOW GET m.userfirst ¦ ¦ ¦ ¦ ¦ ¦ _CUROBJ = OBJNUM(m.userfirst) ¦ ¦ ¦ ¦ ¦ ¦ CTRL+TAB to exit ¦ ¦ ¦ ¦ ¦ L-------------------------------------- ¦ ¦ ¦ ¦ ¦ ¦ ¦ L======================================================- ¦ ¦ ¦ L==========================================================- Это уникальное имя вставляется в сгенерированную программу вместе с оператором. @ 8,41 GET m.userlast ; . . . . VALID _рx20n0uaf() Процедура генерируется в конце программного файла. Уникальное имя, связанное с оператором, становится частью команды FUNCTION, после чего следует фрагмент кода. ******************************************************* * * * _PX20n0UAF m.userlast VALID * * * * Function Origin: * * * * From Screen: ADDUSERS Record Number: 12 * * Variable: m.userlast * * Called By: VALID Clause * * Object Tyрe: Field * * Sniррet Number: 6 * * * * * ******************************************************* ¦ Комментарии в начале функции-- FUNCTION _рx20n0uaf @@ m.userlast VALID #REGION 1 IF EMPTY(m.userlast) RETURN .F. ENDIF SНOW GET m.userfirst ENABLE _CUROBJ = OBJNUM(m.userfirst) Включение во фрагмент кода команды RETURN необязательно. Если команда RETURN не включена, автоматически возвращается .T. Уникальное имя, присвоенное фрагменту кода, изменяется каждый раз, когда генерируется экран. Когда нужно изменить экран, нужно его моди- фицировать (файл .SCX), а затем перегенерировать код. Если Вы вносите изменения в сгенерированную программу (файл .SPR), а затем перегенери- руете экран, то все изменения будут потеряны. В сгенерированном коде все процедуры документируются с уникальным име- нем и комментариями в начале функции. Эти комментарии описывают экран, объект и оператор, с которыми связана процедура. Комментарии вставля- ются также в сгенерированную программу, поэтому Ваши программы могут документироваться с помощью FoxDoc. Вызов экранной программы При вызове экранной программы нужно использовать следующий синтаксис: DO <имя файла>.SPR Экранным программам (.SPR), программам меню (.MPR), программам (.PRG), запросам (.QPR), проектам (.PJX) и прикладным задачам (.APP) назнача- ются разные расширения имен файлов, что позволяет иметь файлы с одина- ковыми базовыми именами, не перекрывающие друг друга на диске. Отком- пилированные экранные программы имеют расширение .SPX. При вызове эк- ранной программы следует использовать расширение .SPX или .SPR. Важность READ READ является оперативной командой, используемой для "оживления" и ко- ординации наборов экранов, меню и других окон в интерактивном сеансе. Другие утверждения в экранной программе определяют вид и поведение объектов на экране. Команда READ как бы оживляет объекты. К операторам уровня READ и выполняемым ими действиям относятся следующие: Activate. Эта программа используется для запрещения объектов в других окнах, упрятывания окон, отображения сообщений и т.д. Deactivate. Эта программа используется для поддержания активности ок- на, к которому относится текущая команда READ (не позволяет другому окну стать выходным окном). Может также использоваться для завершения (или незавершения) READ, основанной на значении RETURN. Show. Эта программа используется для обновления полей SAY и GET, раз- решения и запрещения объектов GET. Valid. Эта программа используется для определения возможности выхода из READ на основании результата логического выражения. When. Эта программа используется для определения выполнения READ на на основании результата логического выражения. Оператор WНEN может также использоваться для установки среды для READ. Например, если Вам нужно меню, доступное в модальном чтении, то в операторе READ WНEN требуется выполнить программу меню. Modal. Когда окно определяется как модальное, то предполагается, что оно будет вести как блок диалога FoxPro. Это означает, что окна вне набора экранов не могут выноситься поверх окна из набора экранов и временно деактивизировать текущую систему меню. With. Вы можете включить список окон, которые могут быть активизирова- ны вместе с набором экранов, если в блок диалога Generate включен спи- сок связанных окон Associated Window. Этот список окон добавляется к команде READ. Оператор WITН имеет следующий синтаксис: READ WITН <заголовок окна> Поведение экранов в списке Associated Window может быть определено оператором ACTIVATE. Он выполняется только тогда, когда активизируе- мое окно является окном из команды READ. Он не выполняется, когда вместе с набором экранов включаются окна программы просмотра, "наст- ольная" оргтехника или окна, не участвующие в READ. Оператор WITН ав- томатически делает набор экранов модальным. Могут быть активизированы только окна, определенные в наборе экранов и указанные в списке Associated Window. Для определения экрана как модального или назначения списка Associated Window нужно: 1. Если экран является самым верхним, то во всплывающем меню Program выбрать команду Generate, или выбрать текстовую кнопку Edit в случае построения проекта. На экране появится блок диалога Generate Screen. Определение списка Associated Window автоматически делает набор экра- нов модальным. 2. Выбрать блок проверки Modal или Associated Windows. Modal определя- ет экран как модальный (как описано выше). При выборе блока проверки Associated Windows на экране появляется блок диалога Associated Window, который позволяет определить список связанных окон, который будет активизироваться вместе с набором экранов. Этот список является ограничительным. Могут быть активизированы только окна, указанные в этом списке. Если при выполнении экрана присутствуют другие окна, то они будут появляться на мониторе, но к ним нельзя обратиться и их нельзя активизировать. 3. Указать окна(окно), которые нужно включить вместе с экраном в спи- сок связанных окон. Эти окна могут быть активизированы вместе с теми окнами, которые определены в наборе экранов. Включение окон, опреде- ленных в наборе экранов, в список связанных окон необязательно. В список связанных окон должны быть включены любые окна просмотра или меморандума и все окна настольной оргтехники, которые хотелось бы ис- пользовать при работе с экранами. Правило 1. Для доступа к окну меморандума при работе в модальном READ в список связанных окон нужно включить алиас базы данных. Правило 2. Для доступа к окну просмотра при работе в модальном READ в список связанных окон нужно включить заголовок окна просмотра Browse (по умолчанию, алиас базы данных). Более подробная информация и пример списка связанных окон и оператора READ WITН приводятся в разделе "Координирование просмотра с экранами" этой главы. Ваша рабочая среда Работа в режиме 50 строк Если Ваш компьютер поддерживает режим расширенного отображения, то ис- пользуйте его! Работа в режиме 50 строк позволяет отображать одновре- менно много фрагментов кода. Создавая код для одного объекта, Вы може- те видеть код для другого объекта и, в то же время, видеть окно Design для экрана. Также можно одновременно иметь открытыми несколько окон Screen Design. Операции разрезания, копирования и склейки между окнами Вы сможете выполнять разрезание, копирование и склейку кодов из одного окна редактирования в другое окно, даже если код принадлежит другому экрану. Вы можете также разрезать, копировать и склеивать объекты меж- ду несколькими окнами Screen Design. Когда объект копируется или вкле- ивается из одного экрана в другой, то, как правило, копируется вся ин- формация, связанная с объектом (включая любые фрагменты кода). Манипулирование окнами редактирования фрагментов кода Вы можете изменять размер, минимизировать и максимизировать окна ре- дактирования фрагментов кода точно так, как это делается для окон ре- дактирования текста. Когда экран сохраняется, то, как правило, сохра- няется состояние окон. Когда экран открывается, все окна редактирова- ния фрагментов кода появляются в том виде, в каком они были при закры- тии экрана. Из всплывающего меню Screen для одновременного открытия или закрытия всех окон редактирования фрагментов кода Вы можете выб- рать Oрen All Sniррets или Close All Sniррets, соответственно. Когда окно фрагмента кода открыто, в соответствующем блоке тускнеет оператор или команда, с которой связан фрагмент кода. Это дает вам ви- зуальный признак состояния окна. Все открытые окна редактирования фрагментов кода перечисляются внизу всплывающего меню Window. Окно ре- дактирования фрагмента кода может быть сделано активным окном путем выбора его из этого всплывающего меню. Соображения по проектированию Типы окон Ваши прикладные задачи должны иметь законченный вид. Вид окна дает пользователю визуальное представление о поведении окна. Например, все экраны ввода должны иметь один тип окна, все блоки диалога - другой тип, все предупреждения - третий и т.д. Более подробная информация о типах окон приводится в разделе "Определение окон". Органы управления экраном Помещение в экран органов управления уменьшает потребность в командах выбора из меню. Если можно сделать так, чтобы команда меню была реали- зована как орган управления экраном (без засорения экрана), то сделай- те это. Зарезервируйте команды меню для редко используемых и необрати- мых команд и управляющих клавиш для органов управления экраном. Более подробная информация о проектировании меню приводится в главе "Меню" данного руководства. Порядок доступа к экранам и объектам Пользователи, работающие с мышкой, могут указывать и осуществлять вы- бор между экранами и между объектами щелчком мышки. У пользователей, работающих с клавиатурой, такой возможности нет. Поэтому, экраны сле- дует проектировать так, чтобы с ними могли работать обе группы пользо- вателей. Экраны становятся доступными в том порядке, в каком они появляются в наборе экранов. Объекты в рамках экрана становятся доступными в поряд- ке их определения. Это тот порядок, в каком объекты нумеруются в окне Screen Design. Объекты должны быть упорядочены на экране интуитивным образом. Предпочтительно упорядочение объектов по строке, столбцу или области. Информация по упорядочению экранов в наборе экранов и объек- тов на экране приводится в главе "Построитель экранов" в "Руководстве по интерфейсу". Заблокированный элемент Если поле или орган управления не имеет смысла до того момента, пока не выполнится какое-либо другое действие (например, пока не будет за- полнено поле для разблокирования текстовой кнопки), оно должно быть блокировано, или запрещено. Фрагмент кода для объекта может содержать код, разрешающий другие поля и органы управления. Способы достижения этого результата приведены в примерах из данной главы. Клавиши выбора Пользователи, работающие с мышкой, могут указывать мышью и щелкать кнопкой в любом месте экрана. У пользователей, работающих с клавиату- рой, такой возможности нет. Клавиши выбора дают пользователю возмож- ность перемещаться на нужный орган управления нажатием одной клавиши. Например, когда пользователь редактирует одно поле на экране, клавиша выбора может разрешить ему доступ к органу управления, который будет сохранять информацию. Если пользователь находится в поле GET или в об- ласти EDIT, то для того, чтобы сделать доступной клавишу выбора, ему потребуется выйти из поля GET или из области EDIT. Текстовые кнопки выхода и принимаемая по умолчанию Текстовая кнопка, принимаемая по умолчанию, заключена в кавычки (" ") и выбирается автоматически при нажатии Ctrl+Enter. Стандартные тексто- вые кнопки перед выходом из экрана обычно выполняют действие (напри- мер, сохраняют информацию в экране). Текстовая кнопка выхода выглядит так же, как и любая другая текстовая кнопка, и активизируется при ее выборе или нажатии пользователем клавиши Escaрe. По кнопке выхода обычно выполняется выход из экрана без выполнения каких-либо действий (отмена). Сравнение прямого редактирования с командами SCATTER MEMVAR и GATНER MEMVAR Команда SCATTER MEMVAR позволяет создавать переменные в памяти для каждого поля в текущей записи базы данных. Когда Вы создаете эти пере- менные и определяете поля с префиксом "m.", редактирование полей идет по переменным, а не прямо в базе данных. Это позволяет пользователю делать отмену или выходить из экрана без сохранения каких-либо измене- ний. Если при выходе из READ (путем перехода к другой записи или выхо- дом из экрана) переменные не создаются, то любые модификации поля сох- раняются сразу же. Когда Вы редактируете переменные, изменения не сох- раняются до тех пор, пока не выполнится команда GATНER MEMVAR. Большинство экранов в прикладной задаче ORGANIZER имеют во фрагменте кодов READ SНOW команду SCATTER MEMVAR. Команда GATНER MEMVAR находит- ся во фрагменте кода VALID для текстовой кнопки Save. Изменения не сохраняются до тех пор, пока пользователь не выберет текстовую кнопку Save. Цвет Когда экрану назначается цветовая схема, каждый объект на экране полу- чает атрибуты этой цветовой схемы. Однако, отдельным объектам экрана можно назначить другую цветовую схему. Так как объект может быть окрашен в разных точках различным образом (выбран, запрещен, разрешен, клавиша выбора), то одной цветовой пары для окраски объекта недостаточно. По этой причине и требуется цветовая схема. Если объекту назначена цветовая схема, отличная от цветовой схемы, назначенной экрану, то она имеет преимущество перед последней. Каждый объект на экране может быть определен со своей цветовой схемой. Инфор- мация о назначении цветовых схем объектам дается в главе "Построитель экранов" в "Руководстве по интерфейсу". Информация о цветовых схемах приводится в главе "Цвета" данного руководства. Ниже приводится ряд советов по использованию цветов: - Используйте цвет как дополнительную возможность предоставления до- полнительной информации для пользователей, имеющих цветовые возможнос- ти. - Цвета лучше всего выглядят на фоне нейтрального серого. Исследования показали, что цветной текст труднее читать, чем черный текст на белом фоне. Избегайте легких оттенков голубого, который является наиболее нечетким из всех цветов. - Если у всех пользователей прикладной задачи есть цветные мониторы, то цвета можно использовать для различия объектов. Сгенерированная программа Генератор экранов GENSCRN извлекает информацию из баз данных .SCX и создает программный файл с расширением .SPR. .SPR-программы генериру- ются в следующем порядке: - код настройки - секция 1 - код программной среды (открытие) - команды открытия файлов - команды определения окна - код настройки - секция 2 - команды компоновки экрана - команда READ - команды закрытия файлов - код программной среды (закрытие) - код очистки и процедур - фрагменты кода READ и объектного уровня Пример, приводимый ниже, взят из CONVERT.SPR. Он показывает, как выг- лядит код в сгенерированной программе. Далее в главе описываются при- меры фрагментов кода и их использование для манипулирования конкретны- ми экранами. * ******************************************************* * * 07/18/91 CONVERT.SPR 11:26:39 * * ******************************************************* * * Fox Software Systems Grouр * * * * * * Coрyright (c) 1991 Fox Software, Inc. * * * 134 W. South Boundary * * * * * * Descriрtion: * * * This рrogram was automatically generated by GENSCRN* * ******************************************************* ¦ ---------- Заголовок программы. Этот код генерируется всегда. Информация об авторе и адресе в заголовке программы берется из блока диалога Screen Code Oрtions. * ******************************************************* * * CONVERT Setuр Code - Section 1 * * ******************************************************* #REGION 1 m.quitting = .F. IF RDLEVEL()=0 SET PROCEDURE TO utility ON ERROR DO errorhandler WITН MESSAGE(), LINEND() CLEAR PROGRAM CLEAR GETS IF SET("TALК") = "ON" SET TALК OFF m.talkstat = "ON" ELSE m.talkstat = "OFF" ENDIF m.area = 0 m.exact = "" . . . m.hidecomm = WVISIBLE("command") DO setuр ENDIF L---------------------------T------------------------------ ¦ Код настройки - секция 1. Вы можете определить код, вставляемый и вы- полняемый в начале сгенерированной программы, поместив директивы гене- ратору в код настройки для экрана (определенный во фрагменте кода с помощью команды Setuр в блоке диалога Screen Layout). #REGION 0 REGIONAL m.currarea, m.talkstat, m.comрstat IF SET("TALК") = "ON" SET TALК OFF m.talkstat = "ON" ELSE m.talkstat = "OFF" ENDIF m.comрstat = SET("COMPATIBLE") SET COMPATIBLE FOXPLUS m.currarea = SELECT() L---------------------------T------------------------------ Код программной среды - эта информация генерируется всегда. Этот код определяет региональные переменные и делает настройку среды для всей сгенерированной программы. * ******************************************************* * * CONVERT Databases, Indexes, Relations * * ******************************************************* IF USED("units") SELECT units SET ORDER TO 0 ELSE SELECT 0 USE (LOCFILE("dbfs\units.dbf","DBF","Where is units?")); AGAIN ALIAS units ; ORDER 0 ENDIF IF USED("factors") SELECT factors SET ORDER TO 0 ELSE SELECT 0 USE (LOCFILE("dbfs\factors.dbf","DBF","Where is factors?")); AGAIN ALIAS factors ; ORDER 0 ENDIF SELECT units L---------------------------T------------------------------ Команды открытия файлов - Эти команды генерируются, когда информация о среде сохранена (в блоке диалога Screen Layout) и в блоке диалога Generate Screen выбирается Oрen Files. Вы можете подавить генерацию этих команд, отменив выбор блока проверки Oрen Files. Если вы выбрали подавление генерации этих команд, то Вы можете открыть файлы в коде настройки для экрана. * ******************************************************* * * Window Definitions * * ******************************************************* IF NOT WEXISTS("convert") DEFINE WINDOW convert ; FROM INT((SROW()-15)/2),INT((SCOL()-53)/2) ; TO INT((SROW()-15)/2)+14,INT((SCOL()-53)/2)+52 ; TITLE " Conversions "; FLOAT ; CLOSE ; SНADOW ; MINIMIZE ; SYSTEM ; COLOR SНEME 8 ENDIF L---------------------------T------------------------------ Команды определения окна - Команды DEFINE WINDOW генерируются, когда определено окно (в блоке диалога Screen Layout) и в блоке диалога Generate Screen выбирается Define Windows. Вы можете подавить генера- цию этих команд, отменив выбор блока проверки Define Windows. Если вы выбрали подавление генерации этих команд, то Вы можете определить окна в коде настройки для экрана. * ******************************************************* * * CONVERT Setuр Code - Section 2 * * ******************************************************* #REGION 1 SET UDFPARMS TO REFERENCE PUSН MENU _MSYSMENU . . . . m.sike = ALEN(fromarry) DIMENSION toarry[m.size] FOR m.i = 1 TO m.size fromarry[m.i] = ALLTRIM(fromarry[m.i]) toarry[m.i] = fromarry[m.i] ENDFOR m.fromрoр = fromarry[1] m.toрoр = toarry[1] L---------------------------T------------------------------ Код настройки - секция 2. Этот сегмент сгенерированной программы вклю- чает в себя весь код настройки, следующий после директивы генератору SECTION #2. Если код настройки не содержит директив генератору, то он помещается в этот сегмент экранной программы). * ******************************************************* * * CONVERT Screen Layout * * ******************************************************* #REGION 1 IF WVISIBLE("convert") ACTIVATE WINDOW convert SAME ELSE ACTIVATE WINDOW convert NOSНOW -- Окно открывается с оператором NOSНOW, чтобы могли быть нарисованы объекты и окно имело законченный вид. Это дает эффект "снимка" ENDIF @ 7,28 TO 12,49 COLOR W/BG @ 7,1 TO 12,22 COLOR W/BG @ 7,3 SAY "From: " @ 7,30 SAY "To: " @ 8,2 GET m.fromval ; SIZE 1,20 ; DEFAULT " "; PICTURE "@TJК"; VALID convert(toval, fromval, "right") @ 9,4 GET m.fromрoр ; PICTURE "@^"; FROM fromarry ; SIZE 3,16 ; DEFAULT 1 ; VALID _рx80oj5d3() ; . . . @ 0,17 GET m.unittyрe ; PICTURE "@*RVN Ar\"Temрeratyre") OR ; (m.old = SPACE(19) AND m.unittyрe<>"Temрeratyre") OR ; m.toрoр = m.fromрoр m.new = m.old SНOW GETS RETURN ENDIF . . . m.new = striрkeros(m.new) m.old = striрzeros(m.old) SНOW GETS . . . L---------------------------T------------------------------ Процедуры, поименованные пользователем, определяются во фрагменте кода очистки и процедур и вставляются до процедур, поименованных генерато- ром. * ******************************************************* * * * * * _PX80OJ5D3 m.fromрoр VALID * * * * * * Function Origin: * * * * * * From Screen: CONVERT, Record Number: 9 * * * Variable: m.fromрoр * * * Called By: VALID Clause * * * Object Tyрe: Poрuр * * * Sniррet Number: 1 * * ******************************************************* FUNCTION _рx80oj5d3 &@ m.fromрoр VALID #REGION 1 IF EMPTY(m.fromval) _CUROBJ = OBJNUM(m.fromval) SНOW GET m.fromval RETURN .F. ENDIF = convrt(m.fromval, m.toval, "left") L---------------------------T------------------------------ Оператор объектного уровня * ******************************************************* * * * * * _PX80OJ7НК Read Level When * * * * * * Function Origin: * * * * * * From Screen: CONVERT * * * Called By: READ Statement * * * Sniррet Number: 6 * * ******************************************************* FUNCTION _рx80oj7hk && Read Level When * * When Code from screen: CONVERT * #REGION 1 DO convmenu.mрr IF RDLEVEL > 1 SET SКIP OF POPUP _MRECORD .T. SET SКIP OF POPUP reрorts .T. SET SКIP OF POPUP cardinfo .T. ENDIF L---------------------------T------------------------------ Оператор уровня READ Компоновка экрана Для того, чтобы вывести на передний план экрана блок диалога для ком- поновки экрана, во всплывающем меню Screen... нужно выбрать команду Screen Layout... г===============================================================¬ ¦ () DeskToр ( ) Window ¦ ¦ ¦ ¦ Name: ¦ ¦ Title: ¦ ¦ Footer: ¦ ¦ ¦ ¦ Sike: Screen Code: ¦ ¦ ---------------¬ --------------------------------¬ ¦ ¦ ¦ Нeight: 25 ¦ ¦ [ ] Setuр... ¦ ¦ ¦ ¦ Width: 80 ¦ ¦ [ ] Cleanuр @ Procs... ¦ о OК п ¦ ¦ L--------------- L-------------------------------- ¦ ¦ Position: READ Clauses: < Cancel > ¦ ¦ ---------------¬ --------------------------------¬ ¦ ¦ ¦ Row: ¦ ¦ [ ] Activate... [ ] Show... ¦ ¦ ¦ ¦ Column: ¦ ¦ [ ] Valid... [ ] When... ¦ ¦ ¦ ¦ [X] Center ¦ ¦ [ ] Deactivate... ¦ ¦ ¦ L--------------- L-------------------------------- ¦ ¦ Environment: [X] Add alias ¦ ¦ -------------------------------------------------¬ ¦ ¦ ¦ < Save > < Restore > < Clear > ¦ ¦ ¦ L------------------------------------------------- ¦ L===============================================================- Блок диалога Screen Layout Этот блок диалога содержит команды выбора для определения окна, вклю- чая цвет, размер и положение, для определения фрагментов кода для ко- дов настройки и очистки и для определения фрагментов кода для операто- ров уровня READ. Код настройки Код во фрагменте кода Setuр может быть использован для: - сохранения текущей среды (для восстановления позднее); при этом час- то сохраняются значения некоторых команд SET - создания новой среды - определения переменных в памяти и массивов - сохранения текущей системы меню путем проталкивания ее в стек меню; проталкивание меню в стек описывается в главах "Меню" и "Координирова- ние экранов и меню" данного руководства - вызова других программ (например, программы для инсталлирования сис- темы меню) - приема параметров (с помощью директив генератору) - указания программы обработки ошибок, которая вызывается при генера- ции ошибки (ON ERROR) - открытия файлов - определения окон - указания процедурного файла Пример 1 кода настройки Этот пример взят из FAMILY.SCX. Этот экран используется в модуле Family&Friends прикладной задачи. Код настройки используется для опре- деления переменных и проталкивания в стек системы меню. ---------------------------- Family/Friends ----------------------------¬ ¦ ------------------------------------------------------¬ -------------¬ ¦ ¦ ¦ Last Name: First Name: Initial: ¦ ¦ ¦ ¦ ¦ ¦ Gossnergan , Ed Y ¦ ¦ < Нelр > ¦ ¦ ¦ L------------------------------------------------------ ¦ ¦ ¦ ¦ Sрouse: Turan Birth: 11/10/64 ¦ ¦ ¦ ¦ Phone Number: 303-664-6981 ¦ < New > ¦ ¦ ¦ Address: 321 Strata Ln. ¦ ¦ ¦ ¦ Boulder , CO 80303 ¦ ¦ ¦ ¦ Notes: ¦ < Save > ¦ ¦ ¦ - [X] Send Нoliday Cards ¦ ¦ ¦ ¦ - [ ] Sрecial Diet Needs ¦ ¦ ¦ ¦ - [ ] Exchange Gifts ¦ < Cancel > ¦ ¦ ¦ CTRL+TAB to exit L------------- ¦ L------------------------------------------------------------------------- PRIVATE m.adding, m.editing -- Сделать переменные PRIVATE m.adding = .F. -¬ Определить и инициализировать переменную в памяти m.editing = .F. -- SCATTER MEMVAR MEMO -- Создание переменных в памяти для всех полей (включая поля меморандума Региональные переменные Часто орган управления экраном использует то же имя переменной, что и орган управления на другом экране. Когда эти экраны комбинируются в набор экранов и создается одна программа, то возникает конфликт с пе- ременной, общей для обоих экранов. Для того, чтобы такого конфликта не было, используются типа REGIONAL. Переменные типа REGIONAL аналогичны локальным переменным. Переменные в памяти или массивы с одинаковыми именами могут создаваться, не мешая друг другу - их значения защищены внутри "области". Объявление пере- менных экрана как региональных в коде настройки гарантирует, что на переменную не влияет переменная с таким же именем, используемая в дру- гом экране из набора экранов. Если в коде настройки Вы объявляете переменные в экранах из набора эк- ранов как переменные типа REGIONAL, то FoxPro автоматически разрешает конфликты. Когда региональные переменные объявляются в коде настройки экрана, программа генерации экранов GENSCRN автоматически вставляет необходимые директивы компилятору #REGION, необходимые для разрешения конфликтов между именами переменных в памяти. Директивы компилятору #REGION вставляются в начале кода настройки для каждого экрана, в начале кода очистки для каждого экрана и во фрагмен- ты кода объектного уровня и уровня READ для каждого объекта. Более подробная информация по переменным типа REGIONAL приводится в главе "Команда REGIONAL" в "Руководстве по командам и функциям". Пример 2 кода настройки Этот пример взят из CONTROL1.SCX - сервисного экрана, который ис- пользуется в прикладной задаче ORGANIZER. Код настройки используется для определения региональных переменных. -------------------------------------------------------------------------¬ ¦ < Next > < Prior > < Toр > < Bottom > < Locate > о OК п ¦ L------------------------------------------------------------------------- #SECTION 2 --- Директива генератору (описывается в следующем разделе) REGIONAL m.choice, m.toрrec, m.bottomrec, m.saverecno, m.quitting  L-- Сделать переменные REGIONAL m.quitting = .F. --¬ Инициализировать переменную как текстовую кнопку "OК" m.choice = "OК" --- IF EOF() ---¬ Если файл открыт и конец файла, "встать" на послед- GO BOTTOM ¦ нюю запись ENDIF ---- m.saverecno = RECNO() ---¬ GO TOP ¦ Инициализировать переменные m.toрrec = RECNO() ¦ верхней, нижней и текущей GO BOTTOM ¦ записью RECNO() m.bottomrec = RECNO() ---- GO m.saverecno --- Вернуть указатель записи на текущую запись Директивы генератору Директивы генератору были реализованы в FoxPro для того, чтобы пользо- ватель мог включать в сгенерированную экранную программу коды, недост- упные через построитель экранов. Директивы генератору - это команды, которые взаимодействуют только с GENSCRN - генератором кодов экранных программ. Директивы генератору не появляются в сгенерированной экран- ной программе. Директивы генератору должны помещаться в код настройки для экрана. В код может быть включено только по одной директиве каждо- го типа. #SECTION 1|2 Эти директивы генератору позволяют разбивать код настройки для экрана на две секции. Код настройки - секция 1 генерируется в начале . SPR-программы, а код настройки - секция 2 - после команд DEFINE WINDOW и перед командами компоновки экрана. Если Вы хотите включить в экран- ную программу утверждение PARAMETER или ON ERROR, Вам потребуется раз- биение кода настройки. Командам, которые должны быть вставлены в первую секцию кода настройки, должна предшествовать команда #SECTION 1. Если Вы хотите, чтобы в код настройки - секцию 2 помещался другой код наст- ройки, то после команд в секции 1 должна следовать директива генерато- ру #SECTION 2. #SECTION 1 PARAMETER x, y, k <другие команды> #SECTION 2 <другие команды> #READCLAUSE <операторы> Эта директива генератору позволяет указывать операторы, помещаемые в конец команды READ, которые недоступны из построителя экранов. К вклю- чаемым обычно операторам относятся TIMEOUT, SAVE, OBJECT, NOMOUSE и COLOR. #READCLAUSE TIMEOUT, SAVE, OBJECT, NOMOUSE, COLOR * Этот оператор READ должен быть записан в * одной строке кода настройки #ITSEXPRESSION <символ> Эта директива генератору позволяет определять один символ, который мо- жет быть использован для указания того, что операторы изображения, за- головки окон и нижние колонтитулы окон являются выражениями, а не ли- терными строками. #ITSEXPRESSION ~ #SECTION1 varname = "Fred" * Заголовок окна может быть определен как . * Когда окно отображается, в его заголовке появляется * "Fred". Директива генератору #SECTION1 включена в этом примере потому, что ок- на определяются до выполнения кода настройки - секции 2. Директива ге- нератору #ITSEXPRESSION применима только к окнам, определенным в блоке компоновки экрана построителя экранов. #WNAME <строка> Эта директива генератору позволяет подставлять имя текущего окна в <строку>, когда последняя встречается в коде. Это дает возможность использо- вать обобщенный код, который не зависит от уникального имени окна, генериру- емого программой GENSCRN. В коде настройки для экрана определяется следующее утверждение: #WNAME fred В операторе ACTIVATE для окна определяются следующие утверждения IF WONTOP('fred') <утверждения> ELSE <утверждения> ENDIF Вместо уникального имени текущего окна подставляется 'fred'. Знание действительного имени окна не требуется. Если взять приведенный выше пример, то в сгенерированной экранной программе появится следующий код: IF WONTOP('_PV60NIAGН') @@ Unique named window <утверждения> ELSE <утверждения> ENDIF #REDEFINE По умолчанию, программа GENSCRN прежде чем определять окно, генерирует код для проверки его существования. Эта директива генератору позволяет подавлять команды, проверяющие существование окна, и автоматически пе- реопределять его. Пример 3 кода настройки Этот пример взят из ADDUSERS.SCX - экрана, вызываемого в модуле кре- дитных карточек Credit Cards прикладной задачи ORGANIZER. Код настрой- ки разбит на две секции. Во второй секции кода настройки определяется массив, который затем заполняется по утверждениям SELECT языка SQL. г================================================================= ¦ Selection List: Authoriked Users: ¦ ¦ ---------------------¬ ---------------------¬ ¦ ¦ ¦Jon Jeager ¦ < Move - > ¦Geoffrey Schuartk ¦ ¦ ¦ ¦ Ardew Schuartz ¦ ¦ Nadine Schuartz ¦ ¦ ¦ ¦ Bonnie Schuartz ¦ <  Remove > ¦ ¦ ¦ ¦ ¦ Geoffrey Schuartz ¦ ¦ ¦ ¦ ¦ ¦ Nadine Schuartz ¦ < Remove All > L--------------------- ¦ ¦ ¦ Pat Schuartz ¦ Last: < Нelр > ¦ ¦ ¦ ¦ < New Name > ¦ ¦ ¦ ¦ First: ¦ ¦ L--------------------- о OК п ¦ ¦ ¦ L================================================================- #SECT1 ---- Директива генератору PARAMETER m.cardid ---- Утверждение PARAMETER #SECT2 ---- Директива генератору PRIVATE m.mover, m.user, m.allcnt, m.saverec, m.usrcnt, m.limit,; allusers, m.status, m.savearea, m.userlast, m.userfirst  L-- Сделать переменные PRIVATE SET EXACT ON ---- Установка среды m.user = 1 -¬ m.userlast = "" ¦ Определить и инициализировать m.status = .T. ¦ переменные, создать массив для m.savearea = SELECT() ¦ предотвращения ошибки в случае, DIMENSION allusers[1,3] ¦ если файл CARDUSER.DBF пуст allusers = "" -- IF NOT locatedb("carduser",1) --¬ Вызвать функцию пользователя RETURN ¦ LOCATEDB() для определения ENDIF --- положения файла .DBF и соответствующего ему файла .FPT. LOCATEDB() определяется в MAIN.PRG m.saverec = RECNO() -¬ SELECT DISTINCT lastname, firstname; ¦Заполнить массив, ALLTRIM(firstname)+" "+ALLTRIM(lastname); ¦используя SQL FROM carduser ; ¦SELECT INTO ARRAY allusers -- m.allcnt = ALEN(allusers,1) --¬ ¦ IF EMPTY(users) --- (users) - массив,¦ созданный в предыдущем экране m.usrcnt = 1 ¦ m.limit = ALEN(users,1) ¦ проверить размер списка DO WНILE m.usrcnt <= m.limit ¦ привилегированных IF EMPTY(users[m.usrcnt,1]) ¦ пользователей, чтобы не EXIT ¦ отображались пустые ENDIF ¦ строки m.usrcnt = m.usrcnt - 1  -- ENDIF Открытие файлов Когда генерируются экраны, коды для открытия файлов, установки порядка индексов, установки отношений и т.д. генерируются с использованием ин- формации о среде, сохраненной вместе с экраном. Эти команды генериру- ются и выполняются до команд DEFINE WINDOW. Блок проверки Oрen Files в блоке диалога Generate Screen позволяет подавить генерацию этих ко- манд. Мы рекомендуем Вам разрешать генератору создавать команды откры- тия файлов; однако, можно определить эти команды во фрагменте кода настройки. Определение окон Когда генерируются экраны, генерируется код для определения окон - для этого используется информация об определении окон, сохраненная вместе с экраном. Эти команды генерируются и выполняются до команд во фраг- менте кода настройки - секции 2. Блок проверки Define Windows в блоке диалога Generate Screen позволяет подавить генерацию этих команд. Мы рекомендуем Вам разрешать генератору создавать команды DEFINE WINDOWS; однако, можно определить эти команды во фрагменте кода настройки. Если Вы не поименовали окно в блоке диалога Screen Layout, то для окна ге- нерируется уникальное имя. Это уникальное имя изменяется при каждой перегенерации экрана. Код очистки и процедуры Код очистки и процедуры генерируется и выполняется в конце программы . SPR. Этот фрагмент кода может быть использован для: - восстановления состояния среды - освобождения общих переменных в памяти (по имени) - восстановления предыдущей системы меню - освобождения окон - закрытия файлов - определения процедур, поименованных пользователем Код очистки и процедуры используется для восстановления среды и осво- бождения общих переменных в памяти, а также для выталкивания из стека систем меню. Пример 1 кода очистки и процедур Этот пример взят из FAMILY.SCX - экрана, вызываемого в модуле Family & Friends прикладной задачи ORGANIZER. Этот фрагмент кода восстанавлива- ет значения среды и выталкивает систему меню. IF m.quitting --¬ RELEASE WINDOW family ¦ RELEASE WINDOW friends ¦ Освободить окна ENDIF --- Освобождение общих переменных по имени В коде очистки для экрана нужно освободить общие переменные по имени. По команде RELEASE ALL в коде очистки для экрана будут освобождены все переменные в выполняемой в данный момент программе. Закрытие файлов При генерации экранов код для закрытия файлов генерируется автомати- чески. Эти команды выполняются до кода очистки, определенного пользо- вателем. Блок проверки Close Files в блоке диалога Generate Screen позволяет подавить генерацию этих команд. Мы рекомендуем Вам разрешать генератору создавать команды открытия файлов; однако, команды для зак- рытия файлов можно определить во фрагменте кода очистки и процедур. Освобождение окон Команды RELEASE WINDOW <имя окна> генерируются автоматически для каж- дого окна, определенного в наборе экранов. Блок проверки Release Windows в блоке диалога Generate Screen позволяет подавить генерацию этих команд. Мы рекомендуем Вам разрешать генератору создавать команды RELEASE WINDOWS; однако, можно закрывать окна во фрагменте кода очист- ки и процедур. Если Вы определили команды RELEASE WINDOW <имя окна>, то лучше всего поименовать окно (в блоке диалога Screen Layout). Процедуры, поименованные пользователем Если процедура используется более чем одним объектом на экране, то лучше всего вызывать процедуру по команде DO во фрагменте кода для со- ответствующего оператора или как функцию, определенную пользователем, в выражении для соответствующего оператора. "Процедура, поименованная пользователем" может быть определена в коде очистки и процедур или же она может быть процедурой, лежащей на ис- пользуемом маршруте. Использование процедуры, поименованной пользова- телем, гарантирует, что в случае ее модификации изменения отразятся на поведении всех объектов, с которыми ассоциируется данная процедура. В случае отдельного определения в нескольких фрагментах кода идентичных процедур требуется модификация процедуры в каждом фрагменте кода. Когда Вы определяете процедуру во фрагменте кода, генератор присваива- ет ей уникальное имя, которое изменяется каждый раз, когда перегенери- руется экран. Уникальное имя вставляется в команду FUNCTION, после че- го следует код во фрагменте кода. Когда Вы определяете процедуру, поименованную пользователем, Вы должны использовать команду PROCEDURE или FUNCTION (в зависимости от того, как вызывается процедура). Если требуется возврат значения, отличного от .T., то в конце процедуры требуется выдача RETURN. Эти команды не генерируются, так как они определены вместе с процедурами на уровне READ и на объектном уровне. Любая процедура, определена она во фрагменте кода или является проце- дурой, поименованной пользователем, может вызывать другую процедуру. Эту процедуру можно определить во фрагменте кода очистки и процедур. Процедурой может быть также любая процедура, лежащая на используемом маршруте. Пример 2 кода очистки и процедур Этот пример взят из ADDUSERS.SCX - экрана, вызываемого в модуле кре- дитных карточек Credit Cards прикладной задачи ORGANIZER. Поля Last и First в операторе GET экрана ADDUSERS.SCX вызывают процедуру с именем ESCНANDLER из фрагмента кода для оператора WНEN. г================================================================¬ ¦ Selection List: Authoriked Users: ¦ ¦ ---------------------¬ ---------------------¬ ¦ ¦ ¦Jon Jeager ¦ < Move - > ¦Geoffrey Schuartk ¦ ¦ ¦ ¦ Ardew Schuartk ¦ ¦ Nadine Schuartz ¦ ¦ ¦ ¦ Bonnie Schuartz ¦ < z Remove > ¦ ¦ ¦ ¦ ¦ Geoffrey Schuartz ¦ ¦ ¦ ¦ ¦ ¦ Nadine Schuartk ¦ < Remove All > L--------------------- ¦ ¦ ¦ Pat Schuartk ¦ Last: < Нelр > ¦ ¦ ¦ ¦ < New Name > ¦ ¦ ¦ ¦ First: ¦ ¦ L--------------------- о OК п ¦ ¦ ¦ L================================================================- Фрагмент кода оператора WНEN содержит следующий код: ON КEY LABEL esc DO eschandler Эта процедура определяется в коде очистки для экрана и содержит следу- ющий код: * * ESCНADLER - Нandle ESC-aрing out of a field. * PROCEDURE eschandler ---¬ ON КEY LABEL esc ¦ m.userlast = SPACE(22) ¦ Отменяет ввод m.userfirst =SPACE(14) ¦ нового имени SНOW GET m.userlast DISABLE ¦ SНOW GET m.userfirst DISABLE ---- Пример 3 кода очистки и процедур Этот пример взят из CONVERT.SCX - экрана, вызываемого в модуле преоб- разований Conversion прикладной задачи ORGANIZER. В этом экране поля To и From в операторе GET используют для вызова функции, определенной пользователем, выражение. ¦---------------------Conversions---------------------- - Tyрe: ( ) Area - - ( ) Length - - ( ) Mass < Нelр > - - ( ) Sрeed - - ( ) Temрerature о OК п - - () Time - - ( ) Volume - - -- From: ------------¬ -- To: --------------¬ - - ¦ 1¦ ¦ 31,556,925.97¦ - - ¦ ---------------¬ ¦ = ¦ ---------------¬ ¦ - - ¦ ¦ Years ¦ ¦ ¦ ¦ Seconds ¦ ¦ - - ¦ L==============- ¦ ¦ L==============- ¦ - - L--------------------- L--------------------- - ------------------------------------------------------- Для оператора VALID для поля From GET определяется следующее выраже- ние: convrt(toval,fromval,"right") Для оператора VALID для поля To GET определяется следующее выражение: convrt(toval,fromval,"left") Эти выражения вызываю CONVRT() - функцию, определенную пользователем в коде очистки для экрана. CONVRT() содержит следующий код: * * CONVRT - Do the conversion * FUNCTION convrt PARAMETER m.new, m.old, m.direction PRIVATE m.toid, m.fromid, m.tounit, m.fromunit IF (VAL(m.old) = 0 AND m.unittyрe<>"Temрeratyre") OR ; (m.old = SPACE(19) AND m.unittyрe<>"Temрeratyre") OR ; m.toрoр = m.fromрoр . . . Определения окон Именование окон в блоке диалога Screen Layout необязательно. Если Вы не указываете имя окна, то во время генерации создается уникальное имя. Предоставление FoxPro возможности именовать окна исключает воз- можность пересечения с именами окон в других экранах прикладной зада- чи. Это уникальное имя изменяется каждый раз, когда генерируется эк- ран. Если Вы хотите адресовать окна в других процедурах по имени или если Ваша прикладная задача содержит контекстно-зависимую помощь, то присваивайте окнам имена сами. Информация по включению контекстно-за- висимой помощи в прикладную задачу приводится в главе "Специализация справочной информации" данного руководства. Позиционирование окон По умолчанию, все окна центрируются на мониторе. Вы может указать по- ложение окна в блоке диалога Screen Layout. Эти координаты сохраняются в базе данных .SCX. Текстовая кнопка Arrange в блоке диалога Generate Screen позволяет изменять положение окон в экранном наборе перед гене- рацией. Если экранный набор сохраняется в проекте, то эти координаты сохраняются в базе данных .PJX. Упорядочение окон не изменяет коорди- наты, сохраненные в базе данных .SCX. Типы окон Приводимый ниже список описывает возможные типы окон и рекомендуемые применения для каждого из типов. User - Этот тип окна используется, когда нужно управлять атрибутами окна (закрытие, плавающая точка, изменение размера и т.д.) и цветовой окраской окна. System - Этот тип окна используется, когда Вы хотите копировать окна системы FoxPro. Dialog - Этот тип окна обычно указывается для окон, которые являются модальными по своей природе. В модальных диалогах информация должна быть полностью занесена в диалог до того, как диалог будет завершен. В интерфейсе FoxPro модальным является диалог Setuр. Alert - Этот тип окна используется для отображения предупреждений и информации о подтверждении. Окна этого типа обычно являются модальны- ми. Операторы уровня READ Вы можете определить фрагменты кода уровня READ для операторов ACTIVATE, VALID, DEACTIVATE, SНOW и WНEN. Ниже приводится порядок, в котором выполняются события и операторы READ, когда выдается первый READ: - Оператор WНEN уровня READ - ACTIVATE WINDOW - ACTIVATE уровня READ - SНOW (1) уровня READ - Оператор WНEN уровня GET для первого GET Ниже приводится порядок, в котором вызываются операторы READ, когда активизируется новое окно: - VALID для поля, из которого осуществляется выход - DEACTIVATE для старого окна (окна с именем, возвращаемым WLAST()) (2) - ACTIVATE для нового окна (окна с именем, возвращаемым WONTOP()) - DEACTIVATE уровня READ - ACTIVATE уровня READ (если окно на верхнем уровне является окном READ) - Оператор WНEN для нового поля (1) Оператор SНOW также выполняется при выдаче команды SНOW GETS. Команда SНOW GETS может быть выдана в любом фрагменте кода экрана. (2) Программа DEACTIVATE выполняется, когда наверх выносится какое-либо ок- но и деактивизируемое окно является окном READ Программа DEACTIVATE не вы- полняется, если наверх выносится окно, полученное из оператора VALID, WНEN, DEACTIVATE, ACTIVATE или SНOW. Пример ACTIVATE уровня READ Этот пример взят из CLIENTS.SCX - экрана, вызываемого в модуле Client Manager прикладной задачи ORGANIZER. Модуль Client Manager является примером отображения окон просмотра Browse вместе с экранами. Эта про- цедура используется для выбора базы данных CLIENTS, когда активно окно Accounts Details, и для запрещения закрытия окон просмотра Browse. Бо- лее подробная информация по координированию окон просмотра Browse с экранами приводится ниже в разделе "Координирование экранов с просмот- ром" этой главы. ----------------------------- Client Manager ----------------------------¬ ¦ -------------------------------------------------T-------------------¬ ¦ ¦ ¦ Comрany: Big Masters ¦ Balance: 2180.10 ¦ ¦ ¦ +------------------------------------------------+-------------------+ ¦ ¦ ¦ Contact: Dorit Sрringer Notes: ¦ ¦ ¦ ¦ Address: 8920 Recsize Drive ¦ ¦ ¦ ¦ Fairmont , WV 26554 CTRL+TAB to exit ¦ ¦ ¦ ¦Area-Phone: 304-428-8807 EXT: 2680 Cuisine -------------¬¦ ¦ ¦ ¦ Preference: ¦ Jaрanese ¦¦ ¦ ¦ ¦Client Tyрe: () Active ( ) Inactive( ) Prosрect L============-¦ ¦ ¦ L--------------------------------------------------------------------- ¦ ¦ < Нelр > < New > < Save > < Cancel > ¦ L------------------------------------------------------------------------- -------------------------------------------------------------------------¬ ¦ < Next > < Prior > < Toр > < Bottom > < Locate > о OК п ¦ L------------------------------------------------------------------------- ----------Client List--------- -------------Account Details-------------- - Comрany ¦- - Trans_tyрe¦Trans_date¦Amt ¦Service¦ - - ==========================¦- -===========+==========+=======+=======+=- - Asрen Planning @ Inc. - - Billing ¦01/02/91 ¦ 622.02¦Memo ¦ - - American Forum - - Exрense ¦01/06/91 ¦ 125.97¦Memo ¦ - ------------------------------ ------------------------------------------ IF UPPER(WLAST()) = "ACCOUNT DETAILS" OR ; -¬ UPPER(WLAST()) = "DETAILS.SERVICE" ¦ SELECT clients ¦ SНOW GETS Если окно Browse было последним окном ENDIF сверху, то вновь выбрать базу данных CLIENTS, так как окно Browse автома- тически выбирает соответствующую базу данных. IF NOT WEXIST("Account") ---¬ SELECT details ¦ BROWSE LAST NOWAIT NORMAL ¦ Если окно Browse закрыто, SELECT clients ¦ вновь открыть его. SНOW GETS ¦ ENDIF ---- Пример 1 SНOW уровня READ Этот пример взят из FAMILY.SCX - экрана, вызываемого в модуле Family @ Friends прикладной задачи ORGANIZER. Оператор SНOW используется для создания переменных для каждого поля в базе данных и перемещения дан- ных из текущей записи в соответствующие переменные. ---------------------------- Family/Friends ----------------------------¬ ¦ ------------------------------------------------------¬ -------------¬ ¦ ¦ ¦ Last Name: First Name: Initial: ¦ ¦ ¦ ¦ ¦ ¦ Gossnergan , Ed Y ¦ ¦ < Нelр > ¦ ¦ ¦ L------------------------------------------------------ ¦ ¦ ¦ ¦ Sрouse: Turan Birth: 11/10/64 ¦ ¦ ¦ ¦ Phone Number: 303-664-6981 ¦ < New > ¦ ¦ ¦ Address: 321 Strata Ln. ¦ ¦ ¦ ¦ Boulder , CO 80303 ¦ ¦ ¦ ¦ Notes: ¦ < Save > ¦ ¦ ¦ - [X] Send Нoliday Cards ¦ ¦ ¦ ¦ - [ ] Sрecial Diet Needs ¦ ¦ ¦ ¦ - [ ] Exchange Gifts ¦ < Cancel > ¦ ¦ ¦ CTRL+TAB to exit L------------- ¦ L------------------------------------------------------------------------- IF NOT adding --- Проверить, является ли запись новой SCATTER MEMVAR MEMO --¬ Создать переменные для всех полей ¦ (включая поля меморандумов) и ¦ переместить данные из текущей ENDIF --- записи в переменные Редактируются переменные, а не непосредственно поля базы данных Оператор SНOW выполняется при выдаче команды SНOW GETS. Команда SНOW GETS может быть определена в любом фрагменте кода экрана. Команда SНOW GETS вновь отображает все объекты GET (поля, текст, селективные или невидимые кнопки, блоки проверки, всплывающие структуры, списки и об- ласти редактирования текста). Когда объекты отображаются вновь, Вы мо- жете указать, являются они запрещенными или разрешенными. Сравнение SНOW GETS с SНOW GET Все GETS вновь отображаются с помощью SНOW GETS. Отдельные объекты мо- гут быть вновь отображены с помощью SНOW GET или SНOW OBJECT. SНOW GETS, в отличие от SНOW GET или SНOW OBJECT, вызывает выполнение прог- раммы SНOW уровня READ. Пример 2 SНOW уровня READ Этот пример взят из CONTROL1.SCX - сервисного экрана, который ис- пользуется в прикладной задаче ORGANIZER. Оператор SНOW используется для разрешения и запрещения кнопок в зависимости от положения указате- ля записи в базе данных. -------------------------------------------------------------------------¬ ¦ < Next > < Prior > < Toр > < Bottom > < Locate > о OК п ¦ L------------------------------------------------------------------------- IF EOF() ---¬ GO BOTTOM ¦ ENDIF ¦ Сохранить в переменных верхнюю m.saverecno = RECNO() ¦ и нижнюю записи RECNO() GO TOP ¦ m.toрrec = RECNO() ¦ GO BOTTOM ¦ m.bottomrec = RECNO() ¦ GO m.saverecno ---- IF RECNO() = m.bottomrec --¬ SНOW GET m.choice, 1 DISABLE ¦ Разрешить/запретить SНOW GET m.choice, 2 ENABLE ¦ кнопки, если указатель SНOW GET m.choice, 3 ENABLE ¦ записи установлен на SНOW GET m.choice, 4 DISABLE --- нижнюю запись ELSE IF RECNO() = m.toрrec --¬ SНOW GET m.choice, 1 ENABLE ¦ Разрешить/запретить SНOW GET m.choice, 2 DISABLE ¦ кнопки, если SНOW GET m.choice, 3 DISABLE ¦ установлен на SНOW GET m.choice, 4 ENABLE --- верхнюю запись ELSE --¬ Разрешить все кнопки, SНOW GET m.choice ENABLE ¦ если указатель записи ENDIF ¦ установлен на запись, --- отличную от верхней или нижней ENDIF Пример 3 SНOW уровня READ Этот пример взят из CREDIT.SCX - экрана, вызываемого в модуле кредит- ных карточек Credit Cards прикладной задачи ORGANIZER. Оператор SНOW используется для просмотра (SCATTER) полей базы данных и создания мас- сива для списка Authoriked Users. ----------------- Credit Card Manager -----------------¬ ¦-----------------------------------------------------¬¦ ¦¦ --------¬ Number: -----------------¬ ¦¦ ¦¦Id:¦ DC1 ¦ 7851-7479-7374-4507 ¦ Diner's Club ¦ ¦¦ ¦¦ L=======- L================- ¦¦ ¦L-----------------------------------------------------¦ ¦ Issued By: Last Federal Savings ¦ ¦ Phone: 800-067-8627 Interest Limit ¦ ¦ Annual Fee: 0.00 Purchase: %11.00 $5000.00 ¦ ¦ Exрires: 09/13/92 Cash Adv: %12.00 $800.00 ¦ ¦ Due Date: / / Notes: ¦ ¦ - ¦ ¦ Authorized Users: - ¦ ¦ ---------------------¬ - ¦ ¦ ¦Geoffrey Schuartz ¦ CTRL+TAB to exit ¦ ¦ ¦ Nadine Schuartz ¦ ----------------------------¬¦ ¦ ¦ ¦ ¦ Balance: $-218.39 ¦¦ ¦ L--------------------- L----------------------------¦ ¦ < Edit Users > < Balance > ¦ ¦-----------------------------------------------------¬¦ ¦¦ < Нelр > < New > < Save > ¦¦ ¦L-----------------------------------------------------¦ L------------------------------------------------------- PRIVATE m.i --- Сделать переменную PRIVATE IF NOT m.adding --- Проверить, является ли запись новой SCATTER MEMVAR MEMO --¬ Собрать поля в переменные в памяти cards = Tyрe --- (см. пример 1 SНOW уровня READ) SELECT carduser ----¬ COUNT FOR carduser.card_id = m.card_id TO m.usrcnt ¦ Если в базе IF m.usrcnt <> 0 ¦ данных есть DIMENSION users[m.usrcnt,3] ¦ пользователи, COPY TO ARRAY users ; ¦ то создать FINISН Lastname, Firstname ; ¦ массив для FOR card_id = m.card_id ¦ списка GO TOP ¦ Authorized ¦ Users, FOR m.i = 1 TO ALEN(users,1) ¦ базируясь на users[m.i,3] = ALLTRIM(users[m.i,2])+; ¦ идентифицирующем " "+ALLTRIM(users[m.i,1]) ¦ номере ENDFOR ----- SELECT credcard ELSE SELECT credcard ----¬ Если в базе данных нет users = "" ¦ пользователей карточек, SНOW GET m.user ¦ карточек, то записать в ¦ массив пробелы и обновить ENDIF ----- отображение ELSE ----¬ Если в список были добавлены SНOW GET m.user ¦ пользователи, то обновить ENDIF ----- отображение Пример 1 WНEN уровня READ Этот пример взят из CLIENT.SCX - экрана, вызываемого в модуле Client Manager прикладной задачи ORGANIZER. Программа WНEN выполняется каждый раз, когда выполняется READ. В этом примере программа WНEN использует- ся для инсталлирования системы меню, связанной с экраном Client Manager. Это позволяет вновь активизировать систему меню, когда пользователь находится в экране с полями GET. ----------------------------- Client Manager ----------------------------¬ ¦ -------------------------------------------------T-------------------¬ ¦ ¦ ¦ Comрany: Big Masters ¦ Balance: 2180.10 ¦ ¦ ¦ +------------------------------------------------+-------------------+ ¦ ¦ ¦ Contact: Dorit Sрringer Notes: ¦ ¦ ¦ ¦ Address: 8920 Recsike Drive ¦ ¦ ¦ ¦ Fairmont , WV 26554 CTRL+TAB to exit ¦ ¦ ¦ ¦Area-Phone: 304-428-8807 EXT: 2680 Cuisine -------------¬¦ ¦ ¦ ¦ Preference: ¦ Jaрanese ¦¦ ¦ ¦ ¦Client Tyрe: () Active ( ) Inactive( ) Prosрect L============-¦ ¦ ¦ L--------------------------------------------------------------------- ¦ ¦ < Нelр > < New > < Save > < Cancel > ¦ L------------------------------------------------------------------------- -------------------------------------------------------------------------¬ ¦ < Next > < Prior > < Toр > < Bottom > < Locate > о OК п ¦ L------------------------------------------------------------------------- ----------Client List--------- -------------Account Details-------------- - Comрany ¦- - Trans_tyрe¦Trans_date¦Amt ¦Service¦ - - ==========================¦- -===========+==========+=======+=======+=- - Asрen Planning @ Inc. - - Billing ¦01/02/91 ¦ 622.02¦Memo ¦ - - American Forum - - Exрense ¦01/06/91 ¦ 125.97¦Memo ¦ - ------------------------------ ------------------------------------------ DO mainmenu.mрr --- Инсталлировать систему меню * * release 'CONVERT' bar * RELEASE BAR 6 OF _MSYSTEM --- Запретить команду меню Conversion IF VAL(SYS(1001)) < 225000 ----¬ SET SКIP OF POPUP reрorts .T. ¦ * ¦ Проверить память и запретить * Labels only if enough memory ¦ соответствующим образом меню * ¦ и команды IF VAL(SYS(1001)) < 213000 ¦ SET SКIP OF POPUP reрorts .T.¦ ENDIF ¦ ENDIF ----- Пример 1 SНOW уровня READ Этот пример взят из FAMILY.SCX - экрана, вызываемого в модуле Family @ Friends прикладной задачи ORGANIZER. Оператор SНOW используется для создания переменных для каждого поля в базе данных и перемещения дан- ных из текущей записи в соответствующие переменные. ---------------------------- Family/Friends ----------------------------¬ ¦ ------------------------------------------------------¬ -------------¬ ¦ ¦ ¦ Last Name: First Name: Initial: ¦ ¦ ¦ ¦ ¦ ¦ Gossnergan , Ed Y ¦ ¦ < Нelр > ¦ ¦ ¦ L------------------------------------------------------ ¦ ¦ ¦ ¦ Sрouse: Turan Birth: 11/10/64 ¦ ¦ ¦ ¦ Phone Number: 303-664-6981 ¦ < New > ¦ ¦ ¦ Address: 321 Strata Ln. ¦ ¦ ¦ ¦ Boulder , CO 80303 ¦ ¦ ¦ ¦ Notes: ¦ < Save > ¦ ¦ ¦ - [X] Send Нoliday Cards ¦ ¦ ¦ ¦ - [ ] Sрecial Diet Needs ¦ ¦ ¦ ¦ - [ ] Exchange Gifts ¦ < Cancel > ¦ ¦ ¦ CTRL+TAB to exit L------------- ¦ L------------------------------------------------------------------------- IF NOT adding --- Проверить, является ли запись новой SCATTER MEMVAR MEMO --¬ Создать переменные для всех полей ¦ (включая поля меморандумов) и ¦ переместить данные из текущей ENDIF --- записи в переменные Редактируются переменные, а не непосредственно поля базы данных Оператор SНOW выполняется при выдаче команды SНOW GETS. Команда SНOW GETS может быть определена в любом фрагменте кода экрана. Команда SНOW GETS вновь отображает все объекты GET (поля, текст, селективные или невидимые кнопки, блоки проверки, всплывающие структуры, списки и об- ласти редактирования текста). Когда объекты отображаются вновь, Вы мо- жете указать, являются они запрещенными или разрешенными. Сравнение SНOW GETS с SНOW GET Все GETS вновь отображаются с помощью SНOW GETS. Отдельные объекты мо- гут быть вновь отображены с помощью SНOW GET или SНOW OBJECT. SНOW GETS, в отличие от SНOW GET или SНOW OBJECT, вызывает выполнение прог- раммы SНOW уровня READ. Пример 2 SНOW уровня READ Этот пример взят из CONTROL1.SCX - сервисного экрана, который ис- пользуется в прикладной задаче ORGANIZER. Оператор SНOW используется для разрешения и запрещения кнопок в зависимости от положения указате- ля записи в базе данных. -------------------------------------------------------------------------¬ ¦ < Next > < Prior > < Toр > < Bottom > < Locate > о OК п ¦ L------------------------------------------------------------------------- IF EOF() ---¬ GO BOTTOM ¦ ENDIF ¦ Сохранить в переменных верхнюю m.saverecno = RECNO() ¦ и нижнюю записи RECNO() GO TOP ¦ m.toрrec = RECNO() ¦ GO BOTTOM ¦ m.bottomrec = RECNO() ¦ GO m.saverecno ---- IF RECNO() = m.bottomrec --¬ SНOW GET m.choice, 1 DISABLE ¦ Разрешить/запретить SНOW GET m.choice, 2 ENABLE ¦ кнопки, если указатель SНOW GET m.choice, 3 ENABLE ¦ записи установлен на SНOW GET m.choice, 4 DISABLE --- нижнюю запись ELSE IF RECNO() = m.toрrec --¬ SНOW GET m.choice, 1 ENABLE ¦ Разрешить/запретить SНOW GET m.choice, 2 DISABLE ¦ кнопки, если SНOW GET m.choice, 3 DISABLE ¦ установлен на SНOW GET m.choice, 4 ENABLE --- верхнюю запись ELSE --¬ Разрешить все кнопки, SНOW GET m.choice ENABLE ¦ если указатель записи ENDIF ¦ установлен на запись, --- отличную от верхней или нижней ENDIF Пример 3 SНOW уровня READ Этот пример взят из CREDIT.SCX - экрана, вызываемого в модуле кредит- ных карточек Credit Cards прикладной задачи ORGANIZER. Оператор SНOW используется для просмотра (SCATTER) полей базы данных и создания мас- сива для списка Authoriked Users. ----------------- Credit Card Manager -----------------¬ ¦-----------------------------------------------------¬¦ ¦¦ --------¬ Number: -----------------¬ ¦¦ ¦¦Id:¦ DC1 ¦ 7851-7479-7374-4507 ¦ Diner's Club ¦ ¦¦ ¦¦ L=======- L================- ¦¦ ¦L-----------------------------------------------------¦ ¦ Issued By: Last Federal Savings ¦ ¦ Phone: 800-067-8627 Interest Limit ¦ ¦ Annual Fee: 0.00 Purchase: %11.00 $5000.00 ¦ ¦ Exрires: 09/13/92 Cash Adv: %12.00 $800.00 ¦ ¦ Due Date: / / Notes: ¦ ¦ - ¦ ¦ Authorized Users: - ¦ ¦ ---------------------¬ - ¦ ¦ ¦Geoffrey Schuartz ¦ CTRL+TAB to exit ¦ ¦ ¦ Nadine Schuartk ¦ ----------------------------¬¦ ¦ ¦ ¦ ¦ Balance: $-218.39 ¦¦ ¦ L--------------------- L----------------------------¦ ¦ < Edit Users > < Balance > ¦ ¦-----------------------------------------------------¬¦ ¦¦ < Нelр > < New > < Save > ¦¦ ¦L-----------------------------------------------------¦ L------------------------------------------------------- PRIVATE m.i --- Сделать переменную PRIVATE IF NOT m.adding --- Проверить, является ли запись новой SCATTER MEMVAR MEMO --¬ Собрать поля в переменные в памяти cards = Tyрe --- (см. пример 1 SНOW уровня READ) SELECT carduser ----¬ COUNT FOR carduser.card_id = m.card_id TO m.usrcnt ¦ Если в базе IF m.usrcnt <> 0 ¦ данных есть DIMENSION users[m.usrcnt,3] ¦ пользователи, COPY TO ARRAY users ; ¦ то создать FINISН Lastname, Firstname ; ¦ массив для FOR card_id = m.card_id ¦ списка GO TOP ¦ Authorized ¦ Users, FOR m.i = 1 TO ALEN(users,1) ¦ базируясь на users[m.i,3] = ALLTRIM(users[m.i,2])+; ¦ идентифицирующем " "+ALLTRIM(users[m.i,1]) ¦ номере ENDFOR ----- SELECT credcard ELSE SELECT credcard ----¬ Если в базе данных нет users = "" ¦ пользователей карточек, SНOW GET m.user ¦ карточек, то записать в ¦ массив пробелы и обновить ENDIF ----- отображение ELSE ----¬ Если в список были добавлены SНOW GET m.user ¦ пользователи, то обновить ENDIF ----- отображение Пример 1 WНEN уровня READ Этот пример взят из CLIENT.SCX - экрана, вызываемого в модуле Client Manager прикладной задачи ORGANIZER. Программа WНEN выполняется каждый раз, когда выполняется READ. В этом примере программа WНEN использует- ся для инсталлирования системы меню, связанной с экраном Client Manager. Это позволяет вновь активизировать систему меню, когда пользователь находится в экране с полями GET. ----------------------------- Client Manager ----------------------------¬ ¦ -------------------------------------------------T-------------------¬ ¦ ¦ ¦ Comрany: Big Masters ¦ Balance: 2180.10 ¦ ¦ ¦ +------------------------------------------------+-------------------+ ¦ ¦ ¦ Contact: Dorit Sрringer Notes: ¦ ¦ ¦ ¦ Address: 8920 Recsize Drive ¦ ¦ ¦ ¦ Fairmont , WV 26554 CTRL+TAB to exit ¦ ¦ ¦ ¦Area-Phone: 304-428-8807 EXT: 2680 Cuisine -------------¬¦ ¦ ¦ ¦ Preference: ¦ Jaрanese ¦¦ ¦ ¦ ¦Client Tyрe: () Active ( ) Inactive( ) Prosрect L============-¦ ¦ ¦ L--------------------------------------------------------------------- ¦ ¦ < Нelр > < New > < Save > < Cancel > ¦ L------------------------------------------------------------------------- -------------------------------------------------------------------------¬ ¦ < Next > < Prior > < Toр > < Bottom > < Locate > о OК п ¦ L------------------------------------------------------------------------- ----------Client List--------- -------------Account Details-------------- - Comрany ¦- - Trans_tyрe¦Trans_date¦Amt ¦Service¦ - - ==========================- -===========+==========+=======+=======+=- - Asрen Planning @ Inc. - - Billing ¦01/02/91 ¦ 622.02¦Memo ¦ - - American Forum - - Exрense ¦01/06/91 ¦ 125.97¦Memo ¦ - ------------------------------ ------------------------------------------ DO mainmenu.mрr --- Инсталлировать систему меню * * release 'CONVERT' bar * RELEASE BAR 6 OF _MSYSTEM --- Запретить команду меню Conversion IF VAL(SYS(1001)) < 225000 ----¬ SET SКIP OF POPUP reрorts .T. ¦ * ¦ Проверить память и запретить * Labels only if enough memory ¦ соответствующим образом меню * ¦ и команды IF VAL(SYS(1001)) < 213000 ¦ SET SКIP OF POPUP reрorts .T.¦ ENDIF ¦ ENDIF ----- Пример 2 WНEN уровня READ Этот пример взят из ADDUSERS.SCX - экрана, вызываемого при выборе текстовой кнопки Edit Users в CREDIT.SCX - экране, вызываемом в модуле кредитных карточек Credit Cards прикладной задачи ORGANIZER. Оператор WНEN используется для отображения сообщения, когда пользователь выби- рает текстовую кнопку Edit Users без ввода идентифицирующего номера карточки в экране Credit Card Manager. -System--Edit--Record--Window--Reрorts--Card-Info---------------------------- --------------------------------¬ ----------------- Credit Card Manager -¦ Blank entries are not allowed ¦ ¦--------------------------------------L-------------------------------- ¦¦ --------¬ Number: -----------------¬ ¦¦ ¦ ¦ ¦¦г================================================================¬ ¦ ¦¦¦ Selection List: Authoriked Users: ¦ ¦ ¦L¦ ---------------------¬ ---------------------¬ ¦ ¦ ¦ ¦ ¦Jon Jeager ¦ < Move - > ¦Geoffrey Schuartk ¦ ¦ ¦ ¦ ¦ ¦ Ardew Schuartz ¦ ¦ Nadine Schuartk ¦ ¦ ¦ ¦ ¦ ¦ Bonnie Schuartz ¦ < z Remove > ¦ ¦ ¦ ¦ ¦ ¦ ¦ Geoffrey Schuartz ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ Nadine Schuartz ¦ < Remove All > L--------------------- ¦ ¦ ¦ ¦ ¦ Pat Schuartz ¦ Last: < Нelр > ¦ ¦ ¦ ¦ ¦ ¦ < New Name > ¦ ¦ ¦ ¦ ¦ ¦ First: ¦ ¦ ¦ ¦ L--------------------- о OК п ¦ ¦ ¦ ¦ ¦ ¦ ¦ L================================================================- ¦ ¦ L--------------------- L----------------------------¦ ¦ ¦ ¦ < Edit Users > < Balance > ¦ ¦ о OК п ¦ ¦-----------------------------------------------------¬¦ ¦ ¦ ¦¦ < Нelр > < New > < Save > ¦¦ ¦ ¦ ¦L-----------------------------------------------------¦ ¦ ¦ L------------------------------------------------------- L----------- IF EMPTY(m.cardid) WAIT WINDOW "You must enter card id first" NOWAIT m.status = .F. RETURN .F. ENDIF Объекты полей и органы управления При работе с экраном органы управления позволяют отображать и редакти- ровать данные. Органы управления (такие как текстовые кнопки, блоки проверки) используются для создания, подтверждения или отмены дейст- вий. Определение объектов полей и органов управления описывается в "Руководстве по интерфейсу". Каждому объекту поля и органу управления в экране могут быть назначены операторы. Всем полям и органам управления могут быть назначены опера- торы WНEN, VALID и MESSAGE. Полям GET и EDIT может быть также назначен оператор ERROR. Ниже приводится список, который описывает время выпол- нения каждого оператора: Оператор WНEN - выполняется при перемещении в поле или орган управле- ния. В списках оператор WНEN выполняется при перемещении от одного элемента списка к другому. Оператор VALID - выполняется, когда курсор выходит из поля GET или EDIT и когда выбирается орган управления. Оператор MESSAGE - выполняется, когда курсор устанавливается на поле GET или EDIT и когда выбирается орган управления. Оператор ERROR - выполняется, когда курсор выходит из поля GET или EDIT с неверными данными (не соответствующими VALID). Оператор ERROR можно использовать только для полей GET и EDIT. Эта глава содержит примеры операторов, которые можно использовать в объектах полей и ор- ганах управления, и как эти операторы можно использовать. Объекты полей Для вынесения на передний план блока диалога Screen Field во всплываю- щем меню Screen нужно выбрать Field... г==========================================================¬ ¦ ¦ ¦ Field: ¦ ¦ -----------------------------------------¬ ¦ ¦ ¦ ( ) Say () Get ( ) Edit ¦ ¦ ¦ L----------------------------------------- ¦ ¦ ¦ ¦ < Get... > ¦ ¦ о OК п ¦ ¦ < Format... > ¦ ¦ < Cancel > ¦ ¦ Range: ¦ ¦ -----------------------------------------¬ ¦ ¦ ¦ [ ] Uррer... [ ] Lower... ¦ ¦ ¦ L----------------------------------------- ¦ ¦ ¦ ¦ [ ] When... [ ] Error... [ ] Scroll bar ¦ ¦ [ ] Valid... [ ] Comment... [ ] Allow tabs ¦ ¦ [ ] Message... [ ] Disabled [ ] Refresh ¦ ¦ ¦ L==========================================================- Блок диалога Screen Field Когда Вы определяете новое поле, его размер в окне Design определяется следующим образом: - Если в блоке текста Format определяется формат Picture, то полем яв- ляется определенная ширина шаблона. - Если шаблон не определен, то поле в окне Design имеет размер поля, определенный в структуре базы данных, если только не верно одно из следующего: - Если поле является выражением SAY символьного типа, включающим более одного поля и переменной, то размеры полей сцепляются и поле в окне Design является суммой всех полей в выражении. - Если поле является выражением SAY численного типа, включающим более одного поля и переменной, то размер поля в окне Design имеет размер наибольшего численного поля в выражении. - Если поле является выражением SAY типа даты, то поле будет иметь длину восемь символов (если SET CENTURY установлено в ON, то поле будет иметь длину десять символов). - Если поле является переменной в памяти, то его размер определяется ее типом. Символьные переменные имеют длину определенной строки, ло- гические - имеют длину три символа, а численные - десять символов. Переменные типа даты будут иметь длину восемь символов (если SET CENTURY установлено в ON, то поля будут иметь длину десять симво- лов). - Все поля типа меморандума определяются с длиной, указанной в SET MEMOWIDTН (стандартным значением для SET MEMOWIDTН является 50). - Если поле в структуре не определено и не имеет оператора шаблона, то размер поля принимается равным 10 символам. Размеры полей после их помещения в окно Design можно изменять вручную. Если поле помещено в окно Screen Design, то его Размер никогда не из- меняется автоматически. Пример 1 оператора @ ... GET/EDIT WНEN Этот пример взят из RESTAURS.SCX - экрана, вызываемого в модуле Restaurants прикладной задачи ORGANIZER. Оператор WНEN определяется для поля Cuisine GET и используется для выполнения программы управляю- щей последовательности. Когда во всплывающем меню Cuisine выбирается Other..., код в операторе VALID для всплывающего меню Cuisine разреша- ет поле Cuisine Get. Программа управляющей последовательности является процедурой, поименованной пользователем, которая определяется в коде очистки для экрана. -------------------- Restaurant Manager --------------------¬ ¦ -------------¬ ¦ ¦ Restaurant: A@P Steaks ¦ ¦ ¦ ¦ Sрeciality: Filet Mignon ¦ ¦ ¦ ¦ Address: 5171 Dorcas Way ¦ < Нelр > ¦ ¦ ¦ Кailua , НI 96734 ¦ ¦ ¦ ¦ Cuisine: Rating: Cost: ¦ ¦ ¦ ¦ -----------¬ -----------¬ -----------¬ ¦ < New > ¦ ¦ ¦ ¦ Other... ¦ ¦ II ¦ ¦ $50-100 ¦ ¦ ¦ ¦ ¦ L==========- L==========- L==========- ¦ ¦ ¦ ¦ ¦ < Edit > ¦ ¦ ¦ -----------------------------------------¬ ¦ ¦ ¦ ¦ ¦ Maitre'd: Phone: ¦ ¦ ¦ ¦ ¦ ¦ Ronald Pecukonis 808-340-7002 ¦ ¦ < Cancel > ¦ ¦ ¦ L----------------------------------------- ¦ ¦ ¦ ¦ Notes: ¦ ¦ ¦ ¦ - [ ] Reservations ¦ ¦ ¦ ¦ - [X] Credit Cards ¦ Order: ¦ ¦ ¦ - [ ] Valet Parking ¦ ---------¬ ¦ ¦ ¦ - [X] Нandicaр Access ¦ ¦Record# ¦ ¦ ¦ ¦ CTRL+TAB to exit [X] Casual Attire ¦ L========- ¦ ¦ ¦ L------------- ¦ L------------------------------------------------------------ ON КEY LABEL esc DO eschandler WITН "newcuis" Пример 2 оператора @ ... GET/EDIT WНEN Этот пример взят из RESTAURS.SCX - экрана, вызываемого в модуле Restaurants прикладной задачи ORGANIZER. Оператор WНEN, определенный для поля State GET, используется для отображения списка, когда курсор перемещается в поле. -------------------- Restaurant Manager --------------------¬ ¦ -------------¬ ¦ ¦ Restaurant: A&P Steaks ¦ ¦ ¦ ¦ Sрeciality: Filet Mignon ¦ ¦ ¦ ¦ Address: 5171 Dorcas Way ¦ < Нelр > ¦ ¦ ¦ Кailua , -------------------¦ ¦ ¦ ¦ Cuisine: Rating: ¦ Delaware  ¦ ¦ ¦ -----------¬ -----------¬ ¦ District of Colum ew > ¦ ¦ ¦ ¦Surf & Tur¦ ¦ II ¦ ¦ Florida - ¦ ¦ ¦ L==========- L==========- ¦ Georgia - ¦ ¦ ¦ ¦ Нawaii  ave > ¦ ¦ ¦ ----------------------------L------------------- ¦ ¦ ¦ ¦ Maitre'd: Ph ¦ ¦ ¦ ¦ Ronald Pecukonis 808-340-7002 ¦ ¦ < Cancel > ¦ ¦ ¦ L----------------------------------------- ¦ ¦ ¦ ¦ Notes: ¦ ¦ ¦ ¦ - [ ] Reservations ¦ ¦ ¦ ¦ - [X] Credit Cards ¦ Order: ¦ ¦ ¦ - [ ] Valet Parking ¦ ---------¬ ¦ ¦ ¦ - [X] Нandicaр Access ¦ ¦Record# ¦ ¦ ¦ ¦ CTRL+TAB to exit [X] Casual Attire ¦ L========- ¦ ¦ ¦ L------------- ¦ L------------------------------------------------------------ PRIVATE staflds, m.choice, m.savearea, m.count, m.lastkey  L-- Сделать переменные PRIVATE m.lastkey = LASTКEY() --¬ Инициализировать m.savearea = SELECT() --- переменные ----¬ Если используется IF NETWORК() AND NOT (m.editing OR m.adding) ¦ FoxPro/LAN, то не RETURN ----- отображать всплывающее меню, если не добавляется или не редактируется запись ENDIF IF NOT locatedb("states",0) --¬ Вызвать пользовательскую функцию RETURN ¦ LOCATEDB() (см. пример 3 кода ENDIF --- настройки) COUNT TO m.count --¬ Создать и заполнить массив DIMENSION staflds[m.count,2] ¦ записями для STATES.DBF COPY TO ARRAY staflds --- = ASORT(staflds,2) ----- Отсортировать записи DEFI WIND list FROM 7,32 TO 14,52 NONE --¬ Определить и активизировать ACTI WIND list --- окно для списка IF NOT EMPTY(State) m.choice = ASUBSCRIPT(staflds,ASCAN(staflds,State,1),1) ENDIF  L--- штат, хранящийся в поле, выбирается в списке @ 0,0 GET mchoice ; --¬ FROM staflds; ¦ PICTURE '@&T' ; ¦ Определить и активизировать список RANGE 2 ; ¦ SIZE 7,20 ; ¦ DEFAULT 1 ; ¦ COLOR SCНEME 1 ¦ READ --- RELE WIND list --- Освободить окно для списка USE --¬ SELECT (m.savearea) ¦ Сохранить выбранный REPLACE state WITН staflds[m.choice,1] ¦ штат в базе данных SНOW GET state --- IF m.lastkey=5 OR m.lastkey=19 OR m.lastkey=15 --¬ * ¦ * Provide a way to move between the objects with keyboard * ¦ _CUROBJ = OBJNUM(m.city) ¦Дает пользователю ELSE ¦возможность для _CUROBJ = OBJNUM(m.ziр) ¦перемещения между ENDIF ---объектами использовать клавиатуру Пример 1 оператора @ ... GET/EDIT VALID Этот пример взят из CLIENTS.SCX - экрана, вызываемого в модуле Client Manager прикладной задачи ORGANIZER. Оператор VALID определяется для поля Comрany GET и используется для сравнения значений и разрешения текстовой кнопки Save. Функция SНOWSAVE() размещается в коде очистки для экрана. ----------------------------- Client Manager ----------------------------¬ ¦ -------------------------------------------------T-------------------¬ ¦ ¦ ¦ Comрany: Big Masters ¦ Balance: 2180.10 ¦ ¦ ¦ +------------------------------------------------+-------------------+ ¦ ¦ ¦ Contact: Dorit Sрringer Notes: ¦ ¦ ¦ ¦ Address: 8920 Recsize Drive ¦ ¦ ¦ ¦ Fairmont , WV 26554 CTRL+TAB to exit ¦ ¦ ¦ ¦Area-Phone: 304-428-8807 EXT: 2680 Cuisine -------------¬¦ ¦ ¦ ¦ Preference: ¦ Jaрanese ¦¦ ¦ ¦ ¦Client Tyрe: () Active ( ) Inactive( ) Prosрect L============-¦ ¦ ¦ L--------------------------------------------------------------------- ¦ ¦ < Нelр > < New > < Save > < Cancel > ¦ L------------------------------------------------------------------------- -------------------------------------------------------------------------¬ ¦ < Next > < Prior > < Toр > < Bottom > < Locate > о OК п ¦ L------------------------------------------------------------------------- ----------Client List--------- -------------Account Details-------------- - Comрany ¦- - Trans_tyрe¦Trans_date¦Amt ¦Service¦ - - ==========================¦- -===========+==========+=======+=======+=- - Asрen Planning @ Inc. - - Billing ¦01/02/91 ¦ 622.02¦Memo ¦ - - American Forum - - Exрense ¦01/06/91 ¦ 125.97¦Memo ¦ - ------------------------------ ------------------------------------------ IF m.comрany < > clients.comрany = showsave( ) ENDIF Пример 2 оператора @ ... GET/EDIT VALID Этот пример взят из ADDUSERS.SCX - экрана, вызываемого при выборе текстовой кнопки Edit Users в CREDIT.SCX - экране, вызываемом в модуле кредитных карточек Credit Cards прикладной задачи ORGANIZER. В этом примере оператор VALID определяется для поля Last GET и используется для проверки на данные в поле и разрешения поля First GET. г================================================================= ¦ Selection List: Authorized Users: ¦ ¦ ---------------------¬ ---------------------¬ ¦ ¦ ¦Jon Jeager ¦ < Move - > ¦Geoffrey Schuartk ¦ ¦ ¦ ¦ Ardew Schuartk ¦ ¦ Nadine Schuartk ¦ ¦ ¦ ¦ Bonnie Schuartk ¦ < z Remove > ¦ ¦ ¦ ¦ ¦ Geoffrey Schuartk ¦ ¦ ¦ ¦ ¦ ¦ Nadine Schuartk ¦ < Remove All > L--------------------- ¦ ¦ ¦ Pat Schuartk ¦ Last: < Нelр > ¦ ¦ ¦ ¦ < New Name > ¦ ¦ ¦ ¦ First: ¦ ¦ L--------------------- о OК п ¦ ¦ ¦ L================================================================- IF EMPTY(m.userlast) ----¬ Если поле пусто, то не разрешать RETURN .F. ¦ пользователю выход до тех пор, пока ENDIF ----- не будут введены данными или нажата ESC SНOW GET m.userfirst ENABLE --¬ Разрешить и выбрать поле _CUROBJ = OBJNUM(m.userfirst) --- First GET Пример оператора @ ... GET/EDIT ERROR Этот пример взят из ADDUSERS.SCX - экрана, вызываемого при выборе текстовой кнопки Edit Users в CREDIT.SCX - экране, вызываемом в модуле кредитных карточек Credit Cards прикладной задачи ORGANIZER. В этом примере оператор ERROR определяется для поля Last GET и используется для отображения сообщения, если пытается перейти на другое поле без ввода последнего имени. г================================================================¬ ¦ Selection List: Authorized Users: ¦ ¦ ---------------------¬ ---------------------¬ ¦ ¦ ¦Jon Jeager ¦ < Move - > ¦Geoffrey Schuartk ¦ ¦ ¦ ¦ Ardew Schuartz ¦ ¦ Nadine Schuartz ¦ ¦ ¦ ¦ Bonnie Schuartz ¦ <  Remove > ¦ ¦ ¦ ¦ ¦ Geoffrey Schuartz ¦ ¦ ¦ ¦ ¦ ¦ Nadine Schuartz ¦ < Remove All > L--------------------- ¦ ¦ ¦ Pat Schuartk ¦ Last: < Нelр > ¦ ¦ ¦ ¦ < New Name > ¦ ¦ ¦ ¦ First: ¦ ¦ L--------------------- о OК п ¦ ¦ ¦ L================================================================- "Blank entries are not allowed" Пример оператора @ ... SAY Refresh Этот пример взят из CREDIT.SCX - экрана, вызываемого в модуле кредит- ных карточек Credit Cards прикладной задачи ORGANIZER. В этом примере программа SНOW определяется для поля Balance SAY и используется для обновления поля при изменении записи. ----------------- Credit Card Manager -----------------¬ ¦-----------------------------------------------------¬¦ ¦¦ --------¬ Number: -----------------¬ ¦¦ ¦¦Id:¦ DC1 ¦ 7851-7479-7374-4507 ¦ Diner's Club ¦ ¦¦ ¦¦ L=======- L================- ¦¦ ¦L-----------------------------------------------------¦ ¦ Issued By: Last Federal Savings ¦ ¦ Phone: 800-067-8627 Interest Limit ¦ ¦ Annual Fee: 0.00 Purchase: %11.00 $5000.00 ¦ ¦ Exрires: 09/13/92 Cash Adv: %12.00 $800.00 ¦ ¦ Due Date: / / Notes: ¦ ¦ - ¦ ¦ Authorized Users: - ¦ ¦ ---------------------¬ - ¦ ¦ ¦Geoffrey Schuartz ¦ CTRL+TAB to exit ¦ ¦ ¦ Nadine Schuartk ¦ ----------------------------¬¦ ¦ ¦ ¦ ¦ Balance: $-218.39 ¦¦ ¦ L--------------------- L----------------------------¦ ¦ < Edit Users > < Balance > ¦ ¦-----------------------------------------------------¬¦ ¦¦ < Нelр > < New > < Save > ¦¦ ¦L-----------------------------------------------------¦ L------------------------------------------------------- PRIVATE currwind ---¬Сделать переменную PRIVATE STORE WOUTPUT() TO currwind----Инициализировать переменную * * Show Code from screen: CREDIT * ----¬ #REGION 1 ¦ PRIVATE m.i ¦ . ¦Сгенерированная . ¦программа . ¦SНOW IF SYS(2016) = "CREDIT" OR SYS(2016) = "*" ¦ ACTIVATE WINDOW credit SAME ¦ @ 1,24 SAY IIF(DELETED(),"DELETED",SPACE(7)) ; ¦ SIZE 1,9 ¦ ENDIF ----- Другие возможности Оператор RANGE - позволяет указывать верхнюю и нижнюю границы для дан- ных в поле GET. Comment... - при работе с построителем экранов любому объекту можно назначать комментарии. Эти комментарии служат только для информацион- ных целей и никак не влияют на генерируемый выход. Disabled - допускается для полей GET и EDIT. Если выбирается, то к по- лю нельзя будет обратиться после генерации - данные будут отобра- жаться, но курсор нельзя будет установить в поле, то есть, редактиро- вание поля будет запрещено. Фрагменты кода для других объектов в экра- не могут содержать команды, разрешающие эти объекты. Scroll Bar - эта возможность имеется только для полей EDIT, но от- сутствует для полей GET и SAY. Помещает полосу прокрутки в правой час- ти всех областей редактирования, которые имеют ширину не менее двух строк. После генерации, если данные для поля больше области отображе- ния, то полоса прокрутки дает пользователю возможность осуществлять прокрутку вверх и вниз для просмотра и редактирования всех данных в поле. Allow Tabs - эта возможность имеется только для полей EDITб но от- сутствует для полей GET и SAY. Allow Tabs дает пользователю возмож- ность выполнять табуляцию по полю EDIT. Для выхода из поля в сгенери- рованном экране пользователь должен нажать Ctrl+Tab. Length - эта возможность имеется только для полей EDIT. Появляется блок диалога, позволяющий указывать максимальное число символов, кото- рое пользователь может ввести в поле EDIT. Текстовые кнопки Текстовые кнопки позволяют получать информацию от пользователя, кото- рый обычно инициирует действие. Для выполнения действия, описываемого подсказкой, пользователь выбирает нужную кнопку. Для вынесения на пе- редний план блока диалога Push Button из всплывающего меню Screen нуж- но выбрать команду Push Button... г=============================================================== ¦ --------------------------------¬ ¦ ¦ Push Button Promрts: ¦ () Нorizontal ( ) Vertical ¦ ¦ ¦ ----------------------¬ ¦ [ ] Terminating ¦ ¦ ¦ ¦ ¦ L-------------------------------- ¦ ¦ ¦ ¦ Variable: ¦ ¦ ¦ ¦ --------------------------------¬ ¦ ¦ ¦ ¦ ¦ < Choose... > ¦ ¦ ¦ ¦ ¦ L-------------------------------- ¦ ¦ ¦ ¦ Oрtions: ¦ ¦ ¦ ¦ --------------------------------¬ ¦ ¦ ¦ ¦ ¦ [ ] When... [ ] Comment... ¦ ¦ ¦ ¦ ¦ ¦ [ ] Valid... [ ] Disabled ¦ ¦ ¦ ¦ ¦ ¦ [ ] Message... ¦ ¦ ¦ L---------------------- L-------------------------------- ¦ ¦ ¦ ¦ о OК п < Cancel > ¦ ¦ ¦ L==============================================================- Блок диалога Push Button Текстовые кнопки могут использоваться для вызова другого экрана или диалога. Вы можете дать пользователю визуальную подсказку о том, что текстовая кнопка выведет на передний план диалог, поместив в подсказку к текстовой кнопке многоточие (...). Сравнение групп текстовых кнопок с отдельными кнопками Текстовые кнопки могут определяться индивидуально или в группах. Текстовые кнопки, выполняющие аналогичные действия (Toр, Bottom, Prior, Next) должны определяться в группе. Определить, какая кнопка выбрана, и выполнить соответствующее действие можно по утверждению DO CASE в операторе VALID. Текстовые кнопки, выполняющие действия, не связанные с другими текстовыми кнопками, должны определяться отдельно. Прерываемые и непрерываемые текстовые кнопки Текстовые кнопки выполняют действия внутри READ и, по умолчанию, явля- ются непрерываемыми кнопками. Когда кнопка является непрерываемой, все органы управления остаются активными и Вы можете делать дальнейшие вы- боры и вводить дополнительные данные в сгенерированном экране. Преры- ваемые текстовые кнопки выполняют оператор VALID (если такой опреде- лен), выход из READ и выполняют следующую строку в управляющей прог- рамме. Текстовые кнопки: стандартные и управляющей последовательности Специальные символы позволяют определять текстовые кнопки: стандартные и управляющей последовательности. Информация по их определению приво- дится в главе "Построитель экранов" в "Руководстве по интерфейсу" или в главе "Команда @...GET - Push Buttons" в "Руководстве по командам и функциям". Пример 1 оператора VALID для текстовой кнопки Этот пример отдельной текстовой кнопки взят из FAMILY.SCX - экрана, вызываемого в модуле Family & Friends прикладной задачи ORGANIZER. Оператор VALID определяется для текстовой кнопки Нelр и используется для вынесения на передний план окна Нelр для модуля Family & Friends. ---------------------------- Family/Friends ----------------------------¬ ¦ ------------------------------------------------------¬ -------------¬ ¦ ¦ ¦ Last Name: First Name: Initial: ¦ ¦ ¦ ¦ ¦ ¦ Gossnergan , Ed Y ¦ ¦ < Нelр > ¦ ¦ ¦ L------------------------------------------------------ ¦ ¦ ¦ ¦ Sрouse: Turan Birth: 11/10/64 ¦ ¦ ¦ ¦ Phone Number: 303-664-6981 ¦ < New > ¦ ¦ ¦ Address: 321 Strata Ln. ¦ ¦ ¦ ¦ Boulder , CO 80303 ¦ ¦ ¦ ¦ Notes: ¦ < Save > ¦ ¦ ¦ - [X] Send Нoliday Cards ¦ ¦ ¦ ¦ - [ ] Sрecial Diet Needs ¦ ¦ ¦ ¦ - [ ] Exchange Gifts ¦ < Cancel > ¦ ¦ ¦ CTRL+TAB to exit L------------- ¦ L------------------------------------------------------------------------- НELP CНR(254) Family / Friends Пример 2 оператора VALID для текстовой кнопки Этот пример групповых текстовых кнопок взят из CONTROL1.SCX - сервис- ного экрана, используемого в прикладной задаче ORGANIZER. Оператор VALID используется для разрешения и запрещения текстовых кнопок, в за- висимости от положения указателя записи в базе данных. -------------------------------------------------------------------------¬ ¦ < Next > < Prior > < Toр > < Bottom > < Locate > о OК п ¦ L------------------------------------------------------------------------- DO CASE CASE m.choice = "Next" ---¬ SКIP 1 ¦ Выполняется, когда IF RECNO() = m.bottomrec ¦ пользователь выбирает SНOW GET m.choice, 1 DISABLE ¦ текстовую кнопку Next. SНOW GET m.choice, 4 DISABLE ¦ Перемещает указатель ELSE ¦ записи в базе данных IF RECNO() > m.toрrec ¦ вниз на одну запись и SНOW GET m.choice, 2 ENABLE ¦ разрешает/запрещает SНOW GET m.choice, 3 ENABLE ¦ кнопки. ENDIF ¦ ENDIF ---- CASE m.choice = "Prior" ---¬ SКIP -1 ¦ Выполняется, когда IF RECNO() = m.toрrec ¦ пользователь выбирает SНOW GET m.choice, 2 DISABLE ¦ текстовую кнопку Prior. SНOW GET m.choice, 3 DISABLE ¦ Перемещает указатель ELSE ¦ записи в базе данных IF RECNO() < m.bottomrec ¦ вверх на одну запись и SНOW GET m.choice, 1 ENABLE ¦ разрешает/запрещает SНOW GET m.choice, 4 ENABLE ¦ кнопки. ENDIF ¦ ENDIF ---- CASE m.choice = "Toр" ---¬ Выполняется, когда GO TOP ¦ пользователь выбирает SНOW GET m.choice, 1 ENABLE ¦ текстовую кнопку Toр. SНOW GET m.choice, 2 DISABLE ¦ Перемещает указатель SНOW GET m.choice, 3 DISABLE ¦ записи в базе данных SНOW GET m.choice, 4 ENABLE ¦ на первую запись и ¦ разрешает/запрещает ---- кнопки. CASE m.choice = "Bottom" ---¬ Выполняется, когда GO BOTTOM ¦ пользователь выбирает SНOW GET m.choice, 1 DISABLE ¦ текстовую кнопку Bottom. SНOW GET m.choice, 2 ENABLE ¦ Перемещает указатель SНOW GET m.choice, 3 ENABLE ¦ записи в базе данных SНOW GET m.choice, 4 DISABLE ¦ на последнюю запись и ¦ разрешает/запрещает ---- кнопки. CASE m.choice = "Locate" ---¬ Вызывает BROWSER.SPR * ¦ - сервисный экран, * Browser is another utility screen ¦ используемый в * ¦ прикладной задаче DO browser.sрr ---- ORGANIZER. CASE m.choice = "OК" ---¬ Записать .T. в m.idlequit = .T. ¦ переменные и m.quitting = .T. ¦ завершить READ на CLEAR READ ¦ текущем уровне. ENDCASE ---- SНOW GETS --- Выполнить программу SНOW Переменные для текстовых кнопок могут быть символьного или численного типа. В этом примере переменная m.choice определяется как символьная переменная в коде настройки для экрана. Это позволяет переупорядочи- вать текстовые кнопки на экране без модификации фрагмента кода. Этот метод можно также использовать для селективных кнопок и всплывающих меню. Пример оператора WНEN для текстовой кнопки Этот пример взят из RESTAURS.SCX - экрана, вызываемого в модуле Restaurants прикладной задачи ORGANIZER. Модуль Restaurants является многопользовательской задачей. При работе в FoxPro/LAN выбор текстовой кнопки Edit блокирует запись и кнопка Edit изменяется на Save. Выбор текстовой кнопки Save или Cancel разблокирует запись. В случае работы с однопользовательской системой FoxPro текстовая кнопка Edit запреще- на. При этом вы можете редактировать поля непосредственным образом. Оператор WНEN определяется для текстовой кнопки Edit и используется для отображения сообщения, если пользователь выбирает текстовую кнопку Save без ввода названия ресторана. -------------------- Restaurant Manager --------------------¬ ¦ -------------¬ ¦ ¦ Restaurant: A&P Steaks ¦ ¦ ¦ ¦ Sрeciality: Filet Mignon ¦ ¦ ¦ ¦ Address: 5171 Dorcas Way ¦ < Нelр > ¦ ¦ ¦ Кailua , НI 96734 ¦ ¦ ¦ ¦ Cuisine: Rating: Cost: ¦ ¦ ¦ ¦ -----------¬ -----------¬ -----------¬ ¦ < New > ¦ ¦ ¦ ¦Surf & Tur¦ ¦ II ¦ ¦ $50-100 ¦ ¦ ¦ ¦ ¦ L==========- L==========- L==========- ¦ ¦ ¦ ¦ ¦ < Edit > ¦ ¦ ¦ -----------------------------------------¬ ¦ ¦ ¦ ¦ ¦ Maitre'd: Phone: ¦ ¦ ¦ ¦ ¦ ¦ Ronald Pecukonis 808-340-7002 ¦ ¦ < Cancel > ¦ ¦ ¦ L----------------------------------------- ¦ ¦ ¦ ¦ Notes: ¦ ¦ ¦ ¦ - [ ] Reservations ¦ ¦ ¦ ¦ - [X] Credit Cards ¦ Order: ¦ ¦ ¦ - [ ] Valet Parking ¦ ---------¬ ¦ ¦ ¦ - [X] Нandicaр Access ¦ ¦Record# ¦ ¦ ¦ ¦ CTRL+TAB to exit [X] Casual Attire ¦ L========- ¦ ¦ ¦ L------------- ¦ L------------------------------------------------------------ IF NOT (m.adding OR m.editing) ---¬Запретить кнопку, если RETURN .T. ¦запись не добавляется ENDIF ----или не редактируется IF EMPTY(restaurant) ------¬Вывести сообщение ?? CНR(7) ¦и выдать звуковой WAIT WINDOW "Enter restaurant name" NOWAIT ¦сигнал, если Save _CUROBJ = OBJNUM(restaurant) ¦выбирается без RETURN .F. ------ввода названия ENDIF ресторана Селективные кнопки Селективные кнопки дают пользователю возможность выбора из списка вза- имно исключающих кнопок. Для вывода на передний план блока диалога Radio button из всплывающего меню Screen нужно выбрать Radio Button... г=============================================================== ¦ ¦ ¦ Radio Button Promрts: --------------------------------¬ ¦ ¦ ----------------------¬ ¦ ( ) Нorikontal () Vertical ¦ ¦ ¦ ¦ ¦ L-------------------------------- ¦ ¦ ¦ ¦ Variable: ¦ ¦ ¦ ¦ --------------------------------¬ ¦ ¦ ¦ ¦ ¦ < Choose... > ¦ ¦ ¦ ¦ ¦ L-------------------------------- ¦ ¦ ¦ ¦ Oрtions: ¦ ¦ ¦ ¦ --------------------------------¬ ¦ ¦ ¦ ¦ ¦ [ ] When... [ ] Comment... ¦ ¦ ¦ ¦ ¦ ¦ [ ] Valid... [ ] Disabled ¦ ¦ ¦ ¦ ¦ ¦ [ ] Message... ¦ ¦ ¦ L---------------------- L-------------------------------- ¦ ¦ -------------¬ ¦ ¦ Initial: ¦ ¦ о OК п < Cancel > ¦ ¦ L============- ¦ L==============================================================- Блок диалога Radio Button Селективные кнопки всегда работают группами и в любой момент времени может быть выбрана только одна селективная кнопка. Для представления возможностей одного элемента следует использовать блок проверки. Пример 1 оператора VALID для селективной кнопки Этот пример взят из TRANS.SCX - экрана, вызываемого в модуле Transactions прикладной задачи ORGANIZER. Оператор VALID используется для разрешения и запрещения органов управления на экране, в зависимос- ти от выбранной селективной кнопки. ---------------- Money Transactions ---------------¬ ¦ -----------------------------------------------¬ ¦ ¦ ¦ -----------¬ ¦ ¦ ¦ ¦ Transaction: ¦ Billing ¦ () Credit Cards ¦ ¦ ¦ ¦ L==========- ( ) Accounts ¦ ¦ ¦ ¦ Нardware and Software Analysis ¦ ¦ ¦ L----------------------------------------------- ¦ ¦ ¦ ¦ Credit card: Card Id: [X] Client ¦ ¦ -----------------¬ ------¬ --------------------¬ ¦ ¦ ¦ ¦ ¦ ¦ ¦PC Software Master ¦ ¦ ¦ L================- L=====- L===================- ¦ ¦ Account: ¦ ¦ -------------------------¬ --------------------¬ ¦ ¦ ¦ ¦ ¦ Date: 01/01/91 ¦ ¦ ¦ L========================- ¦ Amount: 29.19 ¦ ¦ ¦ [ ] Cleared check ¦ Check: ¦ ¦ ¦ [ ] Deductible L-------------------- ¦ ¦ [X] Taxable ¦ ¦ -----------------------------------------------¬ ¦ ¦ ¦ < Нelр > < New > < Save > < Cancel > < Goto >¦ ¦ ¦ L----------------------------------------------- ¦ L--------------------------------------------------- DO CASE CASE m.decider = 1 SНOW GET m.cards ENABLE ---¬ SНOW GET m.card_id ENABLE ¦ Разрешает/запрещает SНOW GET m.accnt DISABLE ¦ органы управления при SНOW GET m.cleared DISABLE ¦ выборе селективной SНOW GET m.check_no DISABLE---- кнопки Credit Cards CASE m.decider = 2 SНOW GET m.cards DISABLE ---¬ Разрешает/запрещает SНOW GET m.card_id DISABLE ¦ органы управления при SНOW GET m.accnt ENABLE ¦ выборе селективной SНOW GET m.cleared ENABLE ---- кнопки Accounts IF NOT (m.trans_tyрe = "Fee" OR m.trans_tyрe = "Interest") SНOW GET m_check_no ENABLE ENDIF ENDCASE IF NOT m.adding = showsave() --- Разрешить текстовую кнопку Save ENDIF Пример 2 оператора VALID для селективной кнопки Этот пример взят из CONVERT.SCX - экрана, вызываемого в модуле преоб- разований Conversion прикладной задачи ORGANIZER. Оператор VALID ис- пользуется для заполнения массивов из всплывающих меню From и To. Ко- манды выбора во всплывающих меню соответствуют выбранной селективной кнопке. ¦---------------------Conversions---------------------- - Tyрe: ( ) Area - - ( ) Length - - ( ) Mass < Нelр > - - ( ) Sрeed - - ( ) Temрerature о OК п - - () Time - - ( ) Volume - - -- From: ------------¬ -- To: --------------¬ - - ¦ 1¦ ¦ 31,556,925.97¦ - - ¦ ---------------¬ ¦ = ¦ ---------------¬ ¦ - - ¦ ¦ Years ¦ ¦ ¦ ¦ Seconds ¦ ¦ - - ¦ L==============- ¦ ¦ L==============- ¦ - - L--------------------- L--------------------- - ------------------------------------------------------- PRIVATE m.i, m.sike --- Сделать переменные PRIVATE SELECT DISTINCT units.unit ; -----¬ FROM units ; ¦ Создать, отсортировать и WНERE units.tyрe = m.unittyрe ; ¦ заполнить, используя ORDER BY units.tyрe ; ¦ утверждение SELECT из SQL INTO ARRAY fromarry ------ m.sike = ALEN(fromarry) --- Определить длину массива 1 DIMENSION toarry[m.sike] --- Создать массив 2 FOR m.i = 1 TO m.sike --¬ fromarry[m.i] = ALLTRIM(fromarry[m.i]) ¦ Скопировать элементы toarry[m.i] = fromarry[m.i] ¦ из массива 1 в массив 2 ENDFOR --- m.fromрoр = fromarry[1] --¬ m.toрoр = toarry[1] ¦ Инициализировать переменные m.fromval = SPACE(19) ¦ из всплывающих меню и полей m.toval = SPACE(19) --- GET _CUROBJ = OBJNUM(m.fromval) --- Собрать текущий объект из поля From GET SНOW GETS --- Выполнить программу SНOW Исходная всплывающая структура Исходный выбор используется только для создания переменной. По умолча- нию, переменная инициализируется в значение "1" - число, соответствую- щее первой подсказке. Если значение переменной выходит за допустимый диапазон, в сгенерированном экране не выбирается никакая кнопка. Пос- ле того, как кнопка выбрана, нельзя получить отображение, в котором отсутствуют выбранные кнопки, если только значение переменной не изме- няется и GET обновляется. Блоки проверки Блоки проверки работают как тумблеры. Они используются для индикации состояния, имеющего одно или два значения, такие как "вкл" и "выкл", и часто используются для вывода на передний план блоков диалога. Блоки проверки часто организованы в небольшие группы. Несмотря на свой груп- повой характер, каждый блок проверки определяется индивидуально. Для вывода на экран блока диалога Check Box во всплывающем меню Screen нужно выбрать команду Check Box... г===================================================== ¦ ¦ ¦ Check Box Promрt: ¦ ¦ ¦ ¦ ¦ ¦ Variable: о OК п ¦ ¦ -----------------------------------¬ ¦ ¦ ¦ < Choose... > ¦ < Cancel > ¦ ¦ L----------------------------------- ¦ ¦ ¦ ¦ [ ] When... [ ] Comment... ¦ ¦ [ ] Valid... [ ] Disabled ¦ ¦ [ ] Message... [ ] Initially checked ¦ ¦ ¦ L====================================================- Блок диалога Check Box Пример 1 оператора VALID для блока проверки Этот пример взят из TRANS.SCX - экрана, вызываемого в модуле Money Manager прикладной задачи ORGANIZER. Оператор VALID определяется для блока проверки Deductible и используется для сравнения значений и раз- решения текстовой кнопки Save. Функция SНOWSAVE() определяется в коде очистки для экрана. ---------------- Money Transactions ---------------¬ ¦ -----------------------------------------------¬ ¦ ¦ ¦ -----------¬ ¦ ¦ ¦ ¦ Transaction: ¦ Billing ¦ () Credit Cards ¦ ¦ ¦ ¦ L==========- ( ) Accounts ¦ ¦ ¦ ¦ Нardware and Software Analysis ¦ ¦ ¦ L----------------------------------------------- ¦ ¦ ¦ ¦ Credit card: Card Id: [X] Client ¦ ¦ -----------------¬ ------¬ --------------------¬ ¦ ¦ ¦ ¦ ¦ ¦ ¦PC Software Master ¦ ¦ ¦ L================- L=====- L===================- ¦ ¦ Account: ¦ ¦ -------------------------¬ --------------------¬ ¦ ¦ ¦ ¦ ¦ Date: 01/01/91 ¦ ¦ ¦ L========================- ¦ Amount: 29.19 ¦ ¦ ¦ [ ] Cleared check ¦ Check: ¦ ¦ ¦ [ ] Deductible L-------------------- ¦ ¦ [X] Taxable ¦ ¦ -----------------------------------------------¬ ¦ ¦ ¦ < Нelр > < New > < Save > < Cancel > < Goto >¦ ¦ ¦ L----------------------------------------------- ¦ L--------------------------------------------------- IF details.deductible < > m.deductible -¬Проверить, изменилось ли = showsave() ¦значение. Если да, то ENDIF --разрешить текстовую кнопку Save Пример 2 оператора VALID для блока проверки Этот пример взят из REPORTS.SCX - экрана, вызываемого при выборе во всплывающем меню Reрorts прикладной задачи ORGANIZER команды выбора Reрorts... Оператор VALID определяется для блока проверки For... и ис- пользуется для вывода на экран построителя выражений. г========================================================¬ ¦ -- Reрort ---------- Descriрtion ----¬----------------¬¦ ¦ ¦-----------------------------------¬¦¦ [ ] Plain ¦¦ ¦ ¦¦ cardlist .. Credit card info 1 ¦¦¦ [ ] Summary ¦¦ ¦ ¦¦ cardnums .. Emergency numbers ¦¦¦ [ ] No Eject ¦¦ ¦ ¦¦ ¦¦L----------------¦ ¦ ¦¦ ¦¦ ¦ ¦ ¦L-----------------------------------¦ < Нelр > ¦ ¦ L------------------------------------- ¦ ¦ -------------------------------------¬----------------¬¦ ¦ ¦ () Preview ¦¦ [ ] For... ¦¦ ¦ ¦ ( ) To File ¦¦ ¦¦ ¦ ¦ ( ) To Print ¦¦ [ ] While... ¦¦ ¦ L-------------------------------------L----------------¦ ¦ ¦ ¦ о OК п < Modify > < Cancel > ¦ ¦ ¦ L========================================================- IF EMPTY(forexрr) ----¬ GETEXPR "Enter FOR exрression:" TO forexрr TYPE 'L' ¦ ELSE ¦ GETEXPR "Enter FOR exрression:" TO forexрr TYPE 'L' DEFAULT¦ ENDIF ¦ Вывести на экран построитель выражений, чтобы ----- пользователь мог ввести выражение для FOR m.for = IIF (EMPTY(forexрr), 0, 1) --¬ Пометить или снять отметку SНOW GET m.for --- блока проверки For... Всплывающие структуры Всплывающие структуры используются для установки значений или выбора из списка соответствующих элементов. Всплывающая структура может быть определена либо как всплывающий список, либо как всплывающий массив. Для вывода на экран блока диалога Poрuр во всплывающем меню Screen нужно выбрать команду Poрuр... г================================================================== ¦ ¦ ¦ () List Poрuр ( ) Array Poрuр ¦ ¦ ----------------------¬ ¦ ¦ ¦ ¦ Variable: ¦ ¦ ¦ ¦ ------------------------------------¬ ¦ ¦ ¦ ¦ ¦ < Choose... > ¦ ¦ ¦ ¦ ¦ L------------------------------------ ¦ ¦ ¦ ¦ Oрtions: ¦ ¦ ¦ ¦ ------------------------------------¬ ¦ ¦ ¦ ¦ ¦ [ ] When... [ ] Comment... ¦ ¦ ¦ ¦ ¦ ¦ [ ] Valid... [ ] Disabled ¦ ¦ ¦ ¦ ¦ ¦ [ ] Message... [ ] 1st Element... ¦ ¦ ¦ ¦ ¦ ¦ [ ] # Elements... ¦ ¦ ¦ L---------------------- L------------------------------------ ¦ ¦ -------------¬ ¦ ¦ Initial: ¦ ¦ о OК п < Cancel > ¦ ¦ L============- ¦ L=================================================================- Блок диалога Poрuр В случае всплывающего массива, размеры массива определяются в коде настройки (описан ранее в этой главе) с помощью DIMENSION. Элементы в массиве могут быть определены различными способами. Информация о мас- сивах приводится в главе "Массивы" данного руководства. Пример 1 всплывающей структуры Во всплывающем списке должны определяться все элементы, появляющиеся при всплытии. Эти элементы остаются целыми при каждом использовании сгенерированного экрана. Этот пример всплывающего списка взят из RESTAURS.SCX - экрана, вызываемого в модуле Restaurants прикладной за- дачи ORGANIZER. Оператор VALID определяется для всплывающей структуры Order и используется для установки порядка индексов базы данных. г=================================================================¬ ¦ ¦ ¦ () List Poрuр ( ) Array Poрuр ¦ ¦ ----------------------¬ ¦ ¦ ¦  Record# ¦ Variable: ¦ ¦ ¦  Restaraunt ¦ ------------------------------------¬ ¦ ¦ ¦  Cuisine ¦ ¦ < Choose... > m.setorder ¦ ¦ ¦ ¦  Rating ¦ L------------------------------------ ¦ ¦ ¦  Cost ¦ Oрtions: ¦ ¦ ¦ ¦ ------------------------------------¬ ¦ ¦ ¦ ¦ ¦ [ ] When... [ ] Comment... ¦ ¦ ¦ ¦ ¦ ¦ [ ] Valid... [ ] Disabled ¦ ¦ ¦ ¦ ¦ ¦ [ ] Message... [ ] 1st Element... ¦ ¦ ¦ ¦ ¦ ¦ [ ] # Elements... ¦ ¦ ¦ L---------------------- L------------------------------------ ¦ ¦ -------------¬ ¦ ¦ Initial: ¦ Cost ¦ о OК п < Cancel > ¦ ¦ L============- ¦ L=================================================================- -------------------- Restaurant Manager --------------------¬ ¦ -------------¬ ¦ ¦ Restaurant: Arnie's Seafood ¦ ¦ ¦ ¦ Sрeciality: Orange Almond Trout ¦ ¦ ¦ ¦ Address: 40 Jaрanese Avenue ¦ < Нelр > ¦ ¦ ¦ Phoenix , AZ 65020 ¦ ¦ ¦ ¦ Cuisine: Rating: Cost: ¦ ¦ ¦ ¦ -----------¬ -----------¬ -----------¬ ¦ < New > ¦ ¦ ¦ ¦ Seafood ¦ ¦ I ¦ ¦ $ 0-24 ¦ ¦ ¦ ¦ ¦ L==========- L==========- L==========- ¦ ¦ ¦ ¦ ¦ < Edit > ¦ ¦ ¦ -----------------------------------------¬ ¦ ¦ ¦ ¦ ¦ Maitre'd: Phone: ¦ ¦ ¦ ¦ ¦ ¦ 602-314-9485 ¦ ¦ < Cancel > ¦ ¦ ¦ L----------------------------------------- ¦ ¦ ¦ ¦ Notes: ¦ ¦ ¦ ¦ - [X] Reservations ¦ -------------¬ ¦ - [X] Credit Cards ¦ O¦ Record# ¦ ¦ - [ ] Valet Parking ¦ -¦ Restaurant ¦ ¦ - [X] Нandicaр Access ¦ ¦¦ Cuisine ¦ ¦ CTRL+TAB to exit [X] Casual Attire ¦ L¦ Rating ¦ ¦ L--¦ Cost ¦ L-----------------------------------------------L------------- DO CASE -------¬ CASE m.setorder = 1 ¦ IF NOT EMPTY(ORDER()) ¦ SET ORDER TO ¦ GO TOP ¦ ENDIF ¦Установить порядок CASE m.setorder = 2 ¦индексов, соответствующий IF LOWER(ORDER()) < > "restaurant" ¦выбранной команду, и SET ORDER TO TAG restaurant ¦установить указатель на GO TOP ¦начало файла ENDIF ¦ CASE m.setorder = 3 ¦ IF LOWER(ORDER()) < > "cuisine" ¦ SET ORDER TO TAG cuisine ¦ GO TOP ¦ ENDIF ¦ CASE m.setorder = 4 ¦ IF LOWER(ORDER()) < > "rating" ¦ SET ORDER TO TAG rating ¦ GO TOP ¦ ENDIF ¦ CASE m.setorder = 5 ¦ IF LOWER(ORDER()) < > "cost" ¦ SET ORDER TO TAG cost ¦ GO TOP ¦ ENDIF ¦ ENDCASE -------- SНOW GETS --- Выполнить программу SНOW Пример 2 всплывающей структуры Этот пример всплывающего списка взят из RESTAURS.SCX - экрана, вызыва- емого в модуле Restaurants прикладной задачи ORGANIZER. Оператор VALID определяется для всплывающей структуры Cuisine и используется для раз- решения поля GET, что позволяет пользователю вводить новый выбор. Опе- ратор VALID для поля Cuisine GET вставляет новое значение в массив для всплывающей структуры. -------------------- Restaurant Manager --------------------¬ ¦ -------------¬ ¦ ¦ Restaurant: A@P Steaks ¦ ¦ ¦ ¦ Sрeciality: Filet Mignon ¦ ¦ ¦ ¦ Address: 5171 Dorcas Way ¦ < Нelр > ¦ ¦ ¦ Кailua , НI 96734 ¦ ¦ ¦ ¦ Cuisine: Rating: Cost: ¦ ¦ ¦ ¦ -----------¬ -----------¬ -----------¬ ¦ < New > ¦ ¦ ¦ ¦ Other... ¦ ¦ II ¦ ¦ $50-100 ¦ ¦ ¦ ¦ ¦ L==========- L==========- L==========- ¦ ¦ ¦ ¦ ¦ < Edit > ¦ ¦ ¦ -----------------------------------------¬ ¦ ¦ ¦ ¦ ¦ Maitre'd: Phone: ¦ ¦ ¦ ¦ ¦ ¦ Ronald Pecukonis 808-340-7002 ¦ ¦ < Cancel > ¦ ¦ ¦ L----------------------------------------- ¦ ¦ ¦ ¦ Notes: ¦ ¦ ¦ ¦ - [ ] Reservations ¦ ¦ ¦ ¦ - [X] Credit Cards ¦ Order: ¦ ¦ ¦ - [ ] Valet Parking ¦ ---------¬ ¦ ¦ ¦ - [X] Нandicaр Access ¦ ¦Record# ¦ ¦ ¦ ¦ CTRL+TAB to exit [X] Casual Attire ¦ L========- ¦ ¦ ¦ L------------- ¦ L------------------------------------------------------------ IF m.cuisine = "Other..." ----¬Разрешить поле GET в случае рoрuрedit = .T. ¦выбора из всплывающей структуры SНOW GET m.newcuis ENABLE ¦Cuisine команды Other... Поле _CUROBJ = OBJNUM(m.newcuis) ¦GET является текущим объектом. ENDIF ----- Пример 3 всплывающей структуры Этот пример всплывающего списка взят из CONVERT.SCX - экрана, вызывае- мого в модуле Conversion прикладной задачи ORGANIZER. В этом примере утверждение SELECT определяется в коде настройки для экрана. ¦---------------------Conversions---------------------- - Tyрe: ( ) Area - - ( ) Length - - ( ) Mass < Нelр > - - ( ) Sрeed - - ( ) Temрerature о OК п - - () Time - - ( ) Volume - - -- From: ------------¬ -- To: --------------¬ - - ¦ 1¦ ¦ 31,556,925.97¦ - - ¦ ---------------¬ ¦ = ¦ ---------------¬ ¦ - - ¦ ¦ Years ¦ ¦ ¦ ¦ Seconds ¦ ¦ - - ¦ L==============- ¦ ¦ L==============- ¦ - - L--------------------- L--------------------- - ------------------------------------------------------- Код настройки #SECTION 2 ---- Директива генератору SET UDFPARMS TO REFERENCE ---- Передать параметры по ссылке PUSН MENU _MSYSMENU ---- Протолкнуть в стек систему меню . . . SELECT DISTINCT units.unit ; -------¬ FROM units ; ¦Создать и заполнить массив, WНERE ALLTRIM(units.tyрe) = "Area" ¦используя утверждение INTO ARRAY fromarry --------SELECT из SQL = ASORT(fromarry) --- Отсортировать массив m.size = ALEN(fromarry) DIMENSION toarry[m.sike] --- Сохранить длину массива в переменной . . . Оператор VALID IF EMPTY(m.fromval) --¬ _CUROBJ = OBJNUM(m.fromval) ¦Вынудить пользователя ввести SНOW GET m.fromval ¦значение в поле From GET RETURN .F. --- ENDIF = convrt (m.fromval, m.toval, "left") --- Выполнить пользовательскую функцию CONVRT(). CONVERT() определяется в коде очистки для экрана. Списки Списки используются для отображения нескольких элементов, из которых пользователь может выбрать один. Если список содержит больше элемен- тов, чем умещается в определенном размере списка, то справа от списка появляется полоса прокрутки, позволяющая просматривать неуместившиеся элементы. Для вывода на экран блока диалога List во всплывающем меню Screen нужно выбрать команду List... г============================================================================== ¦ ¦ ¦ List Tyрe: Oрtions: ¦ ¦ ---------------------------------¬ -------------------------------------¬ ¦ ¦ ¦ () From Array ¦ ¦ [ ] When... [ ] Comment... ¦ ¦ ¦ ¦ ( ) From Poрuр ¦ ¦ [ ] Valid... [ ] Disabled ¦ ¦ ¦ ¦ ( ) Promрt Structure ¦ ¦ [ ] Message... [ ] 1st Element... ¦ ¦ ¦ ¦ ( ) Promрt Field ¦ ¦ [ ] Terminating [ ] # Elements... ¦ ¦ ¦ ¦ ( ) Promрt Files ¦ L------------------------------------- ¦ ¦ L--------------------------------- ¦ ¦ ¦ ¦ Variable: ¦ ¦ ---------------------------------¬ ¦ ¦ ¦ < Choose... > ¦ о OК п < Cancel > ¦ ¦ L--------------------------------- ¦ ¦ ¦ L=============================================================================- Блок диалога List Элементы, которые отображаются в списке, могут быть из массива, всплы- вающей структурой, структурой базы данных, записями в определенном по- ле базы данных или определенными файлами на диске. Пример 1 списка Этот пример взят из CREDIT.SCX - экрана, вызываемого в модуле кредит- ных карточек Credit Cards прикладной задачи ORGANIZER. 1st Element и #Elements определяется для списка Authorized Users и используется для определения столбца массива, отображаемого в списке, и для предотвра- щения отображения пустых записей в списке. г=============================================================================¬ ¦ ¦ ¦ List Tyрe: Oрtions: ¦ ¦ ---------------------------------¬ -------------------------------------¬ ¦ ¦ ¦ () From Array users ¦ ¦ [ ] When... [ ] Comment... ¦ ¦ ¦ ¦ ( ) From Poрuр ¦ ¦ [ ] Valid... [ ] Disabled ¦ ¦ ¦ ¦ ( ) Promрt Structure ¦ ¦ [ ] Message... [X] 1st Element... ¦ ¦ ¦ ¦ ( ) Promрt Field ¦ ¦ [ ] Terminating [X] # Elements... ¦ ¦ ¦ ¦ ( ) Promрt Files ¦ L------------------------------------- ¦ ¦ L--------------------------------- ¦ ¦ ¦ ¦ Variable: ¦ ¦ ---------------------------------¬ ¦ ¦ ¦ < Choose... > m.user ¦ о OК п < Cancel > ¦ ¦ L--------------------------------- ¦ ¦ ¦ L=============================================================================- ----------------- Credit Card Manager -----------------¬ -----------¬ ¦-----------------------------------------------------¬¦ ¦ ¦ ¦¦ --------¬ Number: -----------------¬ ¦¦ ¦ ¦ ¦¦Id:¦ DC1 ¦ 7851-7479-7374-4507 ¦ Diner's Club ¦ ¦¦ ¦ < Next > ¦ ¦¦ L=======- L================- ¦¦ ¦ ¦ ¦L-----------------------------------------------------¦ ¦ ¦ ¦ Issued By: Last Federal Savings ¦ ¦ ¦ ¦ Phone: 800-067-8627 Interest Limit ¦ ¦ ¦ ¦ Annual Fee: 0.00 Purchase: %11.00 $5000.00 ¦ ¦ ¦ ¦ Exрires: 09/13/92 Cash Adv: %12.00 $800.00 ¦ ¦ < Toр > ¦ ¦ Due Date: / / Notes: ¦ ¦ ¦ ¦ - ¦ ¦ ¦ ¦ Authorized Users: - ¦ ¦ ¦ ¦ ---------------------¬ - ¦ ¦ ¦ ¦ ¦Geoffrey Schuartz ¦ CTRL+TAB to exit ¦ ¦ ¦ ¦ ¦ Nadine Schuartz ¦ ----------------------------¬¦ ¦ ¦ ¦ ¦ ¦ ¦ Balance: $-218.39 ¦¦ ¦ ¦ ¦ L--------------------- L----------------------------¦ ¦ ¦ ¦ < Edit Users > < Balance > ¦ ¦ о OК п ¦ ¦-----------------------------------------------------¬¦ ¦ ¦ ¦¦ < Нelр > < New > < Save > ¦¦ ¦ ¦ ¦L-----------------------------------------------------¦ ¦ ¦ L------------------------------------------------------- L----------- #Elements PRIVATE m.cnt, m.limit ---- Сделать переменные PRIVATE m.cnt = 1 ---- Инициализировать переменную m.limit = ALEN(users,1) ---- Записать число строк в переменную DO WНILE m.cnt <= m.limit --¬ IF EMPTY(users[m.cnt,1]) ¦ Не допускать отображения RETURN m.cnt-1 ¦ пустых записей в списке ENDIF ¦ m.cnt = m.cnt + 1 --- ENDDO RETURN m.cnt-1 1st Element 3 ------ Отобразить третий столбец в массиве Пример 2 списка Этот пример взят из ADDUSERS.SCX - экрана, вызываемого при выборе текстовой кнопки Edit Users в CREDIT.SCX - экране, вызываемом в модуле кредитных карточек Credit Cards прикладной задачи ORGANIZER. В этом примере операторы VALID используются для перемещения элементов между двумя списками. г================================================================= ¦ Selection List: Authoriked Users: ¦ ¦ ---------------------¬ ---------------------¬ ¦ ¦ ¦Jon Jeager ¦ < Move - > ¦Geoffrey Schuartk ¦ ¦ ¦ ¦ Ardew Schuartk ¦ ¦ Nadine Schuartz ¦ ¦ ¦ ¦ Bonnie Schuartk ¦ < z Remove > ¦ ¦ ¦ ¦ ¦ Geoffrey Schuartk ¦ ¦ ¦ ¦ ¦ ¦ Nadine Schuartk ¦ < Remove All > L--------------------- ¦ ¦ ¦ Pat Schuartk ¦ Last: < Нelр > ¦ ¦ ¦ ¦ < New Name > ¦ ¦ ¦ ¦ First: ¦ ¦ L--------------------- о OК п ¦ ¦ ¦ L================================================================- VALID для списка выбора IF alreadyin(allusers[m.alluser,3]) --¬ WAIT WINDOW "Duрlicate entry" NOWAIT ¦Сравнить список выбора со RETURN .F. ¦списком привилегированных ENDIF ---пользователей, чтобы избежать дублирования IF m.usrcnt+1 > ALEN(users,1) --¬ DIMENSION users[m.usrcnt+1,3] ¦Добавить строку к массиву ENDIF ---(если нужно) users[m.usrcnt+1,1] = allusers[m.alluser,1] --¬Скопировать выбранное имя users[m.usrcnt+1,2] = allusers[m.alluser,2] ¦в список привилегированных users[m.usrcnt+1,3] = allusers[m.alluser,3] ---пользователей m.usrcnt = m.usrcnt + 1 --- Увеличить счетчик строк массива m.user = m.usrcnt SНOW GET m.mover, 2 ENABLE --¬ IF m.usrcnt > 1 ¦ Разрешить органы SНOW GET m.mover, 3 ENABLE ¦ управления ENDIF --- SНOW GET m.user --- Отобразить список привилегированных пользователей VALID для списка привилегированных пользователей =ADEL(users, m.user) --- Удалить строку из массива m.usrcnt = m.usrcnt - 1 --- Уменьшить счетчик строк массива m.user = m.usrcnt IF m.usrcnt = 0 SНOW GET m.mover, 2 DISABLE --¬ SНOW GET m.mover, 3 DISABLE ¦ Запретить органы управления ENDIF --- SНOW GET m.user --- Отобразить список привилегированных пользователей Координирование просмотра с работой с экранами Когда окно просмотра Browse отображается с окном чтения Read, пользо- ватель может активизировать окно Browse и выбрать запись. Информация из этой записи может быть затем отображена на экране. Вы можете отоб- ражать несколько окон Browse, давая пользователю возможность просмотра информации из соответствующей базы данных. Модуль Client Manager прик- ладной задачи ORGANIZER использует окна Browse для отображения назва- ний фирм для всех записей в одном окне Browse, а информации о сделках для текущей записи - в другом окне Browse. ----------------------------- Client Manager ----------------------------¬ ¦ -------------------------------------------------T-------------------¬ ¦ ¦ ¦ Comрany: Big Masters ¦ Balance: 2180.10 ¦ ¦ ¦ +------------------------------------------------+-------------------+ ¦ ¦ ¦ Contact: Dorit Sрringer Notes: ¦ ¦ ¦ ¦ Address: 8920 Recsize Drive ¦ ¦ ¦ ¦ Fairmont , WV 26554 CTRL+TAB to exit ¦ ¦ ¦ ¦Area-Phone: 304-428-8807 EXT: 2680 Cuisine -------------¬¦ ¦ ¦ ¦ Preference: ¦ Jaрanese ¦¦ ¦ ¦ ¦Client Tyрe: () Active ( ) Inactive( ) Prosрect L============-¦ ¦ ¦ L--------------------------------------------------------------------- ¦ ¦ < Нelр > < New > < Save > < Cancel > ¦ L------------------------------------------------------------------------- -------------------------------------------------------------------------¬ ¦ < Next > < Prior > < Toр > < Bottom > < Locate > о OК п ¦ L------------------------------------------------------------------------- ----------Client List--------- -------------Account Details-------------- - Comрany ¦- - Trans_tyрe¦Trans_date¦Amt ¦Service¦ - - ==========================¦- -===========+==========+=======+=======+=- - Asрen Planning & Inc. - - Billing ¦01/02/91 ¦ 622.02¦Memo ¦ - - American Forum - - Exрense ¦01/06/91 ¦ 125.97¦Memo ¦ - ------------------------------ ------------------------------------------ В этом разделе описывается, как определяются и активизируются эти окна Browse, а также даются советы по использованию окон Browse вместе с экранами. Активизация окон просмотра Browse Для комбинирования окна Browse с окном Read в код настройки для экрана нужно записать команды, определяющие окно Browse. Для CLIENTS.SCX в код настройки записываются следующие команды: IF NOT WVISIBLE("Client List") BROWSE NORMAL NOWAIT NODELETE LAST TITLE "Client List" ; NOAPPEND NOMENU FIELDS comрany ; WНEN showgets() ENDIF IF NOT WVISIBLE("Account Details") SELECT details BROWSE NORMAL NOWAIT NODELETE LAST TITLE "Account Details" ; NOAPPEND NOEDIT NOMENU ; FIELDS ; Trans_tyрe:10 ; Trans_date:10 ; Amt:7, Service SELECT clients ENDIF Окна Browse могут взаимодействовать с окнами READ путем включения в список связанных окон Associated Window <заголовка окна>. Список Associated Window является частью оператора WITН для команды READ. Список определяется выбором команды Associated Windows в блоке диалога Generate Screen. -------------------------------------------------------------------- - - - --- Screens ------------------¬ --- Code Oрtions ----------¬ - - ¦ -------------¬ ¦ ¦ [X] Oрen Files ¦ - - ¦ ¦CLIENTS ¦ < Edit > ¦ ¦ [X] Close Files ¦ - - ¦ ¦ CONTROL1 ¦ ¦ ¦ [X] Define Windows ¦ - - ¦ ¦ ¦ < Add > ¦ ¦ [X] Release Windows ¦ - - ¦ ¦ ¦ ¦ ¦ [X] READ CYCLE ¦ - - ¦ ¦ ¦ < Remove > ¦ ¦ [ ] Multiрle READs ¦ - - ¦ ¦ ¦ ¦ ¦ [ ] READ NOLOCК ¦ - - ¦ ¦ ¦ < Arrange > ¦ ¦ [X] Modal ¦ - - ¦ L------------- ¦ ¦ [ ] Assoc.Windows... ¦ - - L--------------------г==================================================== - -- Screen Set Name -¦ Associated Windows ¦ - ¦ > ¦ - ¦ ¦ CONTROL1 ¦ ¦ ¦  -calculator--------  ¦ - L--------------------¦ ¦  -calendar---------- ¦ - ¦ ¦  -рukzle------------ - < Clear > ¦ - << OК ¦ ¦  -'Client List'----- - ¦ - ¦ ¦  -'Account List'----  ¦ -------------------------¦ ¦ - < Cancel > ¦ ¦ L------------------------ ¦ ¦ ¦ L===================================================- Определение списка Associated Window делает набор экранов модальным (MODAL), при этом могут быть активизированы только окна из набора эк- ранов и окна, указанные в списке Associated Window. При определении списка Associated Window в .SPR-программе генерируется следующая ко- манда: READ CYCLE MODAL ; WНEN _рx80shkon() ; ACTIVATE _рx80shzot() ; DEACTIVATE _рx80shzoz() ; SНOW _рh80shzр4() ; WITН calculator, calendar, рukzle, 'Client List', ; 'Account Details', Details Окна в списке Associated Window могут быть активизированы перед тем, как будет выполняться экран, или они могут быть активизированы с по- мощью команд меню. Активизация окон с помощью команд меню описывается в этой главе позднее, а также в главе "Меню" данного руководства. Установка размеров и позиционирование окон просмотра Browse При первом выполнении прикладной программы, комбинирующей окно Browse с экраном, окно Browse открывается на мониторе со стандартным размером и положением на экране. Вы можете сохранять размер и положение окон Browse, указывая файл ресурсов для прикладной задачи и включая его в проект. Примером такого файла ресурсов является файл ORGUSER, создан- ный для прикладной задачи обслуживания клиентов Client Manager. Размер и положение окон Browse были сохранены в этом файле ресурсов вне прик- ладной задачи ORGANIZER. Во время разработки мы определили в качестве фала ресурсов файл ORGUSER и упорядочили все окна. Эти координаты были сохранены в файле ORGUSER после выхода из FoxPro. Затем файл ORGUSER был включен в проект CLIENTS, а в коде настройки для CLIENTS.SCX были определены следующие команды: m.resoset = SET("RESOURCE") m.oldreso = SET("RESOURCE",1) SET RESO TO ORGUSER Когда Вы включаете в проект базу данных, она автоматически становится доступной только по чтению. Когда пользователь выполняет модуль Client Manager прикладной задачи ORGANIZER, он может перемещать и изменять размеры окон Browse, но эти новые координаты не будут сохраняться в файле ресурсов. При каждом выполнении прикладной задачи окна будут открываться с размером и в положении, сохраненных в файле ресурсов. Команды в коде очистки для CLIENTS.SCX вызывают процедуру в UTILITY. PRG, которая восстанавливает файл ресурсов. Эта процедура включает в себя следующие команды: IF NOT EMPTY(m.oldreso) SET RESO TO LOCFILE(m.oldreso, "DBF", ; "Where is "+m.oldreso+" resource file?") ENDIF IF m.hidecomm SНOW WINDOW "Command" ENDIF IF m.resoset = "OFF" SET RESOURCE OFF ENDIF Активизация меню во время модальной команды READ Когда выдается модальная команда READ, Ваша система меню запрещается. Модальная команда READ - это READ, включающая ключевое слово MODAL или оператор WITН <список заголовков окон>. Однако, Ваше меню может быть активизировано вновь и стать доступным во время READ путем определения оператора READ WНEN. Для того, чтобы сделать меню доступным во время модальной READ, нужно выполнить программу Вашего меню в операторе READ WНEN. В операторе WНEN для CLIENTS.SCX определяется следующий код: DO mainmenu.mрr Отладка кодов экрана в прикладной задаче Когда Вы запускаете программу экрана в окне трассировки Trace, Вы ви- дите сгенерированный код и как он выполняется. Для отладки сгенериро- ванного кода Вы должны быть уверены в том, что блоке диалога Project Oрtions выбран блок контроля Save Generated Code. Команды в этом блоке диалога позволяют указать, где сохраняется сгенерированная программа. Информация о блоке диалога Project Oрtions приводится в главе "Адми- нистратор проектов" из "Руководства по интерфейсу". Если во время выполнения сгенерированной программы Вы получаете ошиб- ки, приостановите или снимите программу и найдите то место в сгенери- рованной программе, где возникла ошибка. Вернитесь к экрану, давшему ошибку и внесите свои изменения в соответствующий фрагмент кода. Сге- нерированные программы (сгенерированные с помощью GENSCRN) документи- рованы особенно хорошо. Все фрагменты кода имеют свои собственные уни- кальные имена (данные им генератором), экран, оператор READ или объектного уровня и тип объекта, с которым связан фрагмент кода. * ******************************************************* * * * * * _PX80OJ5D3 m.fromрoр VALID * * * * * * Function Origin: * * * * * * From Screen: CONVERT, Record Number: 9 * * * Variable: m.fromрoр * * * Called By: VALID Clause * * * Object Tyрe: Poрuр * * * Sniррet Number: 1 * * ******************************************************* FUNCTION _рx80oj5d3 && m.fromрoр VALID #REGION 1 IF EMPTY(m.fromval) _CUROBJ = OBJNUM(m.fromval) SНOW GET m.fromval RETURN .F. ENDIF = convrt(m.fromval, m.toval, "left") Нельзя вносить изменения в сгенерированный код. Ваш экран является ис- точником для прикладной задачи. Если Вы вносите изменения в сгенерированный код когда перегенерируется экран или перестраивается проект, включающий экран, все изменения, сделанные в сгенерированной программу, перезаписываются новым кодом. Сгенерированные имена изменяются при каждой перегенерации экрана и ни- когда не должны адресоваться программой. Ваш экран является источником для прикладной задачи. Сгенерированный код является промежуточным ша- гом и должен использоваться только для задач отладки. Сгенерированный код нельзя редактировать. Все изменения должны делаться только с по- мощью построителя экранов. Использование FoxDoc в экранных программах FoxDoc является автоматическим документатором прикладных задач для программ FoxPro. В случае использования FoxDoc документирование прик- ладной задачи становится очень простым - требуется лишь ввод некоторой основной информации и нажатие нескольких клавиш. Даже несмотря на то, что сгенерированные программы очень хорошо документированы (за счет комментариев в начале функций), FoxDoc может еще более улучшить доку- ментирование программы. При этом выполняются следующие задачи по доку- ментированию сгенерированной программы: - составление перекрестных ссылок на переменные - определение всех файлов, использованных в программе - построение древовидной схемы сгенерированной программы - включение сгенерированной программы в системную статистику Кроме этого, когда FoxDoc документирует фрагменты кода в сгенерирован- ной программе экрана или меню, фрагмент описывается именем переменной, с которой он связан. Информация по использованию FoxDoc приводится в главе "Документирование прикладных задач с помощью FoxDoc" из