首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制流字段的TADODataSet组件?

复制流字段的TADODataSet组件?
EN

Stack Overflow用户
提问于 2012-02-27 23:42:43
回答 1查看 538关注 0票数 3

我有一个与this非常相似的代码来复制TADODataSet组件及其事件。

因此,如果我有一个ADODataSet1,我想要创建一个新的实例ADODataSet2,作为前一个组件的完全重复的组件。

所有工作都很好,但我仍然无法复制流字段 (ADODataSet1PollIDADODataSet1TitleADODataSet1Description):

代码语言:javascript
复制
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,所以请不要认为它是“重复的问题”。

EN

回答 1

Stack Overflow用户

发布于 2012-05-09 12:07:10

试试这个:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9474189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档