零代碼保存視窗運行狀態 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 零代碼保存視窗運行狀態
一些比較專業的軟體都有自動保存視窗運行狀態的功能,具體的方法都是在視窗關閉前將其狀態保存到註冊表中或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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |