実行時にTFDQueryをクローンするのに助けてくれる人はいますか?私はDelphi Tokyoでコーディングしています。TFDQueryを持つDatamoduleがあり、デザイン時にFields Editorを使用してすべてのフィールドプロパティを定義しました。このように、このデータセットのDatamoduleを指す私のDBGrid1は、名前、幅、フォーマット、順序を表示)。実行時にTFDQuery、TDatamoduleの新しいインスタンスを作成し、これらの新しいオブジェクトをDbgrid1にリンクする必要があります。この新しいTFDQueryは、DBgrid1を同じ表示名、表示幅、および表示形式でデザイン時に保持するために、設計時に定義された既存のTFDQueryと同一である必要があります。Delphi 10でデータセット構造(TFDQuery)をクローンする方法は?
**第一のアプローチ: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
第二のアプローチ:既存のデータセットから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;
Althought Assignメソッドが実行されていた、vdataset既存FDQqueryのフィールドの定義を受信しませんでした。 vdatasetを開いた後、DBGrid1はソースデータセットの列シーケンス、ラベル、および書式を表示しませんでした。なぜですか?
第三のアプローチ - コピーフィールドの定義、一つ一つが - すなわち、アプローチの第二と同じ結果にこのコードリード
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ソースデータセットの列シーケンス、ラベル、およびフォーマットを表示していませんでした。
上記のコードを修正するか、または既存のデータセットから新しいデータセットフィールド定義をコピーする適切なメソッドを実装することに感謝します。
ありがとうございました!
DBグリッド列も同様に格納して復元します。 – Victoria
'' [coStructure] 'を使って 'CopyDataSet'を試してください – Jason
@ Jason、データグリッドを再割り当てすると、DBグリッドは列情報を失います。コード[このような](https://pastebin.com/rN4gG5w0)はあなたがそれを保つのを助けることができます。基本となるデータセットのフィールド定義は、1つの部分に過ぎません。 – Victoria