Ниже приведена программа, которая при каждом запуске показывает у кого из моих друзей День Рождения и когда.
Создаем таблицу, например 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() после модификации записей в базе данных.
|