国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

零代碼保存窗口運行狀態(tài)

2019-11-18 18:55:29
字體:
供稿:網(wǎng)友
一些比較專業(yè)的軟件都有自動保存窗口運行狀態(tài)的功能,具體的方法都是在窗口關閉前將其狀態(tài)保存到注冊表中或ini文件中,而這些代碼一般都是相同的,所以可以將其集中在一起,重復使用。本文將相應的代碼用一個控件TPosition來實現(xiàn),使用時只要將此控件放到相應的Form上即可,不需要增加任何代碼,從而實現(xiàn)了“零”代碼保存窗口運行狀態(tài)。
  下面是這個控件的主要實現(xiàn)文件Position.pas的內(nèi)容,包括相應的注釋。為了保持注冊表的整潔,這里把信息保存到ini文件中。
  unit Position;
  interface
  uses
  Forms, Classes, SysUtils, Windows, IniFiles;
  type
  //TPosition是不可視控件,由TComponent繼承
  TPosition = class(TComponent)
  PRivate
  //用此變量保存父窗口的OnDestroy事件
  FOnDestroy: TNotifyEvent;
  //用此函數(shù)替換父窗口的OnDestroy事件
  procedure FormDestroy(Sender: TObject);
  protected
  //在控件加載時恢復父窗口狀態(tài)
  procedure Loaded; override;
  end;
  //恢復窗口位置函數(shù)
  procedure ReadFormPos(Form:TForm);
  //保存窗口位置函數(shù)
  procedure SaveFormPos(Form:TForm);
  //控件注冊函數(shù)
  procedure Register;
  implementation
  //連接此控件的圖標
  {$R Position.Dcr}
  //恢復窗口位置函數(shù),窗口狀態(tài)存放在ini文件中。
  procedure ReadFormPos(Form : TForm);
  var
  RegFile : TIniFile;
  SectName : string;
  begin
  //ini文件中存放Form信息的節(jié)名稱
  SectName := Form.Name + ' Position';
  //打開與可執(zhí)行文件名相同的ini文件
  RegFile := TIniFile.Create(
  ChangeFileExt(application.ExeName,'.ini'));
  //恢復窗口狀態(tài)
  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;
  //保存窗口位置函數(shù)
  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;
  //當要保存狀態(tài)的窗口是程序主窗口時,要特殊處理。因為主窗口收到最小化消息時,只是把此消息轉(zhuǎn)至Application處理,本身并不最小化。所以我們要判斷Application的狀態(tài)。
  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類的實現(xiàn)
  //當主窗口Destroy時,調(diào)用此函數(shù),此函數(shù)又調(diào)用保存的OnDestoy事件處理函數(shù)
  procedure TPosition.FormDestroy(Sender: TObject);
  begin
  SaveFormPos(Owner as TForm);
  if Assigned(FOnDestroy) then FOnDestroy(Sender);
  end;
  //控件加載時,恢復父窗口位置,并對父窗口的OnDestroy事件進行替換
  procedure TPosition.Loaded;
  begin
  inherited Loaded;
  //非設計狀態(tài)才進行處理
  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,可自行創(chuàng)建合適的圖標。使用時,只要將這個控件放到相應的Form即可。下面是我測試時的窗體代碼,不用加任何語句就可以自動保存窗體狀態(tài)。
  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下通過

上一篇:最酷的程序員用KOL

下一篇:對PE資源的研究

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網(wǎng)友關注

主站蜘蛛池模板: 璧山县| 大宁县| 辉县市| 镶黄旗| 邵阳市| 九江县| 长泰县| 禹州市| 昌黎县| 武汉市| 五台县| 罗田县| 阿拉尔市| 扶沟县| 襄樊市| 东乡族自治县| 乌审旗| 陈巴尔虎旗| 固原市| 黔南| 商都县| 旌德县| 武义县| 吴旗县| 夏邑县| 河南省| 红安县| 忻城县| 文水县| 石林| 三亚市| 富裕县| 平远县| 乳山市| 舟山市| 莱芜市| 城固县| 翁牛特旗| 特克斯县| 盖州市| 石景山区|