如何在设计时更改Delphi FireDAC tFDEmTable字段名称



我试图将FDMemTable1field1的字段名从"field1"更改为"field3"。没有代码,一切都是在设计时完成的。

TForm1 = class(TForm)
DBGrid1: TDBGrid;
DataSource1: TDataSource;
FDMemTable1: TFDMemTable;
FDMemTable1field1: TStringField;
FDMemTable1field2: TStringField;

当通过设计窗口中的FDMemTable1弹出菜单加载文件时,DBGrid1会很好地显示数据。将对象检查器中的"field1"更改为"field3"将使FDMemTable1.Active为"false",并且DBGrid1的所有单元格都被清除。

正在切换FDMemTable1.Active"true"仅显示DBGrid1标题"field3"one_answers"field2",而不显示数据单元格。

最后加载同一个文件时会引发错误Field 'field3' not found.。即使我在停用FDMemTable1后更改了名称,结果也是一样的。

是否可以在设计时更改字段名称?我应该在运行时将整个"field1"复制到"field3"并删除前者吗?

我认为您想要的一个问题是,如果FDMemTable中存储了数据,则无法重命名该字段,因为字段名位于存储在已保存数据中的元数据中。

也就是说,这里有一个不必重命名FDMemTable字段的最小示例丢弃存储在其中的数据。基本上,它以XML格式写出表的数据,将字段名(在本例中为"FieldA"(更改为其他名称("FieldB"(,并从更改后的XML文件中重新加载数据。

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:TempXMLData.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;

显然,如果不想将数据写入文件系统,可以使用临时流以及FDMemTable的SaveToStream和LoadFromStream。

最新更新