零程式碼儲存視窗執行狀態 (轉)
零程式碼儲存視窗執行狀態
一些比較專業的都有自動儲存視窗執行狀態的功能,具體的方法都是在視窗關閉前將其狀態儲存到登錄檔中或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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 檢視BW執行狀態
- 檢視spark程式執行狀態以及安裝sparkSpark
- /*動態執行儲存過程DEMO*/儲存過程
- Java執行緒狀態轉換Java執行緒
- java--執行緒狀態【轉】Java執行緒
- 使用 telescope 檢視 schedule 執行狀態
- JAVA 執行緒狀態及轉化(轉)Java執行緒
- 儲存過程中巢狀儲存過程的變數執行方式儲存過程巢狀變數
- JAVA 程式 在 cmd 視窗的執行Java
- Linux如何檢視系統和程式的執行狀態?Linux
- Solaris之檢視執行系統狀態
- 檢視正在執行的儲存過程儲存過程
- Asp.Net在多執行緒環境下的狀態儲存問題ASP.NET執行緒
- Java的六種執行緒狀態及程式碼示例Java執行緒
- canvas 儲存與還原狀態Canvas
- 執行緒狀態執行緒
- 執行powermt 顯示儲存鏈路狀態為dead的解決辦法
- 使用ADO執行儲存過程 (轉)儲存過程
- 使用Command執行儲存過程 (轉)儲存過程
- Azure Terraform(四)狀態檔案儲存ORM
- Android 元件系列-----Activity儲存狀態Android元件
- 檢視mysql執行狀態的一些sqlMySql
- 執行緒的6種狀態以及轉變執行緒
- 執行緒的狀態轉換以及基本操作執行緒
- 短視訊原始碼,視訊轉為圖片儲存原始碼
- Java多執行緒-執行緒狀態Java執行緒
- 故障分析 | Federated 儲存引擎表導致監控執行緒處於 Opening table 狀態儲存引擎執行緒
- 執行緒轉儲:命名你的執行緒和檢視系統(轉)執行緒
- oracle動態sql執行table表中儲存的sqlOracleSQL
- React-Keeper 前端路由快取 儲存狀態(大部分轉)React前端路由快取
- 廣告彈窗/小視窗程式碼
- 利用Dectorator分模組儲存Vuex狀態(下)Vue
- iOS UI狀態儲存和恢復(三)iOSUI
- 利用Dectorator分模組儲存Vuex狀態(上)Vue
- OpenHarmony頁面級UI狀態儲存:LocalStorageUI
- Android中正確儲存view的狀態AndroidView
- 淺談 Java執行緒狀態轉換及控制Java執行緒
- 自動儲存、靜態儲存和動態儲存