De nombreuses personnes ont déjà posé cette question sur CSDN, mais personne ne semble avoir donné de réponse satisfaisante. Il m'a fallu beaucoup de temps pour trouver la réponse, et maintenant je la partage avec vous :
PRocedureTForm1.FormCreate(Expéditeur:TObject);
var
NouveauField : TField ;
je:entier;
commencer
//Il y a deux champs dans la table, SName et Birth. Maintenant, nous générons dynamiquement un champ calculé Age pour afficher l'âge.
NewField:=TStringField.Create(ADOTable);
//Créer un champ de type TStringField
ADOTable.Fermer ;
fori:=0toADOTable.Fields.Count-1do
ADOTable.Fields[0].Free;//Libérer tous les champs statiques
fori:=0toADOTable.FieldDefs.Count-1do
ADOTable.FieldDefs.Items[i].CreateField(ADOTable);
// Générer dynamiquement des champs statiques basés sur les informations de champ de FieldDefs
NewField.Size:=5;
NewField.FieldName:='Âge';
NewField.FieldKind:=fkCalculated;
//Définit ce champ comme champ calculé
NewField.DataSet:=ADOTable;
//Ajouter ce champ à ADOTable
ADOTable.Open;
fin;
procédureTForm1.ADOTableCalcFields(DataSet:TDataSet);
var
AA1, AA2, MM, JJ : Mot ;
TmpDate : TDate ;
commencer
DecodeDate(Date,AA1,MM,JJ);
TmpDate:=DataSet.FieldByName('Birth').AsDateTime;
DecodeDate(TmpDate,AA2,MM,JJ);
DataSet.FieldByName('Age').AsString:=IntToStr(YY1-YY2)+'year';
//Afficher l'âge dans OnCalField
fin;
Ce qui précède est ce que j'ai écrit en utilisant ADO. Au début, je l'ai écrit en utilisant BDE, et ça a quand même réussi.
Blog de l'auteur : http://blog.csdn.net/blazingfire/