こんにちは!VB.NETでのデスクトップアプリ開発、楽しんでいますか?
「アプリを起動するたびに、毎回ウィンドウのサイズを調整し直すのが面倒……」「前回の入力履歴がそのまま残っていれば便利なのに……」そんなユーザーからの小さな不満、実はたった数行のコードとVBの強力な機能で美しく解決できるんです。
今回は、VB.NETの秘められた(しかし極めて強力な)機能である `My.Settings` を使って、ウィンドウの位置・サイズやユーザーの設定を自動で保存・復元する極上のテクニックを伝授します。
ここをクリアすれば、あなたの作るWindows Formsアプリケーションは、一気に「プロのプロダクト」のような心地よい操作性を手に入れますよ。さあ、一緒にマスターしていきましょう!
—
1. なぜ「My.Settings」なのか?(知られざる永続化の本質)
デスクトップアプリを作るとき、データの保存先としてテキストファイルやレジストリ、あるいはSQLiteなどを検討しがちです。しかし、ウィンドウの座標やちょっとしたフラグといった「アプリケーションの環境設定」を保存するためだけに、大げさな仕組みを作るのはオーバーワーク(過剰品質)です。
VB.NETには、`My.Settings` という、アプリケーション設定専用の超軽量かつ安全なストレージがあらかじめ用意されています。
- 面倒なファイルパスの指定が不要: 保存先はOSがユーザーごとに適切な場所(AppData等)を自動管理してくれます。
- 型安全(Type-safe): 文字列だけでなく、IntegerやBoolean、さらには独自のデータ構造まで、コンパイラの恩恵を受けながら安全に読み書きできます。
- 自動保存の魔力: 設定値に変更があった際、簡単なメソッドを呼ぶだけで裏側でXMLファイルとして綺麗に永続化されます。
それでは、具体的な実装の手順を見ていきましょう!
—
2. 実装のステップ:3分でできる設定の魔法
今回は実例として、「アプリを閉じるときのウィンドウの位置とサイズを記憶し、次に開いたときに同じ場所・サイズで復元する」 機能を作ります。
ステップ①:Visual Studioのデザイン画面で設定を定義する
まずは、アプリに「何を記憶させるか」を教えましょう。
1. Visual Studioのソリューションエクスプローラーから、「My Project」(または「プロジェクトプロパティ」)をダブルクリックします。
2. 左側のタブから 「設定」 を選択します。
3. まだ何も登録されていない場合は、「ここをクリックして新しい設定を作成してください」というリンクをクリックします。
4. 以下のように設定を追加します。
| 名前 (Name) | 型 (Type) | スコープ (Scope) | 初期値 (Value) |
| :— | :— | :— | :— |
| `WindowLeft` | Integer | ユーザー (User) | `-1` |
| `WindowTop` | Integer | ユーザー (User) | `-1` |
| `WindowWidth` | Integer | ユーザー (User) | `800` |
| `WindowHeight` | Integer | ユーザー (User) | `600` |
※スコープを「アプリケーション」ではなく「ユーザー」にするのがポイントです。ユーザーごとに値が書き換わるためです。
—
ステップ②:コードを書いて魂を吹き込む
次に、フォームのコード(`Form1.vb`)を記述します。
ここで重要なのは、「いつ読み込み、いつ保存するか」のライフサイクル管理です。アプリが起動する瞬間(`Load`イベント)と、閉じようとする瞬間(`FormClosing`イベント)にフックします。
以下のコードをそのままフォームに貼り付けてみてください。
Public Class Form1
‘ ==========================================================
‘ 起動時:保存されていたウィンドウの位置とサイズを復元する
‘ ==========================================================
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
‘ 初回起動時や異常値防止のため、幅と高さが妥当かチェック
If My.Settings.WindowWidth > 100 AndAlso My.Settings.WindowHeight > 100 Then
‘ ウィンドウの表示スタイルを「通常」に戻す(最小化・最大化でのバグを防ぐ)
Me.WindowState = FormWindowState.Normal
‘ 位置とサイズを適用
Me.Width = My.Settings.WindowWidth
Me.Height = My.Settings.WindowHeight
‘ 画面外にウィンドウが飛び出していないか簡易チェック(マルチディスプレイ対策の第一歩)
If My.Settings.WindowLeft >= 0 AndAlso My.Settings.WindowTop >= 0 Then
Me.StartPosition = FormStartPosition.Manual
Me.Location = New Point(My.Settings.WindowLeft, My.Settings.WindowTop)
End If
End If
End Sub
‘ ==========================================================
‘ 終了時:現在のウィンドウの位置とサイズをMy.Settingsに記録する
‘ ==========================================================
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
‘ もし現在「最大化」や「最小化」されている場合、
‘ その極端なサイズを保存してしまうと次回起動時に困るので通常のサイズを保存する
If Me.WindowState = FormWindowState.Normal Then
My.Settings.WindowLeft = Me.Location.X
My.Settings.WindowTop = Me.Location.Y
My.Settings.WindowWidth = Me.Width
My.Settings.WindowHeight = Me.Height
End If
‘ 設定をディスクに書き出す(これを忘れるとメモリ上にしか残りません!)
My.Settings.Save()
End Sub
End Class
—
3. 現場で役立つ!エンジニアの知見と「陥りやすい罠」
上記のコードは非常にシンプルですが、現場のプロとして「これだけは知っておいてほしい注意点」がいくつかあります。
罠その1:`My.Settings.Save()` を書き忘れる
コード内で `My.Settings.WindowWidth = 1000` のように値を書き換えても、`My.Settings.Save()` を明示的に呼ばないと、アプリを終了したときにディスクへ保存されません。 終了時イベント(`FormClosing`)には必ず `Save()` をセットで記述する癖をつけましょう。
罠その2:マルチディスプレイ環境での「神隠し」現象
ユーザーが会社で外部モニター(デュアルディスプレイ)につないでアプリを右側の画面に配置し、自宅に持ち帰ってノートPC単体(シングルディスプレイ)で起動したとき……なんと、ウィンドウが画面外の存在しない空間に配置され、二度と姿を見せない(操作不能になる)という恐ろしい現象(通称:神隠し)が発生します。
これを防ぐためのワンランク上のアプローチとして、起動時に「現在のPCの画面領域(`Screen.GetWorkingArea`)内にウィンドウが収まっているか」を判定し、収まっていなければデフォルト位置に強制リセットするロジックを入れると、完璧なアプリケーションになります。
—
まとめ
いかがでしょうか?
`My.Settings` を使いこなせるようになると、VB.NETでのUI開発のフットワークが劇的に軽くなります。
- 設定の定義はプロジェクトのプロパティから。
- 読み込みは `Load` イベントで、保存は `FormClosing` + `My.Settings.Save()` で。
- 最大化・最小化時のステートや画面外への飛び出しに気を配る。
ここをクリアすれば、あなたの作るアプリケーションの「使いやすさ」は一段と跳ね上がります。ぜひ次の開発案件や自作ツールで試してみてくださいね。
Visual Basicの基本は、こうした「痒いところに手が届く機能」をいかにスマートに使いこなすかです。これからも一緒にレベルアップしていきましょう!
