零代码保存窗口运行状态

原创 2001年05月12日 21:01:00
 

零代码保存窗口运行状态


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

TCP的定时器系列 — 零窗口探测定时器(有图有代码有真相!!!)

转载 主要内容:零窗口探测定时器的实现。 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd   出现以下情况时,TCP接收方的接收缓冲区将被塞满...
  • Sharp_UP
  • Sharp_UP
  • 2017年05月28日 14:04
  • 329

如何保存窗口状态

在iPhone手机客户端开发过程中经常会涉及到一些问题,如:如何保存窗口状态等等。       当应用别切到后台后,很难保证应用不被杀掉(用户主动杀掉或被系统杀掉),如果被杀掉,当程序 ...
  • happyrabbit456
  • happyrabbit456
  • 2014年10月16日 22:44
  • 683

QT——QSettings保存程序窗口状态

下面是一个例程: 包含三个文件: settings.h settings.cpp main.cpp settings.h: #ifndef SETTINGS_H #define SETT...
  • ilvu999
  • ilvu999
  • 2012年09月04日 02:10
  • 741

Qt 储存软件窗口最后的关闭时的状态

void SoloDccMainWindow::readSettings() { QSettings settings; settings.beginGroup("solodevice...
  • qq_27175513
  • qq_27175513
  • 2016年11月07日 15:47
  • 579

TCP的定时器系列 — 零窗口探测定时器

主要内容:零窗口探测定时器的实现。 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd   出现以下情况时,TCP接收方的接收缓冲区将被塞满数据: ...
  • zhangskd
  • zhangskd
  • 2015年04月05日 22:19
  • 5906

零输入响应和零状态响应

零输入就是只考虑状态 零状态就是只考虑输入这名字不知道那个傻逼取得,零输入响应干脆就叫做状态响应嘛,零状态响应就叫做输入响应嘛,真是脑残的翻译。。害得我每次看的这2个名词都要在脑袋里面这样转个弯,大...
  • huangning1995
  • huangning1995
  • 2017年03月02日 18:00
  • 910

DockPanel2 保存各个窗口的状态

这个功能太强大了,需要好好研究原代码load中               Frm1 f1= new Frm1();            Frm2 f2= new Frm2();          ...
  • mydriverc
  • mydriverc
  • 2007年08月13日 15:37
  • 1606

客户端收到一个窗口为 0 的包怎么处理

转载:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28811518&id=5603324调整窗口大小: 当TCP堆 栈接收到数据的...
  • starstar1992
  • starstar1992
  • 2017年12月05日 11:38
  • 124

频域分析法求解零状态响应的matlab过程

今天做信号与系统实验,有用到这部分的知识,感觉这里面道道很多,因此拿出来与大家分享一下。...
  • ds1231h
  • ds1231h
  • 2016年05月23日 21:21
  • 1163

保存服务器的运行状态

当发生异常警告时,需要了解服务器的当前运行状态。写一个脚本,记录状态,用于诊断。 注意控制日志文件的长度。 #/bin/sh logdir=$(cd "$(dirname "$0")";pwd)/...
  • noizz
  • noizz
  • 2017年02月03日 15:50
  • 211
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:零代码保存窗口运行状态
举报原因:
原因补充:

(最多只允许输入30个字)