Может ли кто-нибудь помочь мне клонировать TFDQuery во время выполнения? Я кодирую в Delphi Tokyo, у меня есть модуль данных с TFDQuery, в котором я определил все свойства полей с помощью редактора полей во время разработки, таким образом, мой DBGrid1, который указывает на этот модуль данных этого набора данных, имеет все столбцы правильно отформатированные ( отображать имена, ширину, формат, порядок). Во время выполнения мне нужно создать новые экземпляры TFDQuery, TDatamodule и связать эти новые объекты с Dbgrid1. Мне нужно, чтобы этот новый TFDQuery был идентичен существующему, определенному во время разработки, чтобы сохранить DBgrid1 с теми же отображаемыми именами, шириной отображения и форматами отображения, что и во время разработки! Я пробовал следующие подходы к копированию определений полей набора данных:
**1-й подход: назначение метода для TFDQuery (не сработало) **
type
TFormDados = class(TForm)
Edit1: TEdit;
Button1: TButton;
DBGrid1: TDBGrid;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
vconnection : TFDConnection;
vdataset : TFDQuery;
vdatasource : Tdatasource;
public
{ Public declarations }
end;
var
FormDados: TFormDados;
implementation
{$R *.dfm}
Uses
unitdata;
procedure TFormDados.Button1Click(Sender: TObject);
var
i : integer;
begin
vconnection := TFDConnection.Create(nil);
vconnection.Assign(Dtmodule.FDConGrafico);
vdataset := TFDQuery.Create(nil);
vdataset.Connection := vconnection;
vdataset.Assign(Dtmodule.FDQueryDados); // Runtime Error : Cannot assign a TFDQuery to a TFDQuery
2-й подход: назначить FieldDefs из существующего набора данных новому — не сработало!
...
vdataset.FieldDefs.Assign(Dtmodule.FDQueryDados.FieldDefs);
vdataset.sql := Dtmodule.FDQueryDados.sql;
vdataset.params := Dtmodule.FDQueryDados.Params;
vdataset.FieldDefs.Update;
vdataset.CreateDataSet;
vdatasource := Tdatasource.create(nil);
vdatasource.DataSet := vdataset;
dbgrid1.DataSource := vdatasource;
vdataset.close;
vdataset.Params[0].Asinteger := strtoint(edit1.Text);
vdataset.Params[1].Asinteger := strtoint(edit2.Text);
vdataset.Open;
Хотя метод Assign был запущен, vdataset не получил определения полей существующего FDQquery . После открытия vdataset DBGrid1 не отображал последовательность столбцов, метки и форматы для исходного набора данных, ПОЧЕМУ?
3-й подход — копировать определения полей по одному — не работает
for i:=0 to Dtmodule.FDQueryDados.Fields.Count -1 do
begin
with vdataset.FieldDefs.AddFieldDef do
begin
Name := Dtmodule.FDQueryDados.FieldDefs[i].Name;
Datatype := Dtmodule.FDQueryDados.FieldDefs[i].DataType;
Displayname := Dtmodule.FDQueryDados.FieldDefs[i].Displayname;
Fieldno := Dtmodule.FDQueryDados.FieldDefs[i].FieldNo;
end;
end;
vdataset.FieldDefs.Update;
vdataset.CreateDataSet;
vdatasource := Tdatasource.create(nil);
vdatasource.DataSet := vdataset;
dbgrid1.DataSource := vdatasource;
...
Этот код приводит к тому же результату, что и второй подход, т. е. он запускается, но после открытия vdataset DBGrid1 не показывает последовательность столбцов, метки и форматы для исходного набора данных.
Я ценю вашу помощь в исправлении приведенного выше кода ИЛИ реализации правильного метода копирования определений полей набора данных из одного существующего набора данных в новый.
Спасибо всем заранее !
TFloatField(NewField).DisplayFormat := TFloatField(Field).DisplayFormat
06.11.2017