Дублировать компонент 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
и это вызывает исключение " Отсутствует соединение или ConnectionString ". Как я могу установить Active для False
после того как я напишу ms.WriteComponent(Source)
? (Обходной путь должен установить ADODataSet1.Active := False
прежде чем его дублировать).
Примечание. Я не хочу клонировать курсор / набор записей в наборе данных (TADODataSet.Clone), поэтому, пожалуйста, не рассматривайте его как "дублирующий вопрос".
1 ответ
Попробуй это:
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;