如何在 design-time 中更改 Delphi FireDAC tFDMemTable 字段名称
How to change Delphi FireDAC tFDMemTable field name in design-time
我尝试将 FDMemTable1field1 的字段名称 'field1' 更改为 'field3'。没有代码,全部在design-time.
中完成
TForm1 = class(TForm)
DBGrid1: TDBGrid;
DataSource1: TDataSource;
FDMemTable1: TFDMemTable;
FDMemTable1field1: TStringField;
FDMemTable1field2: TStringField;
当通过 FDMemTable1 加载文件时 pop-up 设计中的菜单 window DBGrid1 可以很好地显示数据。在 Object Inspector 中将 'field1' 更改为 'field3' 会清除 FDMemTable1.Active 'false' 和 DBGrid1 的所有单元格。
切换 FDMemTable1.Active 'true' 仅显示 DBGrid1 标题 'field3' 而 'field2' 不显示数据单元格。
最后加载相同的文件会引发错误Field 'field3' not found.
即使我在停用 FDMemTable1 后更改名称,结果也是一样的。
是否可以更改 design-time 中的字段名称?我是否应该将整个 'field1' 复制到 'field3' 并在 run-time 中删除前者?
我认为您想要的问题是,afaik 您不能重命名 FDMemTable 中存储有数据的字段,因为字段名称是存储在已保存数据中的元数据之一。
就是说,这是一个无需重命名 FDMemTable 字段的最小示例
丢弃存储在其中的数据。基本上,它以 XML 格式写出 table 的数据,将字段名称(在本例中为 '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:\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;
显然,如果您不想将数据写入文件系统,您可以使用临时流和 FDMemTable 的 SaveToStream 和 LoadFromStream。
我尝试将 FDMemTable1field1 的字段名称 'field1' 更改为 'field3'。没有代码,全部在design-time.
中完成TForm1 = class(TForm)
DBGrid1: TDBGrid;
DataSource1: TDataSource;
FDMemTable1: TFDMemTable;
FDMemTable1field1: TStringField;
FDMemTable1field2: TStringField;
当通过 FDMemTable1 加载文件时 pop-up 设计中的菜单 window DBGrid1 可以很好地显示数据。在 Object Inspector 中将 'field1' 更改为 'field3' 会清除 FDMemTable1.Active 'false' 和 DBGrid1 的所有单元格。
切换 FDMemTable1.Active 'true' 仅显示 DBGrid1 标题 'field3' 而 'field2' 不显示数据单元格。
最后加载相同的文件会引发错误Field 'field3' not found.
即使我在停用 FDMemTable1 后更改名称,结果也是一样的。
是否可以更改 design-time 中的字段名称?我是否应该将整个 'field1' 复制到 'field3' 并在 run-time 中删除前者?
我认为您想要的问题是,afaik 您不能重命名 FDMemTable 中存储有数据的字段,因为字段名称是存储在已保存数据中的元数据之一。
就是说,这是一个无需重命名 FDMemTable 字段的最小示例 丢弃存储在其中的数据。基本上,它以 XML 格式写出 table 的数据,将字段名称(在本例中为 '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:\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;
显然,如果您不想将数据写入文件系统,您可以使用临时流和 FDMemTable 的 SaveToStream 和 LoadFromStream。