Средства работы с системными переменными MS-DOS реализованы в модуле DOS функциями EnvCount, EnvStr и GetEnv. Системные переменные (не путать с параметрами!) MS-DOS — это их имена и значения, заданные пользователем командой SET (как правило, в файле AUTOEXEC.BAT) и командами PATH и PROMPT. {347} Задавая системную переменную, всегда надо писать ее имя и значение (может быть пустым), например:
.ВАТ-ФАЙЛ PROMPT $p$g SET LIB=C:\BIN\LIB SET COMSPEC=E:\COMMAND.COM |
Работая в MS-DOS, можно подать команду SET без параметров и увидеть текущие системные переменные и их значения. Причем, даже если не было подано ни одной команды «SET имя = значение» до этого, будут определены две системные переменные: PATH и COMSPEC. Они вводятся автоматически при загрузке системы. Параметр PROMPT должен быть задан явно. Остальные переменные «придумываются» самим пользователем.
Функция EnvCount типа Integer возвращает число определенных в MS-DOS переменных, а функция EnvStr возвращает строку в виде «имя = значение». С их помощью легко построить процедуру, аналогичную по действию команде SET без параметров в MS-DOS (рис. 16.2):
USES DOS; PROCEDURE ShowSET; { показ системных переменных } VAR i,j: Integer; BEGIN i:= EnvCount; { число переменных } for j:=1 to i do WriteLn(EnvStr(j)); {их вывод на экран } END; BEGIN ShowSET; { запуск процедуры } ReadLn { пауза до нажатия клавиши ввода } END. |
Рис. 16.2
Последняя функция GetEnv позволяет получить значение системной переменной по ее имени. Многие пакеты программ (Турбо Паскаль в том числе) при работе опрашивают системные переменные, в которых должны быть записаны рабочие каталоги, настроечные параметры и т.п. Если они отсутствуют, то принимаются какие-либо значения по умолчанию. На Турбо Паскале можно легко программировать подобные действия. Например, если нужно, чтобы {348} готовая программа работала только на ПЭВМ ее автора, достаточно вставить в текст строку
|
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 — число байтов для области памяти системных переменных.
Работа с часами и календарем
Модуль DOS представляет как бы два набора процедур: один — для работы со встроенными часами и календарем, а второй — для ведения дат и времени создания файлов (табл. 16.2). {349}
Таблица 16.2
Процедура | Действие |
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) | Считывает текущее время по встроенным часам ПЭВМ Устанавливает новое время во встроенных часах ПЭВМ |
PackTime(VAR DT: DateTime; VAR T: LongInt) UnPackTime(T: LongInt; VAR DT: DateTime) | Создает компактную запись даты и времени для назначения ее файлу Распаковывает запись даты и времени, считанную в файле |
GetFTime(VAR f; VAR T: LongInt) SetFTime(VAR f; T: LongInt) | Считывает компактную запись даты и времени для открытого файла f Записывает компактную запись даты и времени для открытого файла f |
Опрос и назначение даты
|
Для опроса или замены даты, имеющейся во встроенных часах ПЭВМ, используются процедуры GetDate и SetDate. Процедура GetDate возвращает в своих переменных значения года, месяца, числа и номера дня в неделе. Процедура SetDate, наоборот, устанавливает значения года, месяца и числа в часах. Заметим, что SetDate не нужен номер дня недели. Он вычисляется автоматически при вызове процедуры GetDate.
Существуют ограничения на вводимые значения даты. Так, год при установке должен быть в диапазоне 1980...2099, месяц — 1...12, число — 1...31. При нарушении диапазонов вызов процедуры SetDate игнорируется. Кроме употребления процедур GetDate/SetDate по непосредственному назначению, их можно использовать для определения дня недели любого числа в месяце до 2099 года. Как это сделать, рассмотрено в примере на рис. 16.3. {350}
{ДЕМОНСТРАЦИЯ ОПРЕДЕЛЕНИЯ ДНЯ НЕДЕЛИ ПО ДАТЕ } USES DOS; TYPE DayString = String[11]; CONST Days: Array [1..7] of DayString = { дни недели } ('Понедельник', 'Вторник, 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье'); { Функция возвращает название дня недели по дате.} FUNCTION WhatDay(Year, Month, Day: Word): DayString; VAR Y, M, D, n: Word; BEGIN GetDate(Y, M, D, n); { запоминание текущей даты } SetDate(Year,Month,Day); { установка даты из запроса } GetDate(Year,Month,Day,n); {получение по ней номера n } WhatDay:= Days[n]; { номер n дает название дня } SetDate(Y, M, D) { восстановление даты в ПЭВМ } END; VAR { -- ПРИМЕР ВЫЗОВА -- } у, m, d: Word; BEGIN Write('Введите год '); ReadLn(у); Write('Введите месяц'); ReadLn(m); Write('Введите число'); ReadLn(d); WriteLn; WriteLn(d:2,'/', m:1,'/',y:4,'-->',WhatDay(y,m,d)); ReadLn { пауза до нажатия клавиши ввода } END. |
Рис. 16.3
|
16.2.2. Опрос и назначение времени
Процедуры GetTime(VAR Hour, Min, Sec, Sec100: Word) и SetTime(Hour, Min, Sec, Sec100: Word) опрашивают и устанавливают значение текущего времени во встроенных часах ПЭВМ. Обе процедуры используют одинаковую последовательность параметров:
(часы, минуты, секунды, миллисекунды)
При установке времени процедурой SetTime их можно задавать непосредственно значениями. Разрешенные значения для установки времени таковы: часы — 0...23, минуты и секунды — 0...59, миллисекунды — 0...99. При нарушении диапазонов время не устанавливается. {351}
Неаккуратное использование процедуры SetTime может сильно изменить представление компьютера о времени, зато процедура GetTime вполне безопасна. С ее помощью можно сделать счетчик времени работы программы. Схема включения процедур в программу приводится на рис. 16.4.
USES DOS; VAR h, min, s, ms: Word; { отсечки времени по часам } Time: Real; { время работы в секундах } BEGIN GetTime(h, min, s, ms); { начало работы программы } { время начала программы в секундах: } Time:= (h*60 + min)*60 + s + ms/100; { === программа работает - время идет === } Write(' Нажмите ENTER'); ReadLn; GetTime(h, min, s, ms); { конец работы программы } { время работы программы в секундах: } Time:= (h*60 + min)*60 + s + ms/100 - Time; ms:= Trunc(100 * Frac(Time)); { миллисекунды } h:= Trunc(Time) div 3600; { часы } min:= Trunc(Time-3600*h) div 60; { минуты } s:= Trunc(Time-3600*h) mod 60: { секунды } WriteLn('Активное время работы, h:1,' ч ', min:1, ' мин ', s:1, ',', ms:1, ' с'); ReadLn { пауза... } END. |
Рис. 16.4