前提・実現したいこと
以下のような構成でプログラムを開発しています。
フォルダ構成(拡張子無しはフォルダ名) Solution ├ Solution.sln ├ Window1 │ ├ frmMain.vb │ ├ frmMain.Designer.vb │ ├ frmMain.resx │ ├ Config.vb │ └ Window1.vbproj │ etc. └ Window2 ├ frmMain.vb ├ frmMain.Designer.vb ├ frmMain.resx ├ Config.vb └ Window2.vbproj etc.
1つのソリューションの中に複数のVBプロジェクトが入っています。
1プロジェクトごとに「帳票をプリントする際のプリンターを選択する」などの設定ができるようにしてあります。
設定はConfig.vbで実装し、.configファイル(中身はXML)で保存しています。
VB
1' Window1\Config.vb 2Public Module Config 3 4#Region "プロパティ" 5 6 ''' <summary>プリンタ名称</summary> 7 Public ReadOnly Property PrinterName As String 8 Get 9 Return _settingVo.PrinterName 10 End Get 11 End Property 12 13#End Region 14 15#Region "Private変数" 16 17 ''' <summary>設定情報</summary> 18 Private _settingVo As New ConfigData 19 20 ''' <summary>設定ファイルのフォルダ</summary> 21 Private Const _settingFolder As String = "設定\個別" 22 23 ''' <summary>設定ファイルのフォルダ</summary> 24 Public ReadOnly Property SettingFolder As String 25 Get 26 Return _settingFolder 27 End Get 28 End Property 29 30 ''' <summary>設定ファイルの名称</summary> 31 Private Const _settingFileName As String = "Window1.config" 32 33 ''' <summary>設定ファイルの名称</summary> 34 Public ReadOnly Property SettingFileName As String 35 Get 36 Return _settingFileName 37 End Get 38 End Property 39 40#End Region 41 42#Region "Friendメソッド" 43 44 ''' <summary> 45 ''' 設定ファイルの取得 46 ''' </summary> 47 ''' <remarks></remarks> 48 Friend Sub getSettingData() 49 Try 50 '設定ファイルからデータを取得 51 MyProject.Utils.FileUtils.ReadXmlToObject(_settingVo, System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), _settingFolder, _settingFileName)) 52 Catch ex As Exception 53 Throw New Exception("設定ファイル取得に失敗しました。" & " : " & ex.Message, ex) 54 End Try 55 End Sub 56 57 ''' <summary> 58 ''' 設定ファイルの保存 59 ''' </summary> 60 ''' <remarks></remarks> 61 Friend Sub saveSettingData() 62 Try 63 '設定ファイルからデータを保存 64 MyProject.Utils.FileUtils.WriteXmlFromObject(_settingVo, System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), _settingFolder, _settingFileName)) 65 Catch ex As Exception 66 Throw New Exception("設定ファイル書き込みに失敗しました。" & " : " & ex.Message, ex) 67 End Try 68 End Sub 69 70#End Region 71 72#Region "設定情報クラス" 73 74 ''' <summary> 設定情報 </summary> 75 Public Class ConfigData 76 77 ''' <summary>プリンタ名称</summary> 78 Public Property PrinterName As String = "" 79 80 End Class 81 82#End Region 83 84End Module 85
VB
1 2Imports System.Diagnostics 3Imports System.IO 4Imports System.Text 5Imports System.Xml.Serialization 6 7Namespace Utils 8 9 Public Class FileUtils 10 11 ''' <summary> 12 ''' XMLファイルの読み込み 13 ''' </summary> 14 ''' <param name="obj">読み込みデータ格納先</param> 15 ''' <param name="xmlPath">XMLファイルのパス</param> 16 Public Shared Sub ReadXmlToObject(ByRef obj As Object, ByVal xmlPath As String) 17 If Not File.Exists(xmlPath) Then Return 18 19 Dim serializer As New XmlSerializer(obj.GetType) 20 Try 21 Using fs = New FileStream(xmlPath, FileMode.Open) 22 obj = serializer.Deserialize(fs) 23 End Using 24 Catch ex As Exception 25 Throw New Exception("XML読み込みに失敗しました。" & " : " & ex.Message & " ⇒ " & xmlPath, ex) 26 End Try 27 End Sub 28 29 ''' <summary> 30 ''' XMLファイルの書き込み 31 ''' </summary> 32 ''' <param name="obj">書き込み対象データ</param> 33 ''' <param name="xmlPath">XMLファイルのパス</param> 34 Public Shared Sub WriteXmlFromObject(ByRef obj As Object, ByVal xmlPath As String) 35 Dim serializer As New XmlSerializer(obj.GetType) 36 Try 37 If Not Directory.Exists(Path.GetDirectoryName(xmlPath)) Then Directory.CreateDirectory(Path.GetDirectoryName(xmlPath)) 38 39 Using fs = New FileStream(xmlPath, FileMode.Create) 40 serializer.Serialize(fs, obj) 41 End Using 42 Catch ex As Exception 43 Throw New Exception("XML書き込みに失敗しました。" & " : " & ex.Message & " ⇒ " & xmlPath, ex) 44 End Try 45 End Sub 46 47End Namespace 48
XML
1こんなXMLファイルを出力します。 2<?xml version="1.0"?> 3<ConfigData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 4 <PrinterName>Microsoft Print to PDF</PrinterName> 5</ConfigData>
発生している問題・エラーメッセージ
Window1とWindow2で設定を共有したい状況が出てきました。
詳細に申し上げますと「設定がONの場合Window1の画面でボタンを表示・Window2の画面でボタンを非表示、設定がOFFの場合はその逆」を実装したいです。
現在Window1だけの設定はできますが、getSettingDataをFriendにしているため、Window2からWindow1の設定を見ることができません。
上記の場合どう対応するのがベストか、お知恵をお貸しいただければと思います。
- 全画面共通のコンフィグを作成する?
→「A設定は1と2の画面で使うが、B画面は1と3でしか使わない」といった場合、煩雑にならないか?
- Window1のgetSettingDataをPublicにする?
→修正時に影響範囲が広くなってテストしづらくならないか?
2. Window1の設定を変更したらWindow2の設定も変更されるプロパティ(画面上には表示させない)をWindow2\Config.vbに作成する?
→設定の変更画面は同じ場所なのでできなくもない?(プログラムのイメージは湧きませんが)
「自分なら〇番の方法をとる」というご意見でもありがたいです。
他にも方法がございましたらご教授ください。
また、情報が足りないようでしたらお手数ではございますがコメントください。
補足情報(FW/ツールのバージョンなど)
Visual Basic 2012
Visual Studio 2017
Windows Form
.NET Framework 4 Client Profile

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。