分享
 
 
 

零代码保存窗口运行状态

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

零代码保存窗口运行状态

一些比较专业的软件都有自动保存窗口运行状态的功能,具体的方法都是在窗口关闭前将其状态保存到注册表中或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

RegisterComponents('XDCtls', [TPosition]);

end;

//TPositon类的实现

//当主窗口Destroy时,调用此函数,此函数又调用保存的OnDestoy事件处理函数

procedure TPosition.FormDestroy(Sender: TObject);

begin

SaveFormPos(Owner as TForm);

if Assigned(FOnDestroy) then FOnDestroy(Sender);

end;

//控件加载时,恢复父窗口位置,并对父窗口的OnDestroy事件进行替换

procedure TPosition.Loaded;

begin

inherited Loaded;

//非设计状态才进行处理

if not (csDesigning in Componentstate) then begin

ReadFormPos(Owner as TForm);

FOnDestroy := (Owner as TForm).OnDestroy;

(Owner as TForm).OnDestroy := FormDestroy;

end;

end;

end.

完成此单元后,新建一个Package,将此单元包含在其中,编译、安装即可。资源文件Position.dcr,可自行创建合适的图标。使用时,只要将这个控件放到相应的Form即可。下面是我测试时的窗体代码,不用加任何语句就可以自动保存窗体状态。

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs,Position;

type

TForm1 = class(TForm)

Position1: TPosition;

private

public

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

end.

此程序在PWIN97+Delphi5.0下通过

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有