Berechnete Felder sind ja readonly, bei manchen Datasets kann man das überschreiben oder direkt berechnete Felder einfügen, deren Schreibschutz man entfernt, auf Feld.SetText kann entsprechend reagiert werden.
Der einfachere Ansatz wäre die Daten in ein Clientdataset zu kopieren, dem die benötigten Spalten bereits hinzugefügt wurden und dieses für die Darstellung zu verwenden.
Ich hatte etwas derartiges mal gekapselt ....
Delphi-Quellcode:
type
TMyFieldDef=Record
Name:String;
Size:Integer;
DataType:TFieldType;
end;
TFieldDefArray = array of TMyFieldDef;
Delphi-Quellcode:
function GetClientDSForDS (ADataSet: TDataSet; AFieldDefArray: TFieldDefArray; AClientDataSet: TClientDataSet=nil): TClientDataSet;
var
i: integer;
Function NoAutoInc(ft:TFieldType):TFieldType;
begin
if ft=ftAutoInc then Result := ftInteger else Result := ft;
end;
begin
if Assigned(AClientDataSet) then
Result := AClientDataSet
else
result := TClientDataSet.Create(nil);
Result.Close;
Result.FieldDefs.Clear;
for I := 0 to ADataSet.FieldCount-1 do
begin
Result.FieldDefs.Add(ADataSet.Fields[I].FieldName, NoAutoInc(ADataSet.Fields[I].DataType), ADataSet.Fields[I].Size);
end;
for I := 0 to High(AFieldDefArray)do
result.FieldDefs.Add(AFieldDefArray[I].Name, AFieldDefArray[I].DataType, AFieldDefArray[I].Size);
Result.CreateDataSet;
ADataSet.First;
while not ADataSet.Eof do
begin
Result.Append;
for I := 0 to ADataSet.FieldCount-1 do
begin
result.FieldByName(ADataSet.Fields[I].FieldName).Assign(Adataset.Fields[i]);
end;
Result.Post;
ADataSet.Next;
end;
end;