ども、Norimakiです。
この前、Formの位置・サイズを保存する 【FormPosition】で、
前回アプリケーションを終了した際のフォーム位置とサイズを
覚えておくことができるFormPositionをご紹介しました。
作者の方には感謝しきりです。
使用させていただいているんですが、
毎回コンポーネントをフォームに貼り付けるのは、
さすがに面倒くさい。
ということで、ちょっと手を加えてみました。
仕組みとしては、フォーム毎にFormPositionのインスタンスを作成し、
TObjectListでそれらを保持する。
というものです。
とりあえずソースはこちら。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
procedure NP_LoadFormsPosSize; var i:integer; FrmPos:TFormPosition; begin //----------------------------------- // フォームの位置、サイズを読み込む //----------------------------------- // シフトキーが押されていたら何もせずExit if (GetKeyState(VK_SHIFT)<0) then exit; NV_FormPosList.Clear; for i:=0 to Application.ComponentCount -1 do begin if Application.Components[I] is TForm then begin //処理開始 FrmPos:=TFormPosition.Create(Application.Components[i]); NV_FormPosList.Add(FrmPos); FrmPos.DataSaveName:=_FormPosIni; FrmPos.LoadWindowState; end; end; Application.MainForm.Visible:=True; end; procedure NP_SaveFormsPosSize; var i:integer; begin //----------------------------------- // フォームの位置、サイズを保存 //----------------------------------- Application.MainForm.Visible:=False; for i:=0 to NV_FormPosList.Count -1 do begin TFormPosition(NV_FormPosList[i]).SaveWindowState; end; end; |
前提としてアプリケーションの初期化部で
NV_FormPosList:=TObjectList.Create(True);
として、FormPositionを格納するリストFormPosListを作成しています。
ソース中に出てくる _FormPosIni は設定ファイルのファイル名です。
(xxxxx.iniみたいなやつです)
使用法はアプリケーション起動時ですべてのフォーム作成後に
NP_LoadFormsPosSizeを呼びます。
アプリケーション終了時にNP_SaveFormsPosSizeを呼びます。
これが基本です。
プロジェクトファイル以外のファイルはどうなってるの?で
書いた構造でユニットを構成している場合は、
NP_BeforeRunningでNP_LoadFormsPosSizeを呼び、
NP_AfterRunningでNP_SaveFormsPosSizeを呼ぶ。
という形になります。
ちなみに、NV_FormPosListの作成はNP_ApplicationInitで行い、
NV_FormPosListの解放( FreeAndNil(NV_FormPosList) )は
NP_ApplicationFinで行います。
で、やってることは簡単で、フォーム位置サイズの読み込みは、
コンポーネントをループしてフォームを見つけたら、
FormPositionを作成してFormPosListに追加します。
作成したFormPosListについては保存対象のiniファイル名を設定します。
その後、LoadWindowStateメソッドでフォーム状態を復帰すると。
保存に関しては、FormPosListに追加してあるFormPositionの
SaveWindowStateを順番に呼び出しているだけです。
それと、シフトキー起動で復帰をスルーします。
フォームが迷子になった時に使用します。
ということで、これでフォーム作成毎に貼り付ける
必要がなくなります。あとは必要に応じて修正していきます。
とりあえずこんな感じで。
ではでは。
Norimakiでした。