線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1059
推到 Plurk!
推到 Facebook!

零代碼保存視窗運行狀態

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-26 12:51:26 IP:61.221.xxx.xxx 未訂閱
此為轉貼資料 零代碼保存視窗運行狀態 一些比較專業的軟體都有自動保存視窗運行狀態的功能,具體的方法都是在視窗關閉前將其狀態保存到註冊表中或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下通過
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-04-28 13:29:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!