フォームの位置・サイズをJSON形式で読み書きする

この記事は、レコードデータをJSON形式で読み書きするの記事の続きです。

 
今回は「フォームの位置・サイズをJSON形式で読み書きする」というテーマで
書いていきたいと思います。

 
前回と同様に、こちらのサイトを参考にさせてもらいました。

・TJsonSerializerの使い方。
 ⇒ https://lyna.hateblo.jp/entry/20170331/1490975195
・TJsonSerializerの実用例
 ⇒ https://lyna.hateblo.jp/entry/20170402/1491141694

上記のサイトで解説されているように、
フォームのプロパティをJSON形式で読み書きしてみようかと思います。

 
まず事前準備として、interface部のusesに以下を追加します。

 
次にフォームの宣言前に

を記述します。位置的にはこんな(↓)感じ。

 
次に、保存したいプロパティの再宣言をします。

こういうもんだと覚えた方が早いかもしれません。
これらを保存したいフォームすべてに追記します。

追記を忘れるとスタックオーバーフローを起こしたりして
うまく動かないと思います。

プロパティについては必要に応じて追加するなどしてください。

これをアプリケーションで使用しているすべてのフォームに対して行います。

これで準備完了。

 
テストソースとしてはこちら。

フォームにボタンコンポーネントを置いて
次の様なイベントハンドラを設定します。

 
クリップボードを使用しているので、
usesにclipbrdを追加してください。

実行すると、こんな感じでデータがクリップボードにコピーされます。

{“Name”:”Form1″,”Left”:87,”Top”:63,”width”:1668,”height”:987,”WindowState”:0}

後はすべてのフォームに対して行ってあげればOK。

 
....とはいきません。

 
この点に関しては、こちらのサイトを参考にさせていただきました。
・ウィンドウ位置の正しい復元
 ⇒ https://www.ruche-home.net/program/tips/window-place

ここで問題となるのは、

・フォームを最大化表示や最小化表示で終了した場合

です。

先ほど提示したやり方でフォーム位置を保存・復帰させてみると、
フォームを最大化して終了させ、再度起動した場合に
フォームサイズが最大化した時のサイズになってしまいます。

ということで、残念ながらこの方法は使えないという事になります。

フォームの最大化や最小化を使わないフォームであれば使えるかと思います。

この方法が使えるのであれば、いちいちレコードを作らなくて良いので
いいかなと思ったんですけどね。

以下に紹介するGetWindowPlacement関数で通常のフォームサイズを取得し、
クラスヘルパーでプロパティ化して上記の方法でできないか試してみたのですが、
どういうわけか内部エラーが出てコンパイルできませんでした。

 
ということで、サイズを変更できるフォームを使うアプリケーションに関しては
別の方法を考える必要があります。

これまでのやり方通り、
レコードを用いてデータを読み書きする方法を考えます。

最大化、最小化中のフォームサイズの取得については
GetWindowPlacement関数を使用します。
 

ということで、以下サンプルソースです。

NP_CutFirstについては、指定した文字列で文字列分割をご覧ください。
 

この他に、画面解像度の変更とマルチモニタに関する問題点がありますが、
それに関しては記事を改めて。

また、ファイルから読込・保存するタイミングについても記事を改めて。

シェアする

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

フォローする