I think that a problem with what you want is that afaik you can't rename a field in an FDMemTable while it has data stored in it, because the field name is amongst the metadata stored in the saved data.
That said, here's a minimal example of renaming an FDMemTable field without having to
discard the data stored in it. Basically, it writes the table's data out in XML format, changes the field name (in this case 'FieldA') to something different ('FieldB') and reloads the data from the changed XML file.
uses [...] FireDAC.Stan.StorageXML;
type
TForm1 = class(TForm)
FDMemTable1: TFDMemTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
FDStanStorageXMLLink1: TFDStanStorageXMLLink;
procedure FormCreate(Sender: TObject);
public
end;
[...]
procedure TForm1.Button1Click(Sender: TObject);
var
AFileName : String;
TL : TStringList;
S : String;
begin
AFileName := 'C:\Temp\XMLData.XML';
FDMemTable1.SaveToFile(AFileName, sfXML);
TL := TStringList.Create;
try
TL.LoadFromFile(AFileName);
FDMemTable1.Close;
TL.Text := StringReplace(TL.Text, 'FieldA', 'FieldB', [rfReplaceAll]);
TL.SaveToFile(AFileName);
DBGrid1.Columns.Clear;
FDMemTable1.FieldDefs.Clear;
FDMemTable1.Fields.Clear;
FDMemTable1.LoadFromFile(AFileName, sfXML);
finally
TL.Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
Link : TFDStanStorageXMLLink; // This is needed to reload the data in XML format
AField : TField;
begin
Link := TFDStanStorageXMLLink.Create(Self);
AField := TIntegerField.Create(Self);
AField.FieldName := 'ID';
AField.DataSet := FDMemTable1;
AField := TStringField.Create(Self);
AField.FieldName := 'FieldA';
AField.Size := 32;
AField.DataSet := FDMemTable1;
FDMemTable1.CreateDataSet;
FDMemTable1.InsertRecord([1, 'One']);
FDMemTable1.InsertRecord([2, 'Two']);
end;
Obviously, if you didn't want to write the data to the filesystem, you could use a temporary stream and the FDMemTable's SaveToStream and LoadFromStream.