フォーム位置保存コンポーネント

【特徴】
フォームの位置やWindowStateを保存し、次回の起動時に復元するコンポーネントです。
割とこの手のコードが必要になることって多いのですが、毎回書くには面倒だし、リポジトリに入れておくにも各種エキスパートが使えなくなるし。
というわけで、コンポーネントにしてみました。
使用方法は、「フォームに張り付けるだけ」です。

保存の対象となるフォームは、このコンポーネントのオーナーです。
したがって、データモジュールに張り付けることは出来ません。
保存の時期は、対象となるフォームにWM_DESYROYがおくられてきた時です。
復元の時期は、このコンポーネントのLoadedです。

【コンポーネント】
KSavePosには、2つのコンポーネントが入っています。
TKSavePosIniと、TKSavePosRegです。
それぞれ、IniFileとレジストリにフォーム位置等を記録します。
TKSavePosIniは、アプリケーションのExeの拡張子を'.ini'に変更したファイルの[Bounds]セクションに、「Form名.Bounds」キーへ保存します。
TKSaveRegは、"HKEY_CURRENT_USER¥Software¥プロバイダ名¥アプリケーション名¥Bouns¥Form名.Bounds"へ保存します。

【ファイル】
解凍すると以下のファイルがあります。
ksubwnd.pasは、ライブラリパスの通ったところへ置いてください。
コンポーネントが入っているのは、ksavepos.pasです。
Delphi2の場合、ksavepos.pasを登録してください。
Delphi3の場合は、ksubwnd.pasとksavepos.pasを両方指定します。

ksubwnd.pasTKSubWndが定義されています。ksavepos.pasで使用しています。
ksavepos.pasTKSaveFormPosとTKSavePosIni,TKSavePosRegを定義しています。
ksavepos.dcrTKSavePosIni,TKSavePosRegのアイコンが入っています。
readme.txt使い方の説明があります。


プロパティとメソッド

【共通】
プロパティ:
SaveBounds:Boolean
TRUEにしておくと、オーナーのフォームの位置とサイズを保存/復元します。
デフォルトはTrueです。
ResumeIconic:Boolean
FALSEにしておくと、「最小化」を復元しません。
Form.WindowStateに従います。
これは、起動時から最小化だと見えにくいという問題を回避するものです。
デフォルトは、Falseです。
メソッド:
procedure SavePosition;
任意の時点でフォームの位置とサイズを保存するためのものです。
procedure LoadPosition;
任意の時点でフォームの位置とサイズを復元するためのものです。

【TKSavePosIni】
独自のプロパティやメソッドはありません。

【TKSavePosReg】
プロパティ:
Provider:string
プロバイダ名です。保存の時のキーに使用します。
デフォルトは'User'ですが、なるべくきちんと設定してください。
AppName:string
アプリケーション名です。保存の時のキーに使用します。
設定しないと、アプリケーションのExe名からパスと拡張子を取り除いたものをキーとして使います。

プログラム解説

【継承】
 TComponent-TKSubWnd-TSaveFormPos-+-TSavePosIni
				  +-TSavePosReg
【TKSubWnd】
「TWinControlをサブクラス化する」コンポーネントです。
これは、継承の親として作成したもので、このままでは使えません。
Controlプロパティにサブクラス化したいコンポーネントを指定し、SubWndProcメソッドをoverrideして使います。
余談:
サブクラス化って、ほんとは継承の親にするものじゃ無いでしょう。
便利なのでこうしましたが、OOの見地からすると所有するオブジェクトであるべきですよね。

【TKSaveFormPos】
フォームの位置とサイズを保存/復元します。
これも、継承の親として作成したので、このままでは使えません。
SaveStringと、LoadStringをoverrideして、保存方法を指定します。

【TKSavePosIni】
TKSaveFormPosを親として、SaveStringとLoadStringをoverrideし、保存方法にIniFileを指定しています。

【TKSavePosIni】
TKSaveFormPosを親として、SaveStringとLoadStringをoverrideし、保存方法にレジストリを指定しています。
レジストリのキーを決定するために、ProviderプロパティとAppNameプロパティを追加しました。

[戻る]