Вызовите диалог редактирования полей (Fields Editor), дважды щелкнув на
компоненте TTable или TQuery, расположенном на вашей форме (или выбрав в
контекстном меню пункт Fields Editor). Добавьте все поля, с которыми вы хотите
работать в форме (даже если вы хотите, чтобы они были невидимы, но вам необходим
к ним доступ -- для таких полей установите свойство visible в false). Затем
щелкните на "Define..." (определить) для добавления вычисляемого поля. Введите
имя вычисляемого поля, отличающееся от имен других полей таблицы, выберите тип
(вероятно, StringField) и задайте длину (20 будет в самый раз). Убедитесь в том,
что напротив поля 'calculated' стоит галочка. Затем создайте для вашего объекта
TTable или TQuery обработчик события 'OnCalcFields'. В этом обработчике вы
берете значения реальных полей таблицы, делаете вычисления, и помещаете
результаты в объект вычисляемого поля, который вы только что создали. После
этого значение выводится в TDBGrid, или в элементе управления TDBText, если вы
решили использовать форму вместо табличной сетки.
Наша функция должна достичь цели, обрабатывая значения лет и месяцев.
Поскольку не все месяцы имеют одно и то же количество дней, я просто брал
среднее число, поэтому результат может быть не очень точен, но большинство людей
это удовлетворяет:
|
|
function
AgeStr(aDate: TDateTime): string; var
DaysOld : Double;
Years,
Months : Integer; begin
DaysOld := Date - aDate;
Years := Trunc(DaysOld / 365.25);
DaysOld := DaysOld - (365.25 *
Years);
Months := Trunc(DaysOld / 30.41);
Result := Format('%d лет, %d
месяцев',[Years, Months]); end;
|
В моем случае метод OnCalcFields выглядит так:
|
|
procedure
TEntryForm.TableNameOrderCalcFields(DataSet: TDataset); begin
TableNameOrderAge.AsString :=
AgeStr(TableNameOrderDateOfBirth.AsDateTime); end; | |