こんにちは!Windows Formsアプリの開発で「ユーザーがツールバーを勝手に動かしてしまい、次に起動したときにはグチャグチャになっている…どうにかして元に戻したい!」と頭を悩ませたことはありませんか?
マクロの記録や簡単なフォーム操作から一歩抜け出し、本格的なデスクトップアプリケーションを作ろうとするとき、この「UIの状態保存」は避けて通れない重要ポイントです。
今回は、VB.NETの強力な機能である `ToolStripManager` と `My.Settings` を組み合わせて、ユーザーがカスタマイズしたツールバーのドッキング位置や表示状態を完璧に永続化するテクニックを伝授します。
ここをクリアすれば、Windows Formsのイベント駆動モデルと状態管理の本質がグッと見えてきますよ。さあ、一緒にマスターしていきましょう!
—
なぜツールバーの位置は消えてしまうのか?
Windows Formsの `ToolStrip`(ツールバーやメニューバー)は、ユーザーがドラッグして上下左右にドッキングさせたり、フロート状態(独立したウィンドウ)にしたりできる、非常に柔軟なUIコントロールです。
しかし、これはあくまで「実行時のメモリ上の状態」です。アプリケーションを終了すれば、これらの動的なレイアウト変更はすべて消え去り、次回起動時はデザイン時の初期状態に戻ってしまいます。
これを解決するのが、以下の2つの強力なパートナーです。
1. `ToolStripManager`: アプリケーション全体にあるすべてのツールバーの状態を、たった1行でシリアライズ(バイト列へ変換)してくれる司令塔。
2. `My.Settings`: アプリケーション設定を簡単に保存・読み込みできるVB.NETの標準機能。
この2つを組み合わせれば、複雑な座標計算をしなくても、完璧な状態保存が実現できます。
—
実装の全体像:たったこれだけのステップ
実装の流れは非常にシンプルです。
1. プロジェクトの設定: 設定ファイルに保存用の変数を定義する。
2. 起動時(Loadイベント): 保存されているレイアウトデータを読み込み、`ToolStripManager` に復元させる。
3. 終了時(FormClosingイベント): 現在のツールバーのレイアウトを `ToolStripManager` で取得し、設定ファイルに保存する。
それでは、具体的なコードを見ていきましょう。
—
実装コード(VB.NET)
以下のコードを、メインフォーム(例: `MainForm.vb`)にそのまま組み込んでみてください。
Public Class MainForm
‘ フォームが読み込まれたとき(アプリ起動時)にレイアウトを復元
Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
‘ My.Settings に保存されている文字列(レイアウトデータ)があるかチェック
If Not String.IsNullOrEmpty(My.Settings.ToolBarLayoutSettings) Then
‘ 1. 設定から復元用文字列をバイト配列に変換
Dim settingsBytes() As Byte = Convert.FromBase64String(My.Settings.ToolBarLayoutSettings)
‘ 2. メモリ上のストリームに書き込み
Using ms As New System.IO.MemoryStream(settingsBytes)
‘ 3. ToolStripManagerを使って、フォーム全体のツールバーレイアウトを一括復元!
ToolStripManager.LoadSettings(Me, ms)
End Using
End If
Catch ex As Exception
‘ 予期せぬエラーで起動しなくなるのを防ぐため、失敗時はログを出してデフォルトで起動させる
MessageBox.Show($”ツールバーレイアウトの復元に失敗しました: {ex.Message}”, “警告”, MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Try
End Sub
‘ フォームが閉じられるとき(アプリ終了時)にレイアウトを保存
Private Sub MainForm_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
Try
‘ メモリ上にバイナリデータとしてレイアウトを保存するためのストリームを用意
Using ms As New System.IO.MemoryStream()
‘ 1. ToolStripManagerを使って、現在のツールバーの状態をストリームに保存
ToolStripManager.SaveSettings(Me, ms)
‘ 2. バイト配列をBase64文字列に変換して、My.Settingsに格納できる形にする
My.Settings.ToolBarLayoutSettings = Convert.ToBase64String(ms.ToArray())
‘ 3. 設定をディスク(ユーザー設定ファイル)に書き込む
My.Settings.Save()
End Using
Catch ex As Exception
MessageBox.Show($”ツールバーレイアウトの保存に失敗しました: {ex.Message}”, “エラー”, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
End Class
—
コードの重要なポイントを解説!
ここで、「おや?」と思ったポイントや、VB.NETならではの重要概念を解説します。
1. なぜ Base64 に変換しているの?
`ToolStripManager.SaveSettings` は、状態を「バイト配列(バイナリ)」として出力します。しかし、VB.NETの `My.Settings` で扱いやすいのは、基本的には文字列(String)や数値です。
そのため、バイナリデータを `Convert.FromBase64String` と `Convert.ToBase64String` を使って、文字列とバイト配列の間で上手に変換・往復させています。このテクニックは、ファイルのバイナリ保存などでも頻出するので覚えておくと非常に強力です。
2. 例外処理(Try-Catch)の重要性
プログラミング初学者が陥りやすい罠として、「設定ファイルが破損したときにアプリ自体が起動しなくなる」という事故があります。
上記コードのように `Try…Catch` で囲んでおけば、万が一設定データがおかしくなっても、エラーメッセージを出して「初期状態のツールバー」で安全に起動させることができます。本番アプリではこの「フェイルセーフ」の視点がプロの証です。
—
事前準備:`My.Settings` の設定忘れずに!
このコードを動かす前に、Visual Studio上で1つだけ設定が必要です。
1. ソリューションエクスプローラーから 「マイ プロジェクト (My Project)」 をダブルクリック。
2. 左側タブの 「設定 (Settings)」 をクリック。
3. テーブルに以下の通り入力します。
- 名前 (Name): `ToolBarLayoutSettings`
- 型 (Type): `String`
- スコープ (Scope): `User` (※ここがポイント!Userスコープにしないと保存できません)
- 値 (Value): (空欄のままでOK)
これで準備完了です!
—
よくある落とし穴と回避策
落とし穴1: ツールバーの「名前(Name)」を変更してしまう
`ToolStripManager` は、配置を保存する際に各 `ToolStrip` コントロールの `Name` プロパティを識別子として使っています。
一度アプリをリリースした後に、デザイナでツールバーの名前(例: `ToolStrip1` から `StandardToolStrip` など)を変えてしまうと、保存された設定と一致しなくなり、レイアウト復元時に無視されてしまいます。
ツールバーの名称は、設計初期段階でしっかりと決めて変更しないのが鉄則です。
—
まとめ
いかがでしたか?
今回は `ToolStripManager` と `My.Settings` を駆使して、ユーザーごとのツールバーの配置を完璧に永続化する方法を解説しました。
ここをクリアすれば、単に「画面にボタンを並べるだけのアプリ」から、「ユーザーの使いやすさに寄り添ったプロ仕様のデスクトップアプリケーション」へと大きなステップアップを果たせます。
Visual Basic (VB.NET) は、こうした実用的な機能がフレームワークの標準機能としてしっかりと用意されている、非常に優しく力強い言語です。ぜひご自身のプロジェクトに組み込んで、その便利さを体感してみてくださいね。それでは、次の開発現場でお会いしましょう!
