我有一个与this非常相似的代码来复制TADODataSet组件及其事件。
因此,如果我有一个ADODataSet1,我想要创建一个新的实例ADODataSet2,作为前一个组件的完全重复的组件。
所有工作都很好,但我仍然无法复制流字段 (ADODataSet1PollID、ADODataSet1Title、ADODataSet1Description):
object ADODataSet1: TADODataSet
Connection = ADOConnection1
CursorType = ctStatic
AfterOpen = ADODataSet1AfterOpen
CommandText = 'select top 10 * from Polls'
Parameters = <>
Left = 224
Top = 40
object ADODataSet1PollID: TGuidField
FieldName = 'PollID'
FixedChar = True
Size = 38
end
object ADODataSet1Title: TWideStringField
FieldName = 'Title'
Size = 255
end
object ADODataSet1Description: TWideStringField
FieldName = 'Description'
Size = 4000
end
end我遇到的另一个问题是,如果ADODataSet1设置为Active=True,那么当我调用ms.ReadComponent(Dest)时,Active流在Connection之前,这会引发一个异常“缺少连接或ConnectionString”。在编写False之后,如何将Active设置为ms.WriteComponent(Source)?(解决办法是在复制ADODataSet1.Active := False之前设置它)。
注意:I不想在dataset (TADODataSet.Clone)上使用clone the cursor/recordset,所以请不要认为它是“重复的问题”。
发布于 2012-05-09 12:07:10
试试这个:
Procedure registerAllClass(CMP: TComponent);
var
I:Integer;
begin
if (CMP is TPersistent) then begin
RegisterClass(TPersistentclass(cmp.ClassType));
end;
for I:=0 to CMP.ComponentCount-1 do
registerAllClass(cmp.Components[i]);
end;
function DuplicateComponent(Component: TComponent): TComponent;
var
MemStream: TMemoryStream;
oldname:String;
begin
oldname:=component.Name;
try
registerAllClass(Component);
Component.Name:='CopyOf'+Component.Name;
MemStream := TMemoryStream.Create;
try
MemStream.WriteComponent(Component);
MemStream.Position := 0;
result:=MemStream.ReadComponent(nil);
finally
MemStream.Free;
end;
finally
Component.Name:=oldname;
end;
end;
function DuplicateDataset(Dataset:TDataset):TDataset;
var
oldActive:Boolean;
begin
if Dataset=nil then
result:=nil
else begin
oldActive:=Dataset.Active;
try
Dataset.Active:=false;
result:=DuplicateComponent(Dataset) as TDataSet;
finally
Dataset.Active:=oldActive;
end;
end;
end;https://stackoverflow.com/questions/9474189
复制相似问题