21 | 08 | 2017

Глава 3:BROWSE (часть1)

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

Синтаксис команды слегка пугает, и я предлагаю разделить обсуждение на несколько частей и разбирать их по одной.

Перемещение в окне BROWSE

Стрелки управления курсором перемещают курсор в окне на одну запись, клавиши PgUp, PgDn - перемещают курсор на группу записей. Перемещение между полями выполняется клавишей табуляции Tab или Shift-Tab.

Выход из режима BROWSE

Для выхода с сохранением изменений нажмите Ctrl-W, Ctrl-End или приведите курсор мыши на элемент управления в верхнем левом углу окна и нажмите левую кнопку. Если вы нажмете Ctrl-Q или Escape, вы потеряете изменения, внесенные в текущее поле. Программно выйти из режима с сохранением данных можно использовав команду:

ON KEY LABEL F10 KEYBOARD[{Ctrl+W}]

в установочной части программы и добавив сообщение "F10 для выхода" в текст на верхней или нижней части рамки окна.



Для редактирования memo-поля подведите к нему курсор и нажмите Ctrl-PgDn или дважды щелкните левой кнопкой мыши, когда курсор на нужном поле. Для выхода из окна редактирования с сохранением изменений нажмите Ctrl-W или приведите курсор мыши на элемент управления в верхнем левом углу окна и нажмите левую кнопку, нажав Esc вы выйдете с потерей внесенных изменений. Опять-таки можно использовать назначение клавиш:

USE CUSTOMER
ON KEY LABEL F4 KEYBOARD [{Ctrl+PgDn}]
BROWSE FIELDS ID, MEMO :W=BrowseMsg()
FUNCTION BrowseMsg
WAIT WINDOW [F4 для редактирования] NOWAIT


Предложения команды

Команда BROWSE поддерживает большой набор предложений. Предлагаю вам их список с кратким описанием каждого. FIELDS - Это предложение может быть использовано для ограничения выводимых полей только теми, что представлены в списке field list. Список может включать любую комбинацию полей базы данных и/или вычисляемых полей. Формат списка следующий:

<поле1> [:R] [:<ширина колонки nn>]
[:V = <expL1>[:F] [:E = <expC1>]]
[:P = <expC2>]
[:B = <expr1>, <expr2>[:F]]
[:H = <expC3>]
[:W = <expL2>]
[, <поле2> [:R] ... ]


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

:R означает, что поле имеет атрибут "только для чтения".

:nn определяет ширину выводимой колонки и является необязательным.

:V= предшествует условию проверки ввода (VALID), которое может быть представлено пользовательской функцией.

:F после предложения VALID обеспечивает принудительную проверку правильности ввода даже если значение в поле не изменилось.

:Е= определяет реакцию системы на неправильный ввод (если анализ ввода в предложении VALID даст значение .F.).

:P= это предложение PICTURE.

:B= определяет диапазон допустимых значений, в который должно попадать значение поля.

:Н= определяет заголовок для поля при выводе его на экран, удобно для вычисляемых полей.

:W= определяет условиепроверки при входе в поле или выполняет некоторое специальное действие. Я широко использую это предложение для придания режиму определенных свойств.

Вычисляемые поля

Помимо полей из любого открытого в данный момент файла данных вы можете создавать новые, например:
<имя вычисляемого поля>=<выражение>

Вычисляемым полям присваивается атрибут "только для чтения" и они часто используются для вывода на экран различного рода расчетных величин. Их можно также использовать для вывода флагов, указывающих на наличие или отсутствие дочерних записей в другом файле (см. Листинг 3-1).

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

FORMAT позволяет вам использовать файл формата вывода. Для подключения определенного формата вывода вам сначала необходимо выполнить два действия:


1) Создать текстовый файл с расширением .FMT, содержащий выражения @...GET со всеми необходимыми предложениями VALID, WHEN, RANGE и PICTURE. Координаты при @...GET должны быть одинаковыми (например, @0,0 GET...)


2) Выполнить команду SET FORMAT TO <имя файла.fmt> перед выполнением команды BROWSE FORMAT.

Вычисляемые поля в BROWSE

Из файла формата система извлекает следующую информацию, которая затем связывается с окном BROWSE:

  • Список полей вывода
  • Имеющиеся предложения VALID
  • Имеющиеся предложения WHEN
  • Имеющиеся предложения RANGE
  • Ширина колонок определяется предложением PICTURE
  • Все выражения SAY включаются как вычисляемые поля

FREEZE <имя поля> Если вы укажете в предложении FREEZE имя поля, то вы сможете редактировать только это поле. Если список не указан, то выводятся все поля. Это особенно удобно для организации ввода данных во вновь созданное поле файла.

KEY выр1 [,выр2] Выражение при KEY ограничивает диапазон выводимых записей. Первой записью, выводимой в окно, оказывается та, значение ключевого выражения которой соответствует выражению1. Выражение2 определяет нижний предел значения ключевого выражения для выводимого диапазона записей.

LAST Введение в команду предложения LAST обеспечивает вывод окна со всеми теми атрибутами, которые были сохранены в ресурсном файле Foxuser.dbf с момента последнего вывода окна с аналогичным именем. Запоминание конфигурацииBROWSE происходит только в том случае, если имеется установка SET RESOURCE ON. Отключение режима сохранения конфигурации значительно ускорит работу BROWSE.

LEDIT | REDIT обеспечивают вывод левой или правой панели BROWSE в режиме просмотра по записям (Change|Edit mode).

LOCK <вырN> LOCK определяет число полей, выводимых в левой панели окна BROWSE.

LPARTITION помещает курсор в первом поле левой панели или в правой панели, если в составе команды нет предложения PARTITION.

NOAPPEND запрещает добавление новых записей в файл, пока пользователь находится в окне BROWSE.

NOCLEAR при наличии этого предложения окно BROWSE остается на экране или в своем окне после выхода из режима.

NODELETE Обычно вы можете пометить запись как удаленную нажав Ctrl-T, выбрав опцию Toggle Delete в выпадающем меню Browse или нажав левую кнопку мыши когда курсор расположен в крайней левой колонке окна. Если вы включили в команду предложение NODELETE, то записи не могут быть помечены для удаления.

NOEDIT | NOMODIFY запрещают внесение изменений в файл данных.

NOLGRID | NOGRID позволяют получить окно без вертикальных линий, разделяющих поля записи.

NOLINK отключает синхронизацию панелей.

NOMENU блокирует доступ к меню BROWSE и его опциям.

NOOPTIMIZE отключает использование Rushmore. Используйте это предложение, если процедура, связанная с предложением VALID, может изменять значение поля, входящего в выражение индексирования.

NOREFRESH При работе в сети содержимое окна BROWSE обновляется каждые n секунд (частота обновления определяется установкой SET REFRESH). Включение предложения NOREFRESH блокирует обновление. При работе с файлами "только для чтения" использование NOREFRESH позволяет повысить производительность. (Примечание: Я всегда устанавливаю SET REFRESH TO 0, и в этом случае предложение не действует).

NORMAL Обычно BROWSE принимает атрибуты (цвет, размер и положение, атрибуты заголовка, свойства окна: ZOOM, GROW, FLOAT ...) определенного пользователем окна, которое в данный момент активно и расположено наверху стека. Если вы включите в команду предложение NORMAL, то окно BROWSE открывается так, как если бы оно было единственным активным окном. Это предложение действует только при наличии активного пользовательского окна (или если вам необходимо игнорировать установки, сохраненные в ресурсном файле, - прим. пер.).

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

PARTITION expN2 Это предложение используется для разделения окна на две панели. Значение expN2 определяет положение разделителя панелей.

PREFERENCE expC1 Вы можете сохранить текущие атрибуты окна BROWSE в файле Foxuser.Dbf под определенным именем и использовать их в дальнейшем.

REST Обычно при просмотре записей FoxPro автоматически переводит указатель на первую запись файла (ту, которая имеет значение RECNO()=1 или первую в соответствии с активным индексом или фильтром). Команда BROWSE REST означает начать просмотр с текущей записи.

SAVE Это предложение сохраняет образ окна BROWSE и имеющихся на экране окон для memo-полей после выхода из режима просмотра.

TIMEOUT expN3 Значение при предложении TIMEOUT определяет как долго BROWSE будет ожидать ввода перед тем как автоматически закрыться. Период указывается в секундах. Это предложение аналогично предложению TIMEOUT команды READ и используется в сетевых приложениях для предотвращения блокировки файла.

TITLE expC2 Пользователь может задавать собственный заголовок окна, расположенный на верхней рамке.

VALID expL2 [ERROR expC3] Код, привязанный к предложению VALID, отрабатывается при переходе на другую запись в окне. Включение этого предложения позволяет вам устанавливать проверку на уровне записей. Логика, связанная с предложением, отрабатывается только если пользователь внес какие- либо изменения в содержимое записи. Если VALID возвращает логическое .Т., вы можете перейти на другую запись. Вы можете назначить принудительную проверку, поставив :F или /F после слова VALID. В этом случае проверка будет выполняться даже если содержимое записи не изменилось. Если VALID возвращает .F. вы не можете покинуть запись, и система выдает сообщение об ошибке. Если возвращается 0, то курсор остается на текущей записи, но сообщение об ошибке не выводится.

WHEN expL3 Это предложение служит для проверки доступности записи. Если WHEN возвращает .F. или 0, запись, на которую вы переходите, становится недоступной для редактирования. Так как WHEN исполняется при входе в новую запись, ее также можно использовать для инициализации других значений.

WIDTH expN4 Число при предложении WIDTH определяет ширину всех выводимых полей. Если для индивидуального поля ширина задана внутри предложения FIELDS, то это значение имеет приоритет. Для вывода большего количества полей на экран вы можете использовать команду типа: BROWSE WIDTH 15.

WINDOW<имя окна> IN WINDOW <имя окна2> Предложение WINDOW открывает BROWSE в ранее определенном окне командой DEFINE WINDOW. Предложение WINDOW активизирует это окно и помещает в него окно BROWSE, которое заполняет его целиком и принимает его атрибуты. Если использовано предложение IN WINDOW, то окно BROWSE открывается внутри указанного окна, но независимо от него. BROWSE не принимает атрибутов родительского окна. Окно, указанное в предложении IN WINDOW, должно быть определено заранее командой DEFINE WINDOW. Я использую это предложение для создания специальных рамок для моих BROWSE.

COLOR SCHEME expN5 | COLOR <цвета> Вы можете назначить окну просмотра собственную цветовую комбинацию, имеющую приоритет над схемой 10, определяющей цвета окна BROWSE. Для этого вы либо создаете собственную цветовую схему, либо непосредственно указываете цвета окна.