function   ComponentToString(Component:   TComponent):   string; var 
    BinStream:TMemoryStream; 
    StrStream:   TStringStream; 
    s:   string; 
begin 
    BinStream   :=   TMemoryStream.Create; 
    try 
        StrStream   :=   TStringStream.Create(s); 
        try 
            BinStream.WriteComponent(Component); 
            BinStream.Seek(0,   soFromBeginning); 
            ObjectBinaryToText(BinStream,   StrStream); 
            StrStream.Seek(0,   soFromBeginning); 
            Result:=   StrStream.DataString; 
        finally 
            StrStream.Free;         end; 
    finally 
        BinStream.Free 
    end; 
end; function   StringToComponent(Value:   string):   TComponent; 
var 
    StrStream:TStringStream; 
    BinStream:   TMemoryStream; 
begin 
    StrStream   :=   TStringStream.Create(Value); 
    try 
        BinStream   :=   TMemoryStream.Create; 
        try 
            ObjectTextToBinary(StrStream,   BinStream); 
            BinStream.Seek(0,   soFromBeginning); 
            Result   :=   BinStream.ReadComponent(nil);         finally 
            BinStream.Free; 
        end; 
    finally 
        StrStream.Free; 
    end; 
end; s := ComponentToString(Form1);
tempFrm := StringToComponent(s);
当Form1里任何控件不要添加,可以正常执行
一旦放入控件,就异常了
报组建已经存在

解决方案 »

  1.   

    改了函数StringToComponentfunction ComponentToString(Component: TComponent): string;var
      BinStream: TMemoryStream;
      StrStream: TStringStream;
      s: string;
    begin
      BinStream := TMemoryStream.Create;
      try
        StrStream := TStringStream.Create(s);
        try
          BinStream.WriteComponent(Component);
          BinStream.Seek(0, soFromBeginning);
          ObjectBinaryToText(BinStream, StrStream);
          StrStream.Seek(0, soFromBeginning);
          Result := StrStream.DataString;
        finally
          StrStream.Free;    end;
      finally
        BinStream.Free
      end;
    end;function StringToComponent(Value: string; Instance: TComponent = nil): TComponent;
    var
      StrStream: TStringStream;
      BinStream: TMemoryStream;
    begin
      StrStream := TStringStream.Create(Value);
      try
        BinStream := TMemoryStream.Create;
        try
          ObjectTextToBinary(StrStream, BinStream);
          BinStream.Seek(0, soFromBeginning);
          Result := BinStream.ReadComponent(Instance);
        finally
          BinStream.Free;
        end;
      finally
        StrStream.Free;
      end;
    end;然后
    var
      tempfrm: TForm1;
      s: string;  s := ComponentToString(Self);
      tempfrm := TForm1.CreateNew(Application);
      StringToComponent(s, tempfrm);
      tempfrm.Left := tempfrm.Left + 100;