保存工作区的内容,兄弟们进来给点建议

myling 2003-08-23 09:26:45
在做一个程序,
需要将工作区的内容保存下来
就象工程文件

本来想的是直接写ini,
将窗体中的控件的属性都记录下来,下次打开的时候动态生成
可现在工作区的内容还包括图片,图片也保存下来?
这样行是行,但是感觉很笨,而且将来的图片会很多


有没有什么方法,能直接保存成一个文件,将来载入这个文件就行了?

难道是将所有的东东写到file中?然后再读?

欢迎大家讨论
...全文
45 50 打赏 收藏 转发到动态 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
gardenyang 2003-08-26
  • 打赏
  • 举报
回复
海天子说得很队,必须注意registerclass,否则有些类是不能用的,例如qrlabel就在你创建之后不能用
gardenyang 2003-08-26
  • 打赏
  • 举报
回复
FrameSniper(§绕瀑游龙§) 在使用这两个函数的时候不能传递owner,我也不知道为什么,但是我用了这么长时间发现就是传递后你的控件会消失,解决的办法就是吧所有的控件都owner设置成为scrollbox(你需要保存的),至于她的parent就随便了。
阿德,这个方法我们一直在用,尤其是在动态报表上非常好用,不明白你为什么总是不成功,需不需要我给你发一段代码过来?不过是动态报表的,而且很小,很久以前我测试这个方法的时候写的,你可以看看!
huojiehai 2003-08-26
  • 打赏
  • 举报
回复
出错可能是在删除组件处出错,建议大家改进一下,我以前做的时候,每次读入前都是动态创建Form
lw549 2003-08-25
  • 打赏
  • 举报
回复
可以执行下面的过程两次,第三次出现
---------------------------
Project1
---------------------------
Access violation at address 00403676 in module 'Project1.exe'. Read of address FFFFFFD8.
---------------------------
确定
---------------------------

procedure TForm1.Button2Click(Sender: TObject);
begin
ReadComponent('d:\form1.ini',form1);
end;
lw549 2003-08-25
  • 打赏
  • 举报
回复
huojiehai(海天子)的方法非常棒!
不过我连续按几次后,就出现内存错误了。
//////////////////////////////////////////////
var
Form1: TForm1;
procedure SaveComponent(Con: TWinControl; Path: string);
procedure ReadComponent(Path: string; Con: TWinControl);
implementation



{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
//
SaveComponent(form1,'d:\form1.ini');
end;
procedure SaveComponent(Con: TWinControl; Path: string);

var
BinStream:TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
BinStream.WriteComponent(Con);
BinStream.Seek(0, soFromBeginning);
BinStream.SaveToFile(Path);
finally
BinStream.Free
end;
end;
procedure ReadComponent(Path: string; Con: TWinControl);
var
BinStream: TMemoryStream;
lp: integer;
Com: TComponent;
begin
//注意删除你不要的就可以了,自己做过滤
for lp := Con.ComponentCount - 1 downto 0 do
begin
Com := Con.Components[lp];
Con.RemoveComponent(Com);
Com.Free;
end;
BinStream := TMemoryStream.Create;
try
BinStream.LoadFromFile(Path);
BinStream.ReadComponent(Con);
finally
BinStream.Free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ReadComponent('d:\form1.ini',form1);
end;

end.
cnhgj 2003-08-25
  • 打赏
  • 举报
回复
热烈的讨论,俺是来学习的!继续!
huojiehai 2003-08-24
  • 打赏
  • 举报
回复
还要注意所有保存的类在FormCreate时都要RegisterClasses
huojiehai 2003-08-24
  • 打赏
  • 举报
回复
以上方法,只要是publish属性都可以保存,Image1中的图片也可以,试试看
huojiehai 2003-08-24
  • 打赏
  • 举报
回复
很简单啦,用TStream类的WriteComponent和ReadComponent就可以了,不知合不合你的要求
Example:
//保存
procedure SaveComponent(Con: TWinControl; Path: string);

var
BinStream:TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
BinStream.WriteComponent(Con);
BinStream.Seek(0, soFromBeginning);
BinStream.SaveToFile(Path);
finally
BinStream.Free
end;
end;
//写回
procedure ReadComponent(Path: string; Con: TWinControl);
var
BinStream: TMemoryStream;
lp: integer;
Com: TComponent;
begin
//注意删除你不要的就可以了,自己做过滤
for lp := Con.ComponentCount - 1 downto 0 do
begin
Com := Con.Components[lp];
Con.RemoveComponent(Com);
Com.Free;
end;
BinStream := TMemoryStream.Create;
try
BinStream.LoadFromFile(Path);
BinStream.ReadComponent(Con);
finally
BinStream.Free;
end;
end;

dashi 2003-08-24
  • 打赏
  • 举报
回复
up
FrameSniper 2003-08-24
  • 打赏
  • 举报
回复

8个小时过去了,我还是没有看到什么地方说过WriteComponentResFile这个函数到底是对对象的什么信息进行流化处理的!
FrameSniper 2003-08-24
  • 打赏
  • 举报
回复
好,晚上回家试试!
myling 2003-08-24
  • 打赏
  • 举报
回复
我也爬起来顶
SXL_E3_TEC 2003-08-24
  • 打赏
  • 举报
回复
半夜爬起来顶一下:)
myling 2003-08-23
  • 打赏
  • 举报
回复
OK!

等我试试

解决了马上给分!
沾上了甩不掉 2003-08-23
  • 打赏
  • 举报
回复
很方便的,可以把内容写成流文件,需要的时候在读出来。文件里边包含了
空间的位置,颜色,大小等一切属性。动态建立的时候很麻烦的
ReadComponent
WriteComponent
你可以找一下上边两个函数的资料
gardenyang 2003-08-23
  • 打赏
  • 举报
回复
只需要button1:=Tbutton.create(scrollbox);
必须全部创建的都是这样的,保证隶属于这个scrollbox就肯定没有问题的,至于他的parent无所谓,还有一个问题 全部的对象必须直接隶属于scrollbox,不要变成objects[i].objects[i],这种形式 她不支持传递的关系


祝你好运!
gardenyang 2003-08-23
  • 打赏
  • 举报
回复
ReadComponentResFile
writeComponentResFile
感觉是不是可以用上面两个函数解决阿
myling 2003-08-23
  • 打赏
  • 举报
回复
大家给点意见呀


其实要是做的话,
我那种方法应该能做出来,
最多将所有的文件用流的形式合成一个

但是我想看看有没有更好的思路
有没有简单点的方法?


myling 2003-08-23
  • 打赏
  • 举报
回复
_weiKun_(Virus):

序列流进行,类,属性。。。得保存。


那么图片呢?
加载更多回复(30)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧