| for j:=1 to i do
| WriteLn( EnvStr( j ) ); {их вывод на экран }
| END;
| BEGIN
| ShowSET; { запуск процедуры }
| ReadLn { пауза до нажатия клавиши ввода }
| END.
Рис. 16.2
Последняя функция GetEnv позволяет получить значение системной переменной по ее имени. Многие пакеты программ (Турбо Паскаль в том числе) при работе опрашивают системные переменные, в которых должны быть записаны рабочие каталоги, настроечные параметры и т.п. Если они отсутствуют, то принимаются какие-либо значения по умолчанию. На Турбо Паскале можно легко программировать подобные действия. Например, если нужно, чтобы
- 349 -
готовая программа работала только на ПЭВМ ее автора, достаточно вставить в текст строку
USES DOS; { подключен модуль DOS }
...
{определение переменных, типов, процедур }
BEGIN
{==> } if GetEnv( 'AVTOR' ) <> 'IVANOV' then Halt;
{ остальная программа }
END.
А в файл AUTOEXEC.BAT внести команду
AUTOEXEC.BAT
ECHO OFF
PATH ...
...
SET AVTOR=IVANOV <===
...
Программа будет работать только, если в системе определена переменная AVTOR со значением IVANOV.
Этот нехитрый способ, конечно, не годится для засекречивания коммерческих программ, но для «домашнего» пользования вполне достаточен.
Средства языка Турбо Паскаль не позволяют менять значения системных переменных или вводить их. Это связано с тем, что после завершения конфигурации среды MS-DOS ее последующая модификация весьма ограничена.
Напомним, что для увеличения области памяти под системные переменные надо вставить в файл CONFIG.SYS корневого каталога строку
SHELL = d:\путь\COMMAND.COM /р /e:NNNN
где NNNN — число байтов для области памяти системных переменных.
16.2. Работа с часами и календарем
Модуль DOS представляет как бы два набора процедур: один — для работы со встроенными часами и календарем, а второй — для ведения дат и времени создания файлов (табл. 16.2).
- 350 -
Процедура | Действие |
GetDate(VAR Year, Month, Day, DW : Word) SetDate(Year, Month, Day: Word) | Считывает год, месяц, число и день во встроенных часах ПЭВМ Устанавливает год, месяц, число во встроенных часах |
GetTime(VAR Hour, Min, Sec, Sec100 : Word) SetTime(Hour, Min, Sec, Sec100 : Word) | Считывает текущее время по встроенным часам ПЭВМ Устанавливает новое время во встроенных часах ПЭВМ |
PachTime(VAR DT : DataTime; VAR T : LongInt) UnPachTime(T : LongInt; VAR DT : DataTime; ) | Создает компактную запись даты и времени для назначения ее файлу Распаковывает запись даты и времени, считанную в файле |
GetFTime(VAR f; VAR T : LongInt) SetFTime(VAR f; VAR T : LongInt) | Считывает компактную запись даты и времени для открытого файла f Записывает компактную запись даты и времени для открытого файла f |
16.2.1. Опрос и назначение даты
Для опроса или замены даты, имеющейся во встроенных часах ПЭВМ, используются процедуры GetDate и SetDate. Процедура GetDate возвращает в своих переменных значения года, месяца, числа и номера дня в неделе. Процедура SetDate, наоборот, устанавливает значения года, месяца и числа в часах. Заметим, что SetDate не нужен номер дня недели. Он вычисляется автоматически при вызове процедуры GetDate.
Существуют ограничения на вводимые значения даты. Так, год при установке должен быть в диапазоне 1980...2099, месяц — 1...12, число — 1...31. При нарушении диапазонов вызов процедуры SetDate игнорируется. Кроме употребления процедур GetDate/SetDate по непосредственному назначению, их можно использовать для определения дня недели любого числа в месяце до 2099 года. Как это сделать, рассмотрено в примере на рис. 16.3.
- 351 -
| { ДЕМОНСТРАЦИЯ ОПРЕДЕЛЕНИЯ ДНЯ НЕДЕЛИ ПО ДАТЕ }
| USES DOS;
| TYPE
| DayString = String[11];
| CONST
| Days : Array [1..7] of DayString = { дни недели }
| ( 'Понедельник', 'Вторник , 'Среда', 'Четверг',
| 'Пятница', 'Суббота', 'Воскресенье' );
| { Функция возвращает название дня недели по дате.}