gpt4 book ai didi

delphi - 如何在 Delphi 10 中克隆数据集结构(TFDQuery)?

转载 作者:行者123 更新时间:2023-12-02 04:33:52 31 4
gpt4 key购买 nike

任何人都可以帮助我在运行时克隆 TFDQuery 吗?我在 Delphi Tokyo 中编码,我有一个带有 TFDQuery 的数据模块,其中我在设计时使用字段编辑器定义了所有字段属性,这样我的 DBGrid1 指向该数据集的数据模块,所有列的格式都正确(显示名称、宽度、格式、顺序)。在运行时,我需要创建 TFDQuery、TDatamodule 的新实例,并将这些新对象与 Dbgrid1 链接起来。我需要这个新的 TFDQuery 与设计时定义的现有 TFDQuery 相同,以便使 DBgrid1 具有与设计时相同的显示名称、显示宽度和显示格式!我尝试了以下方法来复制数据集字段定义:

**第一种方法: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

第二种方法:将现有数据集中的 FieldDef 分配给新数据集 - 不起作用!

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

尽管分配方法已运行,但 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;

...

此代码导致与方法 2 相同的结果,即它运行但打开 vdataset 后,DBGrid1 没有显示源数据集的列序列、标签和格式。

感谢您帮助修复上述代码或实现将数据集字段定义从一个现有数据集复制到新数据集的正确方法。

提前谢谢大家!

最佳答案

当您使用字段编辑器进行查询时,您创建的是字段而不是 FieldDef。据我所知,当组件被创建时(或者可能不是 100% 确定打开),FieldDefs 与 FieldsCollection 保持同步。 Display* 属性在 FieldDef 对象上不可用 - 它们仅存在于 Field 对象上。当您复制结构时,您需要迭代字段。我们使用的方法如下。

请注意,循环和创建的项目是“Fields”,但我们使用临时 FieldDef 对象来使代码更简单。 TFieldDef.CreatField 用作类工厂方法来获取正确的字段类型,即 TIntegerField 与 TStringField。此外,如果您使用计算字段,则需要连接 OnCalcField 事件。此方法不执行此操作。

procedure CopyFieldStructure(Source: TDataSet; Target: TDataset);
{^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^}
var
Field: TField;
NewField: TField;
FieldDef: TFieldDef;
begin
Target.Fields.Clear;
Target.FieldDefs.Clear;

// Cannot perform the next operation on an opened dataset
if Target.State <> dsInactive then
Target.Close;

for Field in Source.Fields do
begin
// We are going to setup the first part in a FieldDef
// that will set us use the CreateField Call in order to
// get the correct subclass of TField created.
FieldDef := Target.FieldDefs.AddFieldDef;
FieldDef.DataType := Field.DataType;
FieldDef.Size := Field.Size;
FieldDef.Name := Field.FieldName;

NewField := FieldDef.CreateField(Target);
NewField.Visible := Field.Visible;
NewField.DisplayLabel := Field.DisplayLabel;
NewField.DisplayWidth := Field.DisplayWidth;
NewField.EditMask := Field.EditMask;
NewField.Calculated := Field.Calculated;
end;
end;

这是一个类似的 StackOverflow 问题。我认为这是我最初获取代码的地方:Is there some better way to copy all DataSet Fields and their properties to another DataSet?

这是另一篇使用类似方法的博客文章:How to: Clone TField and TDataset fields structure

也不要被 TDataSet.CopyField 方法所迷惑。帮助看起来它可以复制字段结构。实际上,它会复制任何匹配字段名称的当前字段“值”。

关于delphi - 如何在 Delphi 10 中克隆数据集结构(TFDQuery)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47046591/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com