界面保存(50分)

  • 主题发起人 主题发起人 icegirl914
  • 开始时间 开始时间
I

icegirl914

Unregistered / Unconfirmed
GUEST, unregistred user!
界面上有线条,动态生成的控件等,请问有什么办法来保存?
用FILESTREAM还是别的什么办法?
 
把信息写进注册表或者ini文件中如何?
 
to :jian1

1、这样写进去重新调入的时候能复原?
2、有可能会有几个不同的界面

不好意思,这方面我不懂,所以要向你们请教,谢谢!
 
保存到xml中
 
保存
procedure TMain1.N35Click(Sender: TObject);
var
LStream: TFileStream;
LSave: Boolean;
begin
if SaveDialog1.Execute then
begin
LSave := True;
if FileExists(SaveDialog1.FileName) and
(MessageDlg(Format('文件 "%s" 已经存在。是否覆盖?',
[SaveDialog1.FileName]), mtConfirmation, [mbYes, mbNo], 0) <> mrYes) then
LSave := False;
if LSave then
begin
LStream := TFileStream.Create(SaveDialog1.FileName, fmCreate);
try
LStream.WriteComponent(self.ActiveMDIChild);
finally
LStream.Free;
end;
end;
end;
end;

读取:
procedure TMain1.N34Click(Sender: TObject);
var
LStream: TFileStream;
begin
if OpenDialog1.Execute then
begin
LStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
try
begin
LStream.ReadComponent(Main1.ActiveMDIChild);
end;

finally
LStream.Free;
end;
end;
end;
 

自己定义文件结构

 
怎么个定义法?
 
我觉得wyddr的方法可行可取。
 
把窗體上的所有控件的TOP,LEFT,WIDTH,HEIGHT。。。。用一條記錄包存起來。。
 
[^][^][:D][8D][:)][:(][^][?]
 
wyddr的方法我试了,但是不行!MDICHILDFORM的东西根本就没有保存!有没有别的好的办法?
 
省事儿的话
就是保存流
 
但是能告诉我怎么个保存法?
 
把canvas保存到文件
 
如果我用INI来保存的话,是不是只能包存TWINCONTROL类的控件,我的控件继承自TGRAPHICCONTROL,我想包存它的PEN的属性,但我在遍历控件保存时却没有找到我想保存的属性。
哪位告诉我一下,有什么办法?我急的很,现在项目做到一半,卡住了,帮帮忙!
 
PEN属性是TCanvas的属性,而TGraphicControl的Canvas属性并没有发表。
这种方法一般只能保存published属性,要想保存其它的属性,还是得用我说的控件封装的方法,我以前说过思路和实例的链接。
 
To:thx1180
为什么不能用文件流的方法,我新建了一个mdiform 和mdichildform,然后动态生成控件,也包括我自定义的那些,用wyddr的方法可以保存和打开,包括PEN属性,一切都很正常,但是放在系统里就不行了,虽然语句上没出错,虽然但是感觉没保存进去。
 
关于Delphi文件流系统,详细的东西在Classes单元中,可以看看源代码,
wyddr的方法是保存整个子窗体,这样做程序简单些。其实用不着所有属性都保存的,
在你的程序中,只要保存位置信息等就够了,这样做还是得自己创建控件,代码也多,
但原理并不复杂,很容易实现的。
另:我的方法也是用文件流的方法。
 
将所有窗体上的控件写入流,
启动的时候,调如流文件
 

function ComponentToString(Component: TComponent): string;

var
BinStream:TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
StrStream := TStringStream.Create(s);
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;

function StringToComponent(Value: string): TComponent;
var
StrStream:TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result := BinStream.ReadComponent(nil);

finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;
 
后退
顶部