Вызовите диалог редактирования полей (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;
|
|