用Delphi让程序具有记忆功能 我们平时用到的很多软件都具有一定的记忆功能，如foxmail和The Bat!等等。这些软件在启动时能自动保持上一次关闭前的状态，如窗口的初始位置、用户的设置（如窗口风格，横竖排列）等等。能否使我们自己的程序也具有类似的功能呢？在本篇中我就要介绍一种方法，使应用程序能够记住上一次关闭时的窗口状态。 实现这种方法的关键是数据的存贮，目前有这几种办法:可以写*.ini或*.inf文件;可以用Delphi提供的文件类来自定义一个文件;可以用数据库接口（如ODBC）引入一种数据库文件，如Foxpro的*.dbf和Access的*.mdb;还可以直接写Windows的注册表。
我们推荐使用写注册表的办法，因为这种办法很方便，不需太多额外的开销，程序比较简单，也不易被别人更改。
要让应用程序记住上一次关闭时的窗口状态，其总体思路是:在关闭程序时记录下本次程序结束时的信息，写入注册表中，在下次程序启动时读注册表中相应信息，并赋给程序。在这个程序中需要记录的信息是窗口关闭时的Top、Left、Height、Width。(注意:要想使Delphi可以操作注册表，必须包括registry单元。)
以下是源程序和相关注释:
unit Unit1;
interface
uses
Windows, Messages,……,registry;
//包括registry单元
type
TForm1 = class(TForm)
public
ww:TRegistry;
//声明一个TRegistry对象，我们就通过ww来实现对注册表的操作
//启动窗口时要做的一些工作

procedure TForm1.FormCreate(Sender: TObject);
begin
ww:=TRegistry.Create;
//创建ww对象
ww.RootKey :=HKEY_CURRENT_USER;
//注意:通过修改RootKey可以把信息写到注册表的每一个角落
ww.OpenKey('software',FALSE);
//打开键software,可以看到Borland，Netscape还有Microsoft也在这个software键中
ww.CreateKey( '王伟');
//在software键中创建一个名为"王伟"的键值，使自己的名字和Borland,Netscape,
//Microsoft并排在一起，是不是很Cool啊:)
ww.OpenKey( '王伟',FALSE);
//打开键"王伟"
ww.CreateKey('XX单位XX管理系统');
//创建应用程序的名称
ww.OpenKey('XX单位XX管理系统',TRUE);
ww.CreateKey('位置');
//创建应用程序中某一个要存贮的项目的名称，便于管理
ww.OpenKey('位置',TRUE);
if (ww.ReadString('first')<>'1')then
//这是值得注意的一个地方，通过"first"来判断程序是否
begin
//是第一次写注册表,如果是第一次写则用程序给的默认值来
ww.WriteString('first','1');
//设置窗口的位置和大小。如果不是第一次启动应用程序则说明
Form1.WindowState:=(wsNormal);
//注册表中已经写了位置信息，就读这些信息并赋给Form。
Form1.Top:=10;
Form1.Left:=10;
Form1.Height:=100;
form1.Width:=100;
end
else
begin
if(ww.ReadString('max')='y') then
//判断上次关闭程序时，窗口是否是最大化的。如果是的话，则
Form1.WindowState:=(wsMaximized)
//继续使窗口拥有这一特征。
else
begin
Form1.top:=StrToInt(ww.ReadString('top')); //如果不是最大化，则取位置和大小数据赋给From
Form1.left:=StrToInt(ww.ReadString('left'));
Form1.height:=StrToInt(ww.ReadString('height'));
Form1.width:=StrToInt(ww.ReadString('width'));
end;
end;
end;
//关闭窗口时要做的一些工作

procedure TForm1.FormDestroy(Sender: TObject);
begin
ww.OpenKey('位置',FALSE);
//打开"位置"键
if Form1.WindowState=(wsMaximized) then
//如果当前程序是最大化，则把这一信息写入注册表
ww.WriteString('max','y')
//便于下一次时使用
else
begin
ww.WriteString('max','n');
//如果不是最大化，则把窗口的位置和大小数据写入注册表中。
ww.WriteString('top',IntToStr(Form1.top));
ww.WriteString('left',IntToStr(Form1.left));
ww.WriteString('height',IntToStr(Form1.Height));
ww.writeString('width',IntToStr(Form1.Width));
end;
end;
需要注意的几点:
1.因为程序不可能在第一次使用时就从注册表里读数据，所以第一次必须由程序赋一个初值,然后做上标记，以后只要判断出不是第一次了，就可以读数据了。（这点最重要,由此还可以引出一个话题，那就是可以做一个Demo版的软件，每次启动时往注册表里加个1,当它的值大于10时，就不许用该软件了，Cool吧！）
2.理论上往注册表里可以写string型数据和Integer型数据，但注册表中的Integer型数据是以16进制的形式存在的，而我们在程序中用的都是10进制数，所以就用string型，然后用StrToInt或IntToStr转换。
3.写注册表并不是绝对安全，因为它的内容可以用RegEdit一览无余地看到，所以千万不能将一些重要的信息(如密码)不经加密而直接写入注册表，这样做是非常危险的！！
另外，有兴趣的朋友还可以把这段程序做在一个DLL文件中,这样以后再做一个Project的时候就可以直接用这两个函数了，非常方便。
以上程序在中文Windows 97 OSR2.0，Delphi4中调试通过。
(王 伟)