4.5 Изучение графических возможностей
FOX PRO содержит средства создания изображений из элементов псевдографики:
@ <Y1,Х1,Y2, Х2> BOX <вырC>.
Команда формирует в заданных координатах рамку фон прямоугольника из любых символов, которые включены в <вырC>. Это символьное выражение может содержать до 9 символов (по 4 символа для углов и сторон прямоугольника, начиная с левого верхнего угла по часовой стрелке).
@ <Y1,Х1> TO <Y2,X2>[DOUBLE/PANEL/<окантовка>] –
команда формирует рамку с координатами X1, Y1 и X2, Y2.
@ <Y,Х> SAY <текст> –
команда выводит текст, начиная с координат X,Y.
Для задания цвета во всех вышеприведенных командах используется опция COLOR с указанием необходимой цветовой схемы. Причем при описании цвета необходимо указать не только цвет элемента, которого мы хотим нарисовать, но и цвет фона, на котором производится рисование (в нашем случае – белый).
В задании необходимо построить диаграмму количества товаров. Из-за недостатка места выведены не названия, а номера товаров. При этом столбец, относящийся к самому дорогому товару, нарисован красным цветом, а к самому дешевому – зеленым, о чем сказано в легенде.
Полный текст программы приведен в приложении Г, а результат работы – на рисунке 4.5.1.
Рисунок 4.5.1 – Диаграмма количества товаров.
4.6 Использование модулей (подпрограмм)
В языке FoxPro могут использоваться внешние и внутренние процедуры.
Внешняя процедура – это совокупность команд, осуществляющих обычно какие-то законченные действия по обработке данных и образующих отдельный командный файл, т. е. отдельно программу (модуль).
Обращение к процедуре выполняется командой DO:
DO <имя командного файла>
[WITH <список параметров>][IN <файл>]
В процедуру могут быть переданы и из нее получены некоторые величины, указанные в списке параметров после слова WITH. Этими величинами могут быть не только переменные и константы, но любые разрешенные выражения. В таком случае первой командой в вызываемой процедуре должна быть команда, воспринимающая их:
PARAMETERS <список параметров>
Совокупность команд, составляющих внутреннюю процедуру, должна начинаться командой
PROCEDURE <имя процедуры>
Для обозначения конца процедуры с возратом в вызывающий модуль может использоваться команда RETURN, хотя она и не обязательна.
По заданию требуется, используя модули, вывести сведения о товарах, поступивших позже 15.02.2001, а также вывести сведения о товарах, у которых единица измерения – шт.
Полный текст программы приведен в приложении Д, а результат работы – на рисунке 4.6.1.
Рисунок 4.6.1 – Результаты работы программы.
4.7 Страховое копирование данных и реализация справки
Сбой/отключение компьютера в момент исполнения операций в прикладной системе вызвать тяжёлые последствия для данных. Дабы избежать этого, можно сделать страховое копирование всех или большинства данных в самом начале работы в специальную директорию, а в самой программе предусмотреть возможность их возврата в основную директорию.
Удобным представляется поддержка в программе специальной переменной ( например, с именем NORMZ), фиксирующей нормальное /ненормальное завершение программы, а также переменной (NORMD) – даты текущего сеанса и сохранение их в специальном МЕМ-файле (NORM.MEM). Переменная NORMZ должна иметь значение `истина`, если последний сеанс работы завершился нормально, и `ложь` в противном случае. Тогда первым шагом прикладной системы должны быть считывание этого файла с диска и анализ переменной.
Фрагмент программы, реализующей страховое копирование данных, приведен ниже.
* ----Использование страхового копирования данных
SET CLEAR OFF
SET SAFETY OFF
* Если файл NORM.MEM есть...
IF FILE('C:\MY_WORKS\TRANSF~1\MYPROJ~1\norm.mem')
* ...он загружается в память.
RESTORE FROM('C:\MY_WORKS\TRANSF~1\MYPROJ~1\norm.mem')
* Если переменная завершения истинна...
IF normz
* ...копируем все файлы таблиц в страховую директорию
!COPY C:\MY_WORKS\TRANSF~1\MYPROJ~1\*.dbf C:\MY_WORKS\TRANSF~1\MYPROJ~1\Insure\*.dbf>NUL
* иначе сообщение.
ELSE
WAIT normd+' было аварийное завершение .'+;
'Восстановить (ENTER) данные?' WINDOW
* В случае нажатия Enter, файлы восстанавливаются из страховой директории.
IF LASTKEY()=13
!COPY C:\MY_WORKS\TRANSF~1\MYPROJ~1\Insure\*.dbf C:\MY_WORKS\TRANSF~1\MYPROJ~1\*.dbf>NUL
ENDIF
ENDIF
ENDIF
* Устанавливается переменная завершения, переменная текущей даты и обе запоминаются в файл.
normz= .T.
normd=DTOC( DATE( ))
SAVE ALL LIKE norm? TO C:\MY_WORKS\TRANSF~1\MYPROJ~1\norm
Здесь сначала выясняется, есть ли файл NORM.MEM в текущей директории. Если есть, файл загружается и выясняется значение переменной NORM. При NORMZ=.T. все файлы таблиц копируются в страховую поддиректорию внутри рабочей директории.
Поскольку файлов в системе обычно довольно много, проще использовать не собственные команды копирования FoxPro, а выполнить (через знак !) соответствующие команды DOS, для которых можно указать маску. Чтобы системные сообщения команд не выводились на экран, они переадресованы на пустое устройство ДОС - NUL. Если NORMZ=.F., значит, предыдущий сеанс работы завершился аварийно. На экран выдаются сообщение и запрос о необходимости восстановления данных из страховой директории (нажатием клавиши Enter). Такой запрос нужен для того, чтобы отказаться от копирования данных, если завершение программы было ненормальным, но данные, как знает пользователь, не пострадали. После завершения анализа переменной NORMZ она получает значение .F. и запоминается в файле NORM.MEM вместе с переменной NORMD. Далее идет тело собственно прикладной системы. Если при этом произойдет сбой, переменная NORMZ сохранит свое значение. При нормальном завершении программы этой переменной присваивается значение .Т. и она сохраняется в файле.
Кроме того, необходимо организовать систему контекстно-зависимой справки, вызываемой по F1. Текст помощи предварительно заносится в файл Table_Help.dbf, структура которого показана ниже.
Рисунок 4.7.1 – Таблица данных для помощи.
Для вызова процедуры помощи применена команда ON KEY LABEL. В процедуру Helper передается один параметр – имя поля исходной таблицы товаров, которое требуется пояснить. Функция VARREAD() возвращает имя переменной памяти, элемента массива или поля (прописными буквами), использованного для создания текущего элемента управления.
В процедуре осуществляется поиск по этому полю, и, если таковое найдено, соответствующее MEMO-поле выводится с помощью процедуры MESSAGEBOX.
Полный текст программы приведен в приложении Е, а пример экрана помощи, выдаваемого пользователю при нажатии клавиши F1 в тот момент, когда курсор находится в поле “Дата поступления” исходной таблицы, приведен на рисунке 4.7.2.
Рисунок 4.7.2 – Пример экрана помощи.
0 комментариев