//问题 下面是一个组件COPY 函数,在组件TLabel TButton TPanel TMemo.....等测试没有问题  但TRichEdit TForm即报错,错误见下
procedure TForm1.ComponentToStr(Sender: TComponent);
var
  MemStream: TMemoryStream;
  FileStream: TFileStream;
begin
    MemStream:= TMemoryStream.Create;
    try
        FileStream:= TFileStream.Create('C:\Tmp.txt',fmCreate); 
        try
            MemStream.WriteComponent(Sender);
            MemStream.Position:= 0;
            ObjectBinaryToText(MemStream,FileStream);
        finally
            FileStream.Free;
        end;
    finally
        MemStream.Free;
    end;
end;function TForm1.StrToComponent(Sender: TComponent): TComponent;
var
  MemStream: TMemoryStream;
  FileStream: TFileStream;
begin
    FileStream:= TFileStream.Create('C:\Tmp.TXT',fmOpenReadWrite);
    try
        FileStream.Position:=0;
        MemStream:= TMemoryStream.Create;
        try
            ObjectTextToBinary(FileStream,MemStream);
            MemStream.Position:=0;
            //Result:= TComponent(MemStream.ReadComponent(Sender)); //如果Sender为被COPY对象,则可以通过,只是原来的会丢失
              Result:= TComponent(MemStream.ReadComponent(nil)); //此处报错
              //Error  Raised exception class einvalidoperation with message 'control' has no paren 
              //MemStream.ReadComponent(Result);
        finally
            MemStream.Free;
        end;
    finally
        FileStream.Free;
    end;
end;

解决方案 »

  1.   

    procedure TForm1.ComponentToStr(Sender: TComponent);
    var
      MemStream: TMemoryStream;
      FileStream: TFileStream;
    begin
            FileStream:= TFileStream.Create('C:\Tmp.txt', fmCreate);
            try
                FileStream.WriteComponentRes('ComponentRes', Sender);
            finally
                FileStream.Free;
            end;
    end;function TForm1.StrToComponent(Sender: TComponent): TComponent;
    var
      FileStream: TFileStream;
    begin
        FileStream:= TFileStream.Create('C:\Tmp.TXT',fmOpenReadWrite);
        try
            Result:= FileStream.ReadComponentRes(Sender); 
        finally
            FileStream.Free;
        end; 
    end;克隆复杂对象(对象内属性也是对象)
    要用TFileStream.WriteComponentRes和TFileStream.ReadComponentRes(Sender);
    进行深度克隆
      

  2.   

    nil,不报错,才怪呢,读得源地方都没得,怎么读咯.
      

  3.   

    用的meiqingsong方法 还有TRichEdit的类你有没有注册
      

  4.   

    //这个问题应该叫组件的序列化吧!unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}//添加一个 Memo1 然后修改其内容
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      WriteComponentResFile('c:\temp\memo.dat', Memo1);
    end;
    //反序列化, 读回
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      ReadComponentResFile('c:\temp\memo.dat', Memo1);
    end;
    //序列化
    procedure TForm1.Button3Click(Sender: TObject);
    var
      stream: TStream;
    const
      strPath = 'c:\temp\m.dat';
    begin
      stream := TFileStream.Create(strPath, fmCreate);
      stream.WriteComponentRes(Memo1.ClassName, Memo1);
      stream.Free;
    end;
    //反序列化
    procedure TForm1.Button4Click(Sender: TObject);
    var
      stream: TStream;
    const
      strPath = 'c:\temp\m.dat';
    begin
      stream := TFileStream.Create(strPath, fmOpenRead);
      stream.ReadComponentRes(Memo1);
      stream.Free;
    end;end.