如何实现对象及其子对象的保存与恢复?(200分)

  • 主题发起人 主题发起人 lxggc
  • 开始时间 开始时间
L

lxggc

Unregistered / Unconfirmed
GUEST, unregistred user!
本人正在写一个矢量图形编辑软件,在保存时要求将某部件及其内部的子部件全部写入文件
以便以后编辑,本人在用 WriteComponentResFile 和 ReadComponentResFile 没能实现,
请高手赐教。
 
function ComponentToString(Component: TComponent): string;
var
BinStream:TMemoryStream;
StrStream: TStringStream;
begin
BinStream := TMemoryStream.Create;
try
StrStream := TStringStream.Create(Result);
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;
 
YB_unique, 你提供的不就是delphi自带的例子吗?好像不能保存子控件的内容?
 
将某部件及其内部的子部件全部写入文件?
不是很明白。
是否可以定义一个数据结构,将信息保存在里面。
保存的时候再将信息写入文件中。
 
可能是我表述得不太清楚,举个例:在一个Panel内有3个Image,现在我要求将他们全部
保存到文件内,在需要的时候可以从文件中再调入,要求调入后的布局与调入欠的布局
一摸一样。
 
这个问题不难
用文本可以看delphi自己的.dfm格式。用流可以参考很多,比如fastreport
 
procedure TForm1.SaveAs1Click(Sender: TObject);
var
S: TFileStream;
I: Integer;
begin
self.SetFocus

if SaveDialog1.Execute then
begin
{open or create the stream file}
S := TFileStream.Create (SaveDialog1.FileName,
fmOpenWrite or fmCreate);
try
{save each component except the panel}
for I := 0 to ControlCount - 1 do
if Controls.ClassName <> 'TPanel' then
S.WriteComponent (Controls);
finally
S.Free;
end;

end;

end;
New1Click(SENDER);
if OpenDialog1.Execute then
begin
{remove existing controls}
New1Click (self);
{open the stream}
S := TFileStream.Create (OpenDialog1.FileName,
fmOpenRead);
try
while S.Position < S.Size do
begin
{read a component and add it to the form}
// old code:
// New := S.ReadComponent (nil);
// InsertControl (New as TControl);
// new code:
Reader1 := TReader.Create (S, 4096);
try
Reader1.Parent := self;
New := Reader1.ReadRootComponent (nil);

InsertComponent (New);
finally
Reader1.Free;
end;

end;

finally
S.Free;
end;

end;



 
procedure TFMainForm.SaveForm(Form:TForm;FormName:string);
var
Output: TMemoryStream;
ResName:string;
I:Integer;
begin
Form.OnActivate:= nil;
Form.OnCreate:= nil;
Form.OnDestroy:= nil;
Form.OnMouseDown:= nil;
Form.OnMouseMove:= nil;
Form.OnMouseUp:= nil;
Form.OnResize:= nil;
Form.OnPaint:= nil;
for I:=Form.ComponentCount-1 downto 0 do begin
if Form.Components is TGrabHandle then Form.Components.Free
else if Components.Name = 'ProxyPopupMenu1' then Components.Free;
end;
ResName:=FormName;
Output:=TMemoryStream.Create;
OutPut.WriteComponentRes(ResName,Form);
Output.SaveToFile(ResName);
Output.Free;
Form.Free;
end;
 
问题已经解决,谢谢各位大侠的帮忙。本人现在又有一个新的难题,不知是否可行,即由
用户自己编写某一控件的事件原代码(比如OnClick事件),并能予以执行。
 
后退
顶部