//问题 下面是一个组件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;
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;
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);
进行深度克隆
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.