複数のフォームでFormPositionを使用する

ども、Norimakiです。

この前、Formの位置・サイズを保存する 【FormPosition】で、
前回アプリケーションを終了した際のフォーム位置とサイズを
覚えておくことができるFormPositionをご紹介しました。

作者の方には感謝しきりです。

使用させていただいているんですが、
毎回コンポーネントをフォームに貼り付けるのは、
さすがに面倒くさい。

ということで、ちょっと手を加えてみました。

仕組みとしては、フォーム毎にFormPositionのインスタンスを作成し、
TObjectListでそれらを保持する。

というものです。
とりあえずソースはこちら。

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でした。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする