Итак, по просьбе нашего читателя, я расскажу о работе с датой. Сегодня рассмотрим пример расчета прожитых дней. Количество дней состоит из нескольких "участков". Поясню. Например, я родился 5.июня.1981г, а сегодня 2.мая.2004г. Тогда участки будут следующие: 5-30 июня 1981г, затем с 1 июля по 31 декабря 1981, затем с 1 января 1982 по 31 декабря 2003г, затем с 1 января 2004 по 30 апреля, и с 1 по 2 мая 2004. Именно по такому алгоритму будет работать наша программа. Остальное будет понятно из комментариев к тексту программы.
Для начала создайте новый проект, на Форме1 разместите 2 Лейбла, Едит, КомбоБокс, СкроллБар, и кнопку (т.е. Button1, Edit1, ComboBox1, ScrollBar1, Label1 и Label2).
var
Form1: TForm1;
// Тут будем хранить информацию о високосных годах
VesGod: array[0..100] of Integer;
// Тут храним текущий год, меся и день
Year, Month, Day: Word;
const
// В этой константе храним названия месяцев
RMon: array[1..12] of string[8] =
('Января', 'Февраля', 'Марта', 'Апреля', 'Мая', 'Июня',
'Июля', 'Августа', 'Сентября', 'Октября', 'Ноября', 'Декабря');
// В этой константе храним количество дней в месяце,
// в зависимости то того, високосный год или нет
Days: array[Boolean, 1..12] of Byte =
((31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31));
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
// Задаем название программы(Формы)
Form1.Caption := 'Расчет прожитых дней';
// Декодируем дату в переменные
// Now - означает - сейчас
Decodedate(Now, Year, Month, Day);
// Задаем первый високосный год
VesGod[0] := 2004;
// Рассчитываем остальные високосные года
for i := 1 to 100 do
VesGod[i] := VesGod[i - 1] - 4;
// Задаем число рождения
Edit1.Text := '1';
// Года рождения задаем в интервале от 1900 до текущего (2004)
ScrollBar1.MAX := Year;
ScrollBar1.Min := 1900;
// Устанавливаем полосу прокрутки в минимальное значение (1900)
ScrollBar1.Position := ScrollBar1.Min;
// Пишем на лейбле выбранный год (1900)
Label1.Caption := IntToStr(ScrollBar1.Position);
// Очищаем выпадающий список
ComboBox1.Clear;
// Заносим в него названия месяцев
for i := 1 to 12 do
ComboBox1.Items.Add(RMon[i]);
// Ставим месяц по умолчанию - 1 (январь), в списках нумерация начинается с 0,
// поэтому первый месяц (январь) - 0
ComboBox1.ItemIndex := 0;
// Пишем название кнопки
Button1.Caption := 'Расчет';
// Так выставляется начальные значения
// в данном случае - мой День Варения
Edit1.Text := '5';
ComboBox1.ItemIndex := 5;
ScrollBar1.Position := 1981;
Label1.Caption := IntToStr(ScrollBar1.Position);
// Пишем заготовку для расчета
Label2.Caption := 'Вы прожили: 0 дней';
end;
procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
// При изменении года рождения, отображаем его в Лейбле1
Label1.Caption := IntToStr(ScrollBar1.Position);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i, j, k, m: Integer;
yer: Integer;
god: Boolean;
begin
// Заносим год рождения в переменную
yer := StrToInt(Label1.Caption);
// Переменная god - отвечает за год рождения
// god = True - високосный год,
// god = False - не високосный год.
god := False;
for j := 0 to 15 do
if yer = VesGod[j] then
god := True;
// k - количество прожитых дней
// Обнуляем
k := 0;
// Посчитаем количество полных прожитых лет,
// а в них количество прожитых дней в зависимости от типа года (високосный/нет)
for i := yer + 1 to Year - 1 do
begin
k := k + 365;
for j := 1 to 15 do
if i = VesGod[j] then
k := k + 1;
end;
// Посчитаем количество прожитых дней в год рождения
for i := ComboBox1.ItemIndex + 2 to 12 do
k := k + Days[god, i];
// Прибавим количество прожитых дней в месяц рождения
k := k + (Days[god, ComboBox1.ItemIndex + 1] - StrToInt(Edit1.Text));
// Теперь считаем дни, прожитые в текущем году
// Узнаем, високосный щас год или нет
god := False;
for j := 0 to 15 do
if Year = VesGod[j] then
god := True;
// m - кол-во полных прожитых месяцев в этом году
m := Month - 1;
// Посчитаем сколько это дней
for i := 1 to Month - 1 do
k := k + Days[god, i];
// Количество прожитых дней в текущем месяце
for i := 1 to Day do
k := k + 1;
// Выводим результат расчета
Label2.Caption := 'Вы прожили: ' + IntToStr(k) + ' дней';
end;
end.
На сегодня это все. Пока!
Тексты всех предыдущих уроков и самих исходников
можно скачать с http://mywap-f1.h12.ru
Если у Вас возникли вопросы, идеи, предложения или какие-либо мысли, пишите, не стесняйтесь!