一些比较专业的软件都有自动保存窗口运行状态的功能,具体的方法都是在窗口关闭前将其状态保存到
注册表中或ini文件中,而这些代码一般都是相同的,所以可以将其集中在一起,重复使用。本文将相应的代码用一个控件TPosition来实现,使用时只要将此控件放到相应的Form上即可,不需要增加任何代码,从而实现了“零”代码保存窗口运行状态。
下面是这个控件的主要实现文件Position.pas的内容,包括相应的注释。为了保持注册表的整洁,这里把信息保存到ini文件中。
unit Position;
interface
uses
Forms, Classes, SysUtils, Windows, IniFiles;
type
//TPosition是不可视控件,由TComponent继承
TPosition = class(TComponent)
private
//用此变量保存父窗口的OnDestroy事件
FOnDestroy: TNotifyEvent;
//用此函数替换父窗口的OnDestroy事件
procedure FormDestroy(Sender: TObject);
protected
//在控件加载时恢复父窗口状态
procedure Loaded; override;
end;
//恢复窗口位置函数
procedure ReadFormPos(Form:TForm);
//保存窗口位置函数
procedure SaveFormPos(Form:TForm);
//控件注册函数
procedure Register;
implementation
//连接此控件的图标
{$R Position.Dcr}
//恢复窗口位置函数,窗口状态存放在ini文件中。
procedure ReadFormPos(Form : TForm);
var
RegFile : TIniFile;
SectName : string;
begin
//ini文件中存放Form信息的节名称
SectName := Form.Name + '' Position'';
//打开与可执行文件名相同的ini文件
RegFile := TIniFile.Create(
ChangeFileExt(Application.ExeName,''.ini''));
//恢复窗口状态
with Form do begin
Left := RegFile.ReadInteger(SectName,''Left'',Left);
Top := RegFile.ReadInteger(SectName,''Top'',Top);
Width := RegFile.ReadInteger(SectName,''Width'',Width);
Height := RegFile.ReadInteger(SectName,''Height'',Height);
WindowState := TWindowState(
RegFile.ReadInteger(SectName,''WindowState'',0));
end;
//关闭ini文件
RegFile.Free;
end;
//保存窗口位置函数
procedure SaveFormPos(Form:TForm);
var
RegFile : TIniFile;
SectName : string;
begin
SectName := Form.Name + '' Position'';
RegFile := TIniFile.Create(
ChangeFileExt(Application.ExeName,''.ini''));
with Form do begin
RegFile.WriteInteger(SectName,''WindowState'',
integer(WindowState));
//最大化时,不保存窗口位置
if WindowState <> wsMaximized then begin
RegFile.WriteInteger(SectName,''Left'',Left);
RegFile.WriteInteger(SectName,''Top'',Top);
RegFile.WriteInteger(SectName,''Width'',Width);
RegFile.WriteInteger(SectName,''Height'',Height);
end;
//当要保存状态的窗口是
程序主窗口时,要特殊处理。因为主窗口收到最小化消息时,只是把此消息转至Application处理,本身并不最小化。所以我们要判断Application的状态。
if Form = Application.MainForm then begin
if IsIconic(Application.Handle) then begin
Reg File.Write Integer(Sect Name,''WindowState'',
Integer(wsMinimized));
end;
end;
end;
RegFile.Free;
end;
//注册控件
procedure Register;
begin
RegisterCom