2012-02-27 7 views
3

У меня очень похожий код this, чтобы дублировать компонент TADODataSet и его события.Дублирующий компонент 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 и что вызывает Исключение «Отсутствует соединение o r ConnectionString ". Как я могу установить Active на False после того, как напишу ms.WriteComponent(Source)? (Обходной путь - установить 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