"ПРОБЛЕМА ВВОДА 2000 ГОДА
В КОМПЬЮТЕР С УСТАРЕВШЕЙ
ВЕРСИЕЙ BIOS"

Главная \ Радиолюбительский софт \ Разное\


О. ЖЛУТКО, пос. Керчевский Пермской обл.

Журнал "Радио" №2 2001г.

Под таким заголовком в "Радио" были опубликованы небольшие заметки, посвященные корректному формированию системной даты на IBM PC, у которых установлена BIOS ранних версий. Вниманию читателей предлагается еще один вариант подобной программы. Основное ее отличие от ранее описанных состоит в том, что нет необходимости ежегодно изменять какиелибо параметры или вводить какую-либо информацию, коррекция даты происходит автоматически.

С подобной проблемой столкнулся и автор. В компьютере с материнской платой TOMATO BOARD и BIOS AWARD версии 1996 г. при включении питания выводился 1996 г. После загрузки WINDOWS он интерпретировался в 2096 г.
Странным показалась не сама проблема перехода на 2000 г., а то, что она проявилась на сравнительно новом компьютере (машины гораздо более старшие вошли в 2000 г. без проблем).
Вообще-то в CMOS поле ввода года —четыре знака. Можно предположить, что в этой ситуации виноват не BIOS вполне уважаемой фирмы, а производители материнской платы, установившие в свое изделие устаревшие системные часы. Однако проблема оставалась, и ее как-то нужно было решать.

Первым побуждением, как и у И. Осипова, был ввод в autoexec.bat строки с запросом новой системной даты. Но мелкий текст на черном фоне и необходимость вводить дату в определенном формате вызывали у пользователей определенные трудности (как это ни покажется странным), и от этого способа пришлось отказаться.

Следующий шаг — создание программы с красивым ярким окном, где запрашивался текущий год в формате четырех цифр. Эта программа также вызывалась из autoexec.bat при начальной загрузке. В ней был организован простейший контроль вводимой информации, и она позволяла в будущем перейти на новый 2001 г. самим пользователям.

Однако постоянный ввод какой-либо информации при старте создает некоторые неудобства, заставляя находиться рядом с компьютером. Следует отметить, что загрузка WINDOWS 95 на PC486DX4-100 — процесс весьма долгий, как, впрочем, и любой другой современной ОС.

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

Она названа New_Date и написана на Foxpro 2.5, хотя без проблем ее можно перевести на любой язык программирования высокого уровня. Выбор именно Foxpro вызван развитостью функций работы с датой. Исходный текст программы приведен в таблице.

Некоторые пояснения для тех, кто плохо знаком с Foxpro и подобными системами управления базами данных (СУБД).

Сначала необходимо средствами Foxpro создать файл New_Date.dat. Это обычный DBF-файл, содержащий всего одно текстовое (character) поле New_Date длиной десять символов. Использование текстового поля для хранения даты требует применения функций преобразования, однако позволяет вводить информацию в него не только средствами СУБД, но и другими. Например, оболочка "DOS Навигатор" позволяет вводить данные в числовые и текстовые ноля DBF-файлов. К тому же в стандартном поле DATA год хранится в двузначном формате, что не очень информативно. Впрочем, сама программа может работать и с полем DATA,
что не будет ошибкой и исключит применение в дальнейшем функции CTODO.

********* Программа проверки и установки системной даты*********
CLEAR && Очищаем экран
SET DATE GERMAN && Устанавливаем формат даты ДД.ММ.ГГ на Новый год
SET CENTURY ON && Устанавливаем число знаков в интерпретации
&& года; "ON" - Foxpro работает с 4 знаками
&& Определяем переменные
PUBLIC old_mes, old_god, new_day, new_mes, new_god, new_date
&& old_mes, old_god - сохраненные в БД месяц и год
&& new_day, new_mes, new_god - новые значения числа, месяца, года
&& new_dale - новая дата в текстовом формате
&& И присваиваем им начальные значения
STORE 0 ТО old_mes, old_god
STORE "" ТО new_day, new_mes, new_god, new_date
USE old_date.dat && Загружаем базу данных, содержащую дату
&& последней загрузки системы
oM_mes = MONTH(CTOD(old_date.old_date)) && Выделяем и запоминаем
&& месяц из сохраненной даты
old_god = YEAR(CTOD<old_date.old_date)) && Выделяем и запоминаем произошло
&& год из сохраненной даты
&& Проверка на "Новый год"
IF MONTH(DATE()) < old_me«
old_god = old_god + 1
ENDIF
&& Формируем новую системную дату.
new_day = ALLTRIM(STR(DAY(DATE()))) && Формируем число
IF LEN(new_day) < 2
new_day = "О" * new_day && Преобразуем его до 2 знаков
ENDIF
new_mes = ALLTRIM(STR(MONTH(DATE()))» && Формируем месяц
IF LEN(new_me») < 2
new_mes = "О" + new_mes && Преобразуем его до 2 знаков
ENDIF
new_god = ALLTRIM(STR(old_god))    && Формируем год
&& запоминаем новую дату в базе данных и в переменной new_date
REPLACE old_date.old_date WITH (new_day *"." + new_mes + "." * new_god)
new_date = old_date.old_date
USE && Закрываем файл БД
I date &new_date && Устанавливаем новую дату средствами ОС
CLEAR && Очищаем экран
QUIT && Окончание программы


Дату можно хранить и в MEM файле как переменную, и в текстовом файле. В последнем случае необходимо пользоваться операторами FOPEN(), FCLOSEO, FPUT(), FGET(). Перед первым запуском программы необходимо вручную занести в поле базы данных (БД) текущую дату в формате ДД.ММ.ГГГГ (точки-разделители обязательны).

В самом начале программы настраивается среда Foxpro:

SET DATE GERMAN приводит формат даты к привычному видуДД.ММ.ГГ;

SET CENTURY ON "заставляет" Foxpro обрабатывать год в формате четырех цифр. Введение команды является обязательным, иначе программа работать не будет. Далее из сохраненной даты выделяют месяц и год и записывают в переменных. То же происходит и с системной датой, только запоминают число и месяц. При проверке на "Новый год" сравнивают сохраненный месяц, выделенный из системной даты. Если сохраненный месяц больше системного, значение года увеличивают на 1.

Например, последний раз компьютер включали 25.12.2000 г., а текущее включение произошло 15.01.2001 г. Тогда сохраненный месяц (12) — больше текущего (1) и к сохраненному году (2000) добавляют 1. Во всех других случаях значение года сохраненной даты используют для формирования новой системной. Затем вновь сформированную системную дату записывают в файл БД.

Foxpro не имеет собственных возможностей установки системной даты и времени, поэтому для обновления даты воспользуемся средствами ОС с функцией подстановки. Следует помнить, что для подстановки в команду DATE ОС требуется только текстовая строка, иначе будет выведено сообщение об ошибке!

Конечно, эту программу можно "перекроить" в зависимости от собственного стиля программирования. Ее текст приведен лишь как иллюстрация к алгоритму организации в компьютере второго календаря с автоматической сменой года.

 

На главную

Hosted by uCoz