2012-02-27 21 views
3

我有一個非常類似的代碼來與this複製一個TADODataSet組件和它的事件。帶有流場的重複TADODataSet組件?

所以,如果我有一個ADODataSet1我想創建一個新的實例ADODataSet2作爲前組件的確切的重複組件。

一切工作正常,但我還是很無法複製流場ADODataSet1PollIDADODataSet1TitleADODataSet1Description):

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並提出了一個異常缺少連接o r ConnectionString「。我寫ms.WriteComponent(Source)之後如何設置激活爲False? (解決方法是在複製之前設置ADODataSet1.Active := False)。

注:我clone the cursor/recordset的數據集(TADODataSet.Clone)所以請不要認爲這是「重複的問題」。

回答

0

試試這個:

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

這似乎並沒有工作。 'Component.ComponentCount'總是1('TADOCommand')。重複的DataSet沒有持久性字段。 – ZigiZ 2012-05-12 10:18:00