Карта сайтаСсылкиКонтакты

Сколько дней до следующего Дня Рождения моего друга

PDF Печать
Статьи

Ниже приведена программа, которая при каждом запуске показывает у кого из моих друзей День Рождения и когда.

Создаем таблицу, например MyBirthday.db с такими полями:


  Nbr       +       * 
  BirthDay  D         // (например, 07.09.2001)
  Age       S         // (например, 30)
  Day       A 2       // (например, Пн, Вт,...)
  BirthDate D         // (например, 07.09.1971)
  FirstName A 30
  //....

Поместим на форму Form1:

  • объект Table по имени BirthDay
  • DataSource по имени DataSource1
  • DBGrid по имени DBGrid1

Для других стран Вы можете изменить имена дней в массиве Day.


const days: array[1..7] of string = 
  ('Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'); 

// Создаем вторичные индексы для сортировки даты
procedure TForm1.FormCreate(Sender: TObject);
begin
  // ....
  CreateSX(GebTg, 'BirthDay');
  CreateSX(GebTg, 'BirthDate');
  // ....
end;

// Открыть таблицу и вычислить новые BirthDays
procedure TForm1.FormShow(Sender: TObject);
begin
  //  ...
  BirthDay.open;
  BirthDays;
end;

// Получить имя дня недели
function TForm1.DOF(aDate: TDateTime): string;
begin
  result := days[DayOfWeek(aDate)];
end;

// Вычислить все новые дни рождения
procedure TForm1.BirthDays;
var
  gDate, gYear, gMonth, gDay, hYear, hMonth, hDay: TDateTime;
begin
  with BirthDay do begin
    first;
    DisableControls;
    while not eof do begin
      edit;
      if not (FieldByName('BirthDate').isNull) then begin // BirthDate существует
        gDate := BirthDay['BirthDate'];
        // Декодировать BirthDate и текущую дату
        DecodeDate(gDate, gYear, gMonth, gDay);
        DecodeDate(now, hYear, hMonth, hDay);
        // Вычислить дату рождения, используя текущий год
        //   плюс месяц и день из BirthDate
        BirthDay['Day'] := EncodeDate(hYear, gMonth, gDay);
        // Вычислить возраст от текущего года минус год рождения
        BirthDay['Age'] := hYear - gYear;
        // вычислить имя дня
        BirthDay['Day'] := DOF(BirthDay['BirthDay']);
      end else
        // Нет дня рождения - установить значение в null
        BirthDay['BirthDay'] := Null;
      next;
    end;
    First;
    EnableControls;
    IXField := 'BirthDay';
    // сортировать сетку по дням рождения
    DBGrid1Sort(BirthDay, 'BirthDay');
    // Позиция на следующий день рождения после сегодня
    BirthDay.FindNearest([Now]);
    // Установить фокус на поле firstname
    DBGrid1.setfocus;
    DBGrid1.SelectedField := BirthDay.FieldByName('FirstName');
  end;
end;

Вы можете разместить кнопку на Form1, чтобы вызывать процедуру BirthDays() после модификации записей в базе данных.


 

Добавить комментарий


Защитный код
Обновить