Muitas pessoas já fizeram esta pergunta na CSDN antes, mas ninguém parece ter dado uma resposta satisfatória. Levei muito tempo para encontrar a resposta e agora compartilho com vocês:
PRocedureTForm1.FormCreate(Sender:TObject);
var
NovoCampo:TField;
eu: inteiro;
começar
//Existem dois campos na tabela, SName e Nascimento. Agora geramos dinamicamente um campo calculado Idade para exibir a idade.
NovoCampo:=TStringField.Create(ADOTable);
//Cria um campo do tipo TStringField
ADOTable.Close;
fori:=0toADOTable.Fields.Count-1do
ADOTable.Fields[0].Free;//Libera todos os campos estáticos
fori:=0toADOTable.FieldDefs.Count-1do
ADOTable.FieldDefs.Items[i].CreateField(ADOTable);
//Gera dinamicamente campos estáticos com base nas informações de campo de FieldDefs
NovoCampo.Size:=5;
NewField.FieldName:='Idade';
NewField.FieldKind:=fkCalculado;
//Define este campo como um campo calculado
NewField.DataSet:=ADOTable;
//Adiciona este campo ao ADOTable
ADOTable.Open;
fim;
procedimentoTForm1.ADOTableCalcFields(DataSet:TDataSet);
var
AA1, AA2, MM, DD: Palavra;
DataTmp:TDate;
começar
DataDecodificação(Data,AA1,MM,DD);
TmpDate:=DataSet.FieldByName('Nascimento').AsDateTime;
DataDecodificação(DataTmp,AA2,MM,DD);
DataSet.FieldByName('Idade').AsString:=IntToStr(YY1-YY2)+'ano';
//Mostra a idade no OnCalField
fim;
O acima é o que escrevi usando ADO. No começo eu escrevi usando BDE e ainda assim passou.
Blog do autor: http://blog.csdn.net/blazingfire/