Viele Leute haben diese Frage schon einmal auf CSDN gestellt, aber niemand scheint eine zufriedenstellende Antwort gegeben zu haben. Es hat lange gedauert, bis ich die Antwort gefunden habe, und jetzt teile ich sie mit Ihnen:
PROcedureTForm1.FormCreate(Sender:TObject);
var
NewField:TField;
i:Ganzzahl;
beginnen
//Es gibt zwei Felder in der Tabelle, SName und Geburt. Jetzt generieren wir dynamisch ein berechnetes Feld Alter, um das Alter anzuzeigen.
NewField:=TStringField.Create(ADOTable);
//Erstelle ein Feld vom Typ TStringField
ADOTable.Close;
fori:=0toADOTable.Fields.Count-1do
ADOTable.Fields[0].Free;//Alle statischen Felder freigeben
fori:=0toADOTable.FieldDefs.Count-1do
ADOTable.FieldDefs.Items[i].CreateField(ADOTable);
// Statische Felder basierend auf den Feldinformationen von FieldDefs dynamisch generieren
NewField.Size:=5;
NewField.FieldName:='Alter';
NewField.FieldKind:=fkCalculated;
//Dieses Feld als berechnetes Feld festlegen
NewField.DataSet:=ADOTable;
//Dieses Feld zu ADOTable hinzufügen
ADOTable.Open;
Ende;
procedureTForm1.ADOTableCalcFields(DataSet:TDataSet);
var
JJ1,JJ2,MM,TT:Wort;
TmpDate:TDate;
beginnen
DecodeDate(Datum,JJ1,MM,TT);
TmpDate:=DataSet.FieldByName('Birth').AsDateTime;
DecodeDate(TmpDate,YY2,MM,DD);
DataSet.FieldByName('Age').AsString:=IntToStr(YY1-YY2)+'year';
//Alter in OnCalField anzeigen
Ende;
Das Obige habe ich mit ADO geschrieben. Zuerst habe ich es mit BDE geschrieben und es hat trotzdem funktioniert.
Blog des Autors: http://blog.csdn.net/blazingfire/