- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
任何人都可以帮助我在运行时克隆 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/
我想使用组件编辑器设计我的 TFDQuery,即在设计时设置 SQL 字符串、选项等,然后在线程中使用查询。 我的问题是线程的每个运行实例都需要自己的查询实例 - 否则它将不是线程安全的。 我是否应该
问题 我想知道是否有任何方法可以通过只知道表的主键来移动到数据集中的特定记录(FDQuery)。 我所知道的 我知道我可以使用 FDQuery.Next; FDQuery.Prior; 移至下一条/上
简而言之,我如何知道哪些(主要和唯一)键唯一标识 FireDAC 查询记录? 我正在使用 Delphi 10.1 & FireDAC & Firebird。 我正在使用代码生成来生成一个包含我的应用程
我想从 TFDQuery.Delta 中删除一个特定的 usModified 记录,但不恢复它。与 TFDQuery.CommitUpdates 相同,但不是针对所有数据集,仅针对一个选择的记录。有人
我正在尝试异步执行 SQL 查询。我已经检查了 http://docwiki.embarcadero.com/RADStudio/XE5/en/Asynchronous_Execution_(Fire
任何人都可以帮助我在运行时克隆 TFDQuery 吗?我在 Delphi Tokyo 中编码,我有一个带有 TFDQuery 的数据模块,其中我在设计时使用字段编辑器定义了所有字段属性,这样我的 DB
我在 Delphi XE5 中使用 TFDQuery 组件从 PostgreSQL 数据库的表中插入和更新记录。我在添加字段(在 DFM 中持续存在)时遇到的一个缺点是它没有检测到某些表字段为 NOT
我使用的是 Delphi 10 Seattle,下面是示例代码。 unit Unit1; interface uses Winapi.Windows, Winapi.Messages, Syste
我正在寻找 TFDQuery 中的跳过并选择。我找到的属性是 .FetchOptions.RecsSkip 和 .FetchOptions.RecsMax。我使用 Tokyo 10.2.3 和数据库
使用 Delphi 10.2、SQLite 和 Teecharts。我的 SQLite 数据库有两个字段,创建方式为: CREATE TABLE HistoryRuntime ('DayTime' D
使用 Delphi 10.2、SQLite 和 Teecharts。我的 SQLite 数据库有两个字段,创建方式为: CREATE TABLE HistoryRuntime ('DayTime' D
我是一名优秀的程序员,十分优秀!