零程式碼儲存視窗執行狀態 (轉)

gugu99發表於2008-03-20
零程式碼儲存視窗執行狀態 (轉)[@more@] 

零程式碼儲存視窗執行狀態


   一些比較專業的都有自動儲存視窗執行狀態的功能,具體的方法都是在視窗關閉前將其狀態儲存到登錄檔中或ini中,而這些程式碼一般都是相同的,所以可以將其集中在一起,重複使用。本文將相應的程式碼用一個TPosition來實現,使用時只要將此控制元件放到相應的Form上即可,不需要增加任何程式碼,從而實現了“零”程式碼儲存視窗執行狀態。
  下面是這個控制元件的主要實現檔案Position.pas的內容,包括相應的註釋。為了保持登錄檔的整潔,這裡把資訊儲存到ini檔案中。
  unit Position;
  interface
  uses
  Forms, Classes, SysUtils, , IniFiles;
  type
  //TPosition是不可視控制元件,由TComponent繼承
  TPosition = class(TComponent)
  private
  //用此變數儲存父視窗的OnDestroy事件
  FOnDestroy: TNotifyEvent;
  //用此替換父視窗的OnDestroy事件
  procedure FormDestroy(Sender: T);
  protected
  //在控制元件載入時恢復父視窗狀態
  procedure Loaded; overr;
  end;
  //恢復視窗位置函式
  procedure ReadFormPos(Form:TForm);
  //儲存視窗位置函式
  procedure SaveFormPos(Form:TForm);
  //控制元件註冊函式
  procedure Register;
  implementation
  //連線此控制元件的圖示
  {$R Position.Dcr}
  //恢復視窗位置函式,視窗狀態存放在ini檔案中。
  procedure ReadFormPos(Fo: 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+5.0下透過


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1001218/,如需轉載,請註明出處,否則將追究法律責任。

相關文章