我有一个自定义的TDatasetProvider,允许为它提供的任何数据创建新字段。
因此,假设您在原始数据集中获得了以下字段:
您需要使用显示位图在DBGrid上选择它。好吧,你可以,因为我的DSP可以添加
一个名为Selected
的布尔字段,用于数据集数据。
我现在这样做的方式:
我真的不知道是否有更优雅(更快)的方法。还有另一种(更快和/或更优雅)的方法来获得这种结果吗?
答案 0 :(得分:13)
似乎在从源数据集加载数据后,您可以调用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;
我没有彻底测试它,但上面的简单示例按预期工作,我能够导航第二个客户端数据集并像往常一样编辑所有字段的值。
答案 1 :(得分:1)
最快的方法是使用CloneCursor
。像这样:
Target.CloneCursor(Origin); //there are more params than this, but this is the basic idea
答案 2 :(得分:0)
我有一个示例,可以动态地将字段添加到CDS,使用匿名方法计算单个字段,以获得更大的灵活性。在打开CDS之前,添加计算字段,而不是打开它..
这是你在找什么?问题不是很明确......
答案 3 :(得分:-1)
您可以使用TClientDataset的Data属性来复制整个数据集,元数据和数据。这应该是将一个TClientDataset复制到另一个TClientDataset的最快方法。
请参阅http://docwiki.embarcadero.com/RADStudio/en/Assigning_Data_Directly