咨询:域名主机客服!261689845 建站:网站建设请点我!173022933 推广:网站推广请点我!452936608 销售:域名主机客服309128758 客户体验 | 售后平台 | 代理加盟 | 客户口碑

 

零代码保存窗口运行状态 - 新闻中心 - 南宁巨人网络
零代码保存窗口运行状态
时间:2013/2/25 10:52:12    来源:南宁巨人网络    浏览次数:343次
【字体大小:    】    【温馨提示:双击可滚动页面,单击则停止滚动。】

零代码保存窗口运行状态

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

        



关于我们 | 网站公告 | 参观机房 | 合作伙伴 | 代理合作 | 付款方式 | 法律声明 | 常见问题 | 在线留言 | 服务监督 | 联系我们 | 南宁网站建设
 
地址:广西南宁市广西大学正门左侧火炬路17号金达花园7栋2单元241室  邮编:530001  
业务邮箱:    技术邮箱:   财务邮箱:
在线服务空间域名:网站推广请点我!261689845 网站建设:网站建设请点我!309331800 网站推广:网站推广请点我!452936608 售后技术支持:网站推广请点我!309128758
代理合作:网站推广请点我!173022933 全国业务客服电话:0771-3824424  找巨人?  到巨人?
版权所有南宁市巨人网络 未经授权,禁止使用 中华人民共和国备案编号 :桂ICP备06014082号