请问在Delphi下如何使开发出来的程序具有“记忆性”! ( 积分: 100 )

  • 主题发起人 主题发起人 Voodoox
  • 开始时间 开始时间
V

Voodoox

Unregistered / Unconfirmed
GUEST, unregistred user!
我在Delphi下开发程序时,遇到了这种情况:需要程序能够记住上次关闭程序前的一些状态,如保存文件的目录位置、窗口界面的大小及在屏幕上的位置等,说简单点就是让程序具有一定的“记忆”功能,请问各位大侠有些什么处理方法呢?
 
我在Delphi下开发程序时,遇到了这种情况:需要程序能够记住上次关闭程序前的一些状态,如保存文件的目录位置、窗口界面的大小及在屏幕上的位置等,说简单点就是让程序具有一定的“记忆”功能,请问各位大侠有些什么处理方法呢?
 
ini 注册表 或者 自定文件
 
TFormStorage
 
ini 注册表 或者 自定文件 数据库 加密文件
 
我也是这样做的,而且还保存Grid中各字段的顺序和宽度并动态翻译各字段的标题。
我认为将数据保存在数据库中会比较好,这样用户在任何一台电脑登录时的设定不会因电脑的不同而不同。
 
同意楼上的
 
用tformstorage 來窗体的大小,屏幕的位置;
grid中各字段的顺序,宽度等可用自定的文件在窗口离开时保存,第二次进入时栽入上
一次保存的文件;
 
http://www.aidelphi.com/6to23/docu/ReadDFMFile.rar
一个把窗体保存在dfm文件中,应用程序需的时候再从文件中读出来的例子,也就是说dfm文件不编译进EXE文件,而是单独以文件的形式存在,这样别人无法利用十六进编辑软件改动界面了.
 
Fm:=TFileStream.Create('c:/temp.dfm',fmCreate);
fm.writeComponent(self);
fm.free;
这样可以存对应的窗口改变
 
查看如下帖子 1973419; 1815005; 748751
 
放到数据库中吧,建立一个专门的表,记录窗体的最大化等状态,以及不是最大化状态时left和top的值,如果还有其他的也相应建立列字段。
给你个思路:
写一个窗体,此窗体作为其他窗体的母板,即其他的窗体都是从本窗体继承的。
在窗体的Show事件中加入自己写的诸如ReadForm(此过程用于读取上次的记录),在CloseQuery事件中加入WriteForm(此过程用于写记录)。简单写一下代码:
procedure ReadForm;
var
sState, sSql: string;
ADOSetTmp: TADODataSet;
begin
//读取对应窗体的信息,用其Caption作为限定条件,表暂且用SaveForms
sSql := ' SELECT * FROM SaveForms WHERE Caption=''' + Caption + '''';
{此处打开数据库,代码略,暂且以在ADOSetTmp打开为例说}
if not ADOSetTmp.IsEmpty then
begin
{下面的字段改成自己的,我只是做个例子说}
sState := ADOSetTmp.FieldByName('State').AsString;
Top := ADOSetTmp.FieldByName('Top').AsInteger;
Left := ADOSetTmp.FieldByName('Left').AsInteger;
if Trim(sState) = 'wsNormal' then
begin
WindowState := wsNormal;
Width := ADOSetTmp.FieldByName('Width').AsInteger;
Height := ADOSetTmp.FieldByName('Height').AsInteger;
end
else
if Trim(sState) = 'wsMaximized' then
WindowState := wsMaximized
else
WindowState := wsMinimized;
end;
end;

procedure WriteForm;
var
sSql, sState: string;
begin
if self.WindowState = wsNormal then
sState := 'wsNormal'
else
if self.WindowState = wsMaximized then
sState := 'wsMaximized'
else
if self.WindowState = wsMinimized then
sState := 'wsMinimized'
else
sState := '';
sSql := ' SELECT * FROM SaveForms WHERE Caption=''' + Caption + '''';
if {判断数据库中是否已经记录过该窗体,若是则修改,不是则添加,代码略} then
sSql := 'INSERT INTO SaveForms ……'
else
begin
if self.WindowState = wsNormal then //当不是最大化状态时
sSql := 'UPDATE SaveForms Set
else //当是最大化状态时
sSql := ' UPDATE SaveForms Set
end;
{执行Sql,进行数据库操作!}
end;

然后在Show中加入ReadForm,在CloseQuery加入WriteForm即可。
 
利用TComponent自身的流属性即可
在TStream中定义了将TComponent或其继承者保存到流和从流载入的问题

这里是全数据保存,比楼上的要好。

流出来了,保存到哪里就随便你了
 
谢谢大家的帮助!!!
 
把程序的信息写到注册表,然后再读出来
 
使用TiniFiles类最简单了,有联机帮助
 
后退
顶部