在做一个程序,
需要将工作区的内容保存下来
就象工程文件本来想的是直接写ini,
将窗体中的控件的属性都记录下来,下次打开的时候动态生成
可现在工作区的内容还包括图片,图片也保存下来?
这样行是行,但是感觉很笨,而且将来的图片会很多
有没有什么方法,能直接保存成一个文件,将来载入这个文件就行了?难道是将所有的东东写到file中?然后再读?欢迎大家讨论
需要将工作区的内容保存下来
就象工程文件本来想的是直接写ini,
将窗体中的控件的属性都记录下来,下次打开的时候动态生成
可现在工作区的内容还包括图片,图片也保存下来?
这样行是行,但是感觉很笨,而且将来的图片会很多
有没有什么方法,能直接保存成一个文件,将来载入这个文件就行了?难道是将所有的东东写到file中?然后再读?欢迎大家讨论
解决方案 »
- 请问 怎么给reportbuilder里面的edit对象赋值?
- 在Delphi2006下使用Indy组件的示例
- 我儿子的相片~~~狂散1分
- TFileStream对16进制文件进行查找
- 下班回来的路上,我被一群拿着摄像机的PLMM拦住了,散分……
- 系统在使用中怎样避免因网络故障或其他原因造成ACCESS数据库损坏?
- 我用程序改变1024×768分辨率到800×600,结果windows的状态栏却跑到很下面去了
- 急问,关于pchar,pbyte和string类型之间的问题,在线等
- 怎样将字符表式转为可被编绎的算术表达式样?
- 两个listbox同时选中?
- 哪位大哥会呀,一个没解决的问题。。。
- 关于输入法!等待中!
那么图片呢?
writeComponentResFile
感觉是不是可以用上面两个函数解决阿
必须全部创建的都是这样的,保证隶属于这个scrollbox就肯定没有问题的,至于他的parent无所谓,还有一个问题 全部的对象必须直接隶属于scrollbox,不要变成objects[i].objects[i],这种形式 她不支持传递的关系
祝你好运!
空间的位置,颜色,大小等一切属性。动态建立的时候很麻烦的
ReadComponent
WriteComponent
你可以找一下上边两个函数的资料
procedure TForm1.Button2Click(Sender: TObject);
var
I:Integer;
begin
for I:=0 to Panel1.ControlCount-1 do
Panel1.Controls [I].Parent :=Panel1;
WriteComponentResFile('C:\MyPersistent.Txt',Panel1);
FreeAndNil(Panel1);
Self.Refresh ;
(ReadComponentResFile('C:\MyPersistent.Res',Nil) As TPanel).Parent :=Self;
for I:=0 to Panel1.ControlCount-1 do
Panel1.Controls [I].Parent :=Panel1;
end;initialization
RegisterClasses([TPanel]);
....我运行后报错!
begin
WriteComponentResFile('MyPersistent.res',Image1);
FreeAndNil(Image1);
Self.Refresh ;
end;
begin
WriteComponentResFile('MyPersistent.res',Image1);
FreeAndNil(Image1);
Self.Refresh ;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
(ReadComponentResFile('MyPersistent.res',Nil) As TImage).Parent :=Panel1;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterClasses([TImage]);
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, ExtCtrls, StdCtrls;type
TWAPanel = class(TPanel)
private
FEdit: TEdit;
FButton: TButton;
FImage: TImage;
published
property Edit: TEdit read FEdit write FEdit;
property Button: TButton read FButton write FButton;
property Image: TImage read FImage write FImage;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy;override;
end; TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
MyWAPanel:TWAPanel;implementation{$R *.dfm}{ TWAPanel }constructor TWAPanel.Create(AOwner: TComponent);
var
I:Integer;
begin
inherited;
Align:=alLeft;
Width:=400;
FEdit:=TEdit.Create(Self);
with FEdit do
begin
Top:=20;
Left:=20;
Height:=20;
Width:=120;
Text:='Work Area'
end;
FButton:=TButton.Create(Self);
with FButton do
begin
Top:=FEdit.Top ;
Left:=FEdit.Left +FEdit.Width +20;
Height:=FEdit.Height ;
Width:=FEdit.Width ;
end;
FImage:=TImage.Create(Self);
with FImage do
begin
Top:=FEdit.Top +FEdit.Height +20;
Left:=FEdit.Left ;
Height :=Self.Height -Top-20;
Width :=Self.Width -Left-20
end;
for I:=0 to Self.ControlCount -1 do
Self.Controls [I].Parent:=Application.MainForm ;
end;destructor TWAPanel.Destroy;
begin
//FEdit.Free;
//FButton.Free;
//FImage.Free;
inherited;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
MyWAPanel:=TWAPanel.Create(Self);
WriteComponentResFile('C:\WorkArea.Res',MyWAPanel);
FreeAndNil(MyWAPanel);
(ReadComponentResFile('C:\WorkArea.Res',MyWAPanel) as TWAPanel).Parent :=Self;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
FreeAndNil(MyWAPanel);
end;initialization
RegisterClasses([TWAPanel]);end.怎么里面定义的三个控件不显示,邪门了!
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, ExtCtrls, StdCtrls;type
TWAPanel = class(TPanel)
private
FEdit: TEdit;
FButton: TButton;
FImage: TImage;
published
property Edit: TEdit read FEdit write FEdit;
property Button: TButton read FButton write FButton;
property Image: TImage read FImage write FImage;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy;override;
end; TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
MyWAPanel:TWAPanel;implementation{$R *.dfm}{ TWAPanel }constructor TWAPanel.Create(AOwner: TComponent);
var
I:Integer;
begin
inherited;
Align:=alLeft;
Width:=400;
FEdit:=TEdit.Create(Self);
with FEdit do
begin
Top:=20;
Left:=20;
Height:=20;
Width:=120;
Text:='Work Area'
end;
FButton:=TButton.Create(Self);
with FButton do
begin
Top:=FEdit.Top ;
Left:=FEdit.Left +FEdit.Width +20;
Height:=FEdit.Height ;
Width:=FEdit.Width ;
end;
FImage:=TImage.Create(Self);
with FImage do
begin
Top:=FEdit.Top +FEdit.Height +20;
Left:=FEdit.Left ;
Height :=Self.Height -Top-20;
Width :=Self.Width -Left-20
end;
for I:=0 to Self.ControlCount -1 do
Self.Controls [I].Parent:=Application.MainForm ;
end;destructor TWAPanel.Destroy;
begin
//FEdit.Free;
//FButton.Free;
//FImage.Free;
inherited;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
MyWAPanel:=TWAPanel.Create(Self);
WriteComponentResFile('C:\WorkArea.Res',MyWAPanel);
FreeAndNil(MyWAPanel);
(ReadComponentResFile('C:\WorkArea.Res',MyWAPanel) as TWAPanel).Parent :=Self;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
FreeAndNil(MyWAPanel);
end;initialization
RegisterClasses([TWAPanel]);end.怎么里面定义的三个控件不显示,邪门了!
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, ExtCtrls, StdCtrls;type
TWAPanel = class(TPanel)
private
FEdit: TEdit;
FButton: TButton;
FImage: TImage;
published
property Edit: TEdit read FEdit write FEdit;
property Button: TButton read FButton write FButton;
property Image: TImage read FImage write FImage;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy;override;
end; TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
MyWAPanel:TWAPanel;implementation{$R *.dfm}{ TWAPanel }constructor TWAPanel.Create(AOwner: TComponent);
var
I:Integer;
begin
inherited;
Align:=alLeft;
Width:=400;
FEdit:=TEdit.Create(Self);
with FEdit do
begin
Top:=20;
Left:=20;
Height:=20;
Width:=120;
Text:='Work Area'
end;
FButton:=TButton.Create(Self);
with FButton do
begin
Top:=FEdit.Top ;
Left:=FEdit.Left +FEdit.Width +20;
Height:=FEdit.Height ;
Width:=FEdit.Width ;
end;
FImage:=TImage.Create(Self);
with FImage do
begin
Top:=FEdit.Top +FEdit.Height +20;
Left:=FEdit.Left ;
Height :=Self.Height -Top-20;
Width :=Self.Width -Left-20
end;
for I:=0 to Self.ControlCount -1 do
Self.Controls [I].Parent:=Application.MainForm ;
end;destructor TWAPanel.Destroy;
begin
//FEdit.Free;
//FButton.Free;
//FImage.Free;
inherited;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
MyWAPanel:=TWAPanel.Create(Self);
WriteComponentResFile('C:\WorkArea.Res',MyWAPanel);
FreeAndNil(MyWAPanel);
(ReadComponentResFile('C:\WorkArea.Res',MyWAPanel) as TWAPanel).Parent :=Self;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
FreeAndNil(MyWAPanel);
end;initialization
RegisterClasses([TWAPanel]);end.怎么里面定义的三个控件不显示,邪门了!
的确,能保存窗体的位置什么的了但是我对控件写的事件呢?重新加载就没了
其实delphi也一样,
也需要*.pas来保存类呀、过程呀什么的
只有资源是不行的
另一个用数据库,存图像 然后动态生成控件,用图像的话就从库里取这样可能是比较简单的方法了
第一种方法,最大的缺点是,我的图片很多,这样岂不是很难管理?
8个小时过去了,我还是没有看到什么地方说过WriteComponentResFile这个函数到底是对对象的什么信息进行流化处理的!
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;
不过我连续按几次后,就出现内存错误了。
//////////////////////////////////////////////
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.
---------------------------
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;
阿德,这个方法我们一直在用,尤其是在动态报表上非常好用,不明白你为什么总是不成功,需不需要我给你发一段代码过来?不过是动态报表的,而且很小,很久以前我测试这个方法的时候写的,你可以看看!