Tendrías que mostrarnos cómo estás añadiendo los campos y en qué momento. Tal como dije antes, el ejemplo que puse funciona correctamente y con un campo calculado. Acabo de adaptarlo a un query a la base DBDEMOS con la consulta
El código queda así:
Código Delphi
[-]
procedure TForm1.Button1Click(Sender: TObject);
var
NewField: TStringField;
I: Integer;
begin
if Query1.FieldDefs.Count = 0 then
Query1.Open;
Query1.Close;
for I := 0 to Query1.FieldDefs.Count - 1 do
Query1.FieldDefs[i].CreateField(Query1, nil, Query1.FieldDefs[i].Name);
ShowMessage(Format('%d campo(s)', [Query1.FieldCount]));
NewField := TStringField.Create(Query1);
NewField.FieldName := 'FullName';
NewField.Size := 36;
NewField.FieldKind := fkCalculated;
NewField.DataSet := Query1;
ShowMessage(Format('%d campo(s)', [Query1.FieldCount]));
Query1.Open;
end;
procedure TForm1.Query1CalcFields(DataSet: TDataSet);
begin
DataSet['FullName'] := DataSet['LastName'] + ' ' + DataSet['FirstName'];
end;
Si los campos los añades (todos) manualmente, necesariamente debe darte la cuenta, sin importar el tipo de campo.
Agrego
Si además, añado esto a un segundo botón:
Código Delphi
[-]
procedure TForm1.Button2Click(Sender: TObject);
var
I: Integer;
begin
for I := 0 to Query1.FieldCount - 1 do
ShowMessage(Query1.Fields[i].DisplayName);
end;
funciona sn problemas.
// Saludos