我有一个自定义的 TDatasetProvider,它允许为其提供的任何数据创建新字段。
那么,假设您在原始数据集上获得了以下字段:
- 客户 ID
- 姓名
- 年龄
您需要使用显示位图在 DBGrid 上选择它。好吧,你可以,因为我的 DSP 可以添加
数据集数据中名为 Selected
的 bool 字段。
我现在这样做的方式:
- 创建 2 个 TClientDataset 对象(源和目标)
- 在 Origin 中,我加载从 InternalGetRecords 方法的参数获取的数据(我覆盖了它)
- 在 Target 中,我创建从 Origin 数据集定义的 fielddef,并添加开发人员在设计时创建的 fielddef
- 在目标上执行 CreateDataset
- 并且,我逐行(以及逐个字段)将数据从源数据库复制到目标数据集
- 最后,将 Data 变量作为 InternalGetRecords 的返回值返回。
我真的不知道是否有更优雅(更快)的方法来做到这一点。还有另一种(更快和/或优雅)的方法来获得该结果吗?
最佳答案
看来从源数据集中加载数据后,可以调用IDSBase.AddField
添加更多字段:
uses
DB, DBCommon, DBClient, DSIntf;
type
THackClientDataSet = class(TClientDataSet);
procedure EncodeFieldDesc(var FieldDesc: DSFLDDesc;
const Name: string; DataType: TFieldType; Size, Precision: Integer;
Calculated: Boolean; Attributes: TFieldAttributes);
begin
// ... copied from TClientDataSet.EncodeFieldDesc
end;
//...
var
FldDesc: DSFLDDesc;
begin
FillChar(FldDesc, SizeOf(FldDesc), 0);
EncodeFieldDesc(FldDesc, 'SELECTED', ftBoolean, 0, 0, False, []);
with THackClientDataSet(DataSet) do
Check(DSBase.AddField(@FldDesc));
// now you can create a second client dataset and assign it DataSet.Data directly:
// DataSet2.Data := DataSet.Data;
// DataSet2 now contains the new field (with empty values in all existing records)
end;
我没有彻底测试它,但上面的简单示例按预期工作,我能够导航第二个客户端数据集并像往常一样编辑所有字段的值。
关于delphi - 将数据从一个数据集结构移动到另一个数据集结构的更快方法(在 TDatasetProvider 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10234325/