Суббота, 27.04.2024, 11:16

Delphi

Приветствую Вас Гость

Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня были:
Самые активные пользователи

Меню сайта
Категории каталога
Основы [8]
Исходники [2]
Наш опрос
Вы программируете на Delphi
Всего ответов: 180
Главная » Статьи » MIDletPascal » Основы

Разбираемся с датой и временем.
Ну вот и настало время разобраться с датой и временем на языке МидлетПаскаль. Для чего это нужно? Ну хотя бы для того, чтоб твоя прога знала который сейчас час и какой год? Вдруг прохожий спросит, а ты ему свою прогу засветишь! :) А вообще дата и время очень часто нужны. Например, если ты читал предыдущие статьи, то ты умеешь работать с ресурсами и музыкой, теперь ты узнаешь работу с датой и временем. Вот уже основа для написания своего будильника. Очень часто в играх приходится работать с временем, определять промежутки между какими-то событиями и, отталкиваясь от этой разницы, прога реагирует.
Ну хватит разговоров, давай кодить! Создовай новый проект, сразу вводи две переменные типа integer, три текстовые переменные (string), и один массив строковых переменных (array [1..7] of string Здесь массив из семи чисел, для определения дня недели.). Я их назвал так : числовые - Time, DayOfWeek, текстовые - DateText, TimeText, DayText и массив - week. Из этих имён можно понять, для чего они предназначены - для хранения даты, времени, текста и др.
Теперь переходи в тело программы и присваивай переменной Time функцию GetCurrentTime. Эта функция возвращает текущее время в течение секунд с полуночи первого января 1970. Возвращанная величина ( время в секундах), может быть использована как аргумент для вызова других функций по определению месяца, дня, минут и прочего. Про эти функции мы поговорим ниже.
Итак, мы получили текущее время, это, как оказалось, ключ ко всем другим значениям. Теперь давай определимся каким образом прога будет оповещать нас. Ну я не стал заморачиваться и просто выводил текст функцией DrawText. А текст будет такой : Дата - ...дальше идёт дата...
Время - ...дальше идёт время...
День недели - ...дальше идёт день недели...
Тепрерь надо получить текущую дату, а делается это вот так:

DateText :='Дата - ' + GetDay(Time);
DateText :=DateText + ':' + GetMonth(Time);
DateText :=DateText + ':' + GetYear(Time);

Первой строкой мы присваиваем текстовой переменной DateText слово Дата - и добовляем текущий день месяца функцией GetDay(Time). В качестве единственного параметра мы указываем значение переменной Time, полученное ранее. Эта переменная содержит текущее время, и оттталкиваясь от него функция GetDay(Time) выдаёт нам номер дня в месяце, значение колеблется от 1 до 31 (как в нормальных месецах :) ). Следующими двумя строками добовляем к переменной DateText значение месяца и года функциями GetMonth(Time) и GetYear(Time) соответственно. Функции эти идентичны GetDay(Time), только значения возвращают другие. Ну а в качестве разделителя между днём, месецем и годом используем знак двоеточия ":"
Теперь займёмся текущим временем :


TimeText := 'Время - ' + GetHour(Time);
TimeText := TimeText + ':'+ GetMinute(Time);
TimeText := TimeText + ':' + GetSecond(Time);

Здесь всё тоже самое, только работа идёт с минутами, часами и секундами. Думаю, ты разберёшься здесь и без моих слов. Перейдём сразу к определению текущего дня недели:


Week[1]:='Воскресенье';
Week[2]:='Понедельник';
Week[3]:='Вторник';
Week[4]:='Среда';
Week[5]:='Четверг';
Week[6]:='Пятница';
Week[7]:='Суббота';
DayOfWeek:=GetWeekDay(Time);
DayText:='День недели - ' + Week[DayOfWeek];

Здесь каждому значению массива присваиваем определённое значение, у нас это название дней недели. Потом, строкой DayOfWeek:=GetWeekDay(Time); , получаем и записываем в числовую переменную номер дня недели. Только функция это европейская, так что и начинается отсчёт дней по европейски с воскресенья, т.е. значение 1 будет означать "воскресенье", а не "понедельник". Ну а дальше записываем в текстовую пременную наш текущий день недели.
И в конце пиши вот это:


DrawText(DateText,5,0);
DrawText(TimeText,5,15);
DrawText(DayText,5,30);
Repaint;
Delay(10000);

Ну здесь ты и сам всё знаешь : выводим наш текст, перерисовываемся и делаем задержку. Вот и наш сегодняшний пример готов. Исходники забирай здесь. Только я ещё должен хоть немного сказать про таймер, ведь он так нужен для игр. Вот эта функция - function GetRelativeTimeMs: integer; Возвращает она текущее время в течение миллисекунд. Каждые 48 дней, эта величина восстанавливается и начинает считаются с 0. Не используй эту функцию, чтобы определять текущую дату, а используй для осуществления таймеров в приложении. Давай рассмотрим эту функцию на примере игры Tetris. Каждую секунду игра должна перемещать блок вниз или, если пользователь нажал кнопочки, вправо и влево. Вот примерный алгоритм:


...
SavedTime := GetRelativeTimeMs; //инициализация таймера
repeat
{ отслежка клавиатуры }
key := GetKeyClicked;
if KeyToAction(key) = GA_LEFT then moveLeft;//если нажали влево, то двигаем влево
if KeyToAction(key) = GA_RIGHT then moveRight;//если нажали вправо, то двигаем вправо

{ проверяем, не прошла ли секунда }
if ((GetRelativeTimeMs - SavedTime) > 1000)
or (GetRelativeTimeMs < SavedTime) { учитываем, что таймер сбросится через 48 дней }
then
begin
SavedTime := GetRelativeTimeMs;
moveDown; //если ничего не нажали, то двигаемся вниз
end;
until gameOver;//конец игре :)
...


Это очень простой алгоритм, показывающий основы использования таймера. Объяснять я его не буду, из коментариев и так всё понятно. Надеюсь материал тебе понравился. Остальное позже...









Взято с сайта http://www.liveofpc.3dn.ru/

Категория: Основы | Добавил: Ivin (22.03.2008)
Просмотров: 2812 | Рейтинг: 5.0/1 |