回答編集履歴

4

補足を追記

2019/02/10 04:40

投稿

kenshirou
kenshirou

スコア772

test CHANGED
@@ -154,6 +154,8 @@
154
154
 
155
155
  共有・非共有(=インスタンス)をよく理解することが必要ですが、一応、この継承クラスの保守とフォームデザイン構築を独立させることが可能となります。
156
156
 
157
+ これなら、ボタンの配置が同一コンテナ・同一フォームでなくともOKです。
158
+
157
159
 
158
160
 
159
161
  短所としては、一括変更したいプロパティの分だけ共有イベント関連のコードを用意する必要があることです。

3

表記の重複を削除

2019/02/10 04:40

投稿

kenshirou
kenshirou

スコア772

test CHANGED
@@ -41,8 +41,6 @@
41
41
  3.この共有イベントのハンドラ内で指定プロパティ値の設定を行うようにすれば、このクラスのインスタンスすべてでこのイベントハンドラの処理が行われる。
42
42
 
43
43
 
44
-
45
- 共有・非共有(=インスタンス)をよく理解することが必要ですが、一応、この継承クラスの保守とフォームデザイン構築を独立させることが可能となります。
46
44
 
47
45
  以下にボタンの継承クラス(ExButton)を使用した例を示します。
48
46
 

2

別方法の追記

2019/02/10 04:37

投稿

kenshirou
kenshirou

スコア772

test CHANGED
@@ -1,8 +1,6 @@
1
1
  デザインの制約がありますが、例えば同じグループの「ButtonA2」と「ButtonB2」を同じパネル等コンテナ上に配置することができるのであれば、以下の方法で対応できます。
2
2
 
3
3
  (以下の例では「ButtonA2」と「ButtonB2」をパネル「Panel2」上に配置したものとします。)
4
-
5
-
6
4
 
7
5
  ```VB
8
6
 
@@ -22,8 +20,146 @@
22
20
 
23
21
  ```
24
22
 
25
-
26
-
27
23
  これならば、「ButtonC2」「ButtonD2」…とボタンが増えても、このグループのコンテナ上にボタンを追加するだけで、同グループのボタンと同様に扱ってくれます。
28
24
 
29
25
  ただし、デザインの制約上、同じグループのボタンを同じコンテナに配置できない場合は、YAmaGNZ様例示のように、グループ化したいボタン等コントロールをリスト化することになります(おそらくリスト化はフォームのコンストラクタかフォームロード時に行う)が、この場合、ボタン追加をする場合にはデザインとコードの両方の編集が必要となります。
26
+
27
+ ### 追記
28
+
29
+ ちょっと考え方を変えてみました。
30
+
31
+ 概要は以下の通りです。
32
+
33
+
34
+
35
+ 1.Buttonクラスを継承したクラスを作成。
36
+
37
+   同じグループのボタンはすべてこのクラスのものでデザインする。
38
+
39
+ 2.このクラス内に共有イベントを用意して、上記ボタンの対象プロパティに変更があったら、このクラスの共有イベントを発生させる。
40
+
41
+ 3.この共有イベントのハンドラ内で指定プロパティ値の設定を行うようにすれば、このクラスのインスタンスすべてでこのイベントハンドラの処理が行われる。
42
+
43
+
44
+
45
+ 共有・非共有(=インスタンス)をよく理解することが必要ですが、一応、この継承クラスの保守とフォームデザイン構築を独立させることが可能となります。
46
+
47
+ 以下にボタンの継承クラス(ExButton)を使用した例を示します。
48
+
49
+
50
+
51
+ **継承クラスと共有イベント引数用クラス**
52
+
53
+ ```VB
54
+
55
+ Public Class ExButton
56
+
57
+ Inherits Button
58
+
59
+
60
+
61
+ Private Shared Event ExBackColorChanged(ByVal e As EventArgs)
62
+
63
+
64
+
65
+ Public Sub New()
66
+
67
+ AddHandler ExButton.ExBackColorChanged, AddressOf btn_ExBackColorChanged
68
+
69
+ End Sub
70
+
71
+
72
+
73
+ Public Property GroupID As String = String.Empty
74
+
75
+
76
+
77
+ Public Overrides Property BackColor As Color
78
+
79
+ Get
80
+
81
+ Return MyBase.BackColor
82
+
83
+ End Get
84
+
85
+ Set(value As Color)
86
+
87
+ If value <> MyBase.BackColor Then
88
+
89
+ MyBase.BackColor = value
90
+
91
+ Dim e As New ExButtonEventArgs
92
+
93
+ e.BackColor = value
94
+
95
+ e.GroupID = Me.GroupID
96
+
97
+ RaiseEvent ExBackColorChanged(e)
98
+
99
+ End If
100
+
101
+ End Set
102
+
103
+ End Property
104
+
105
+
106
+
107
+ Private Sub btn_ExBackColorChanged(ByVal e As ExButtonEventArgs)
108
+
109
+ If e.GroupID = Me.GroupID Then
110
+
111
+ Me.BackColor = e.BackColor
112
+
113
+ End If
114
+
115
+ End Sub
116
+
117
+ End Class
118
+
119
+
120
+
121
+ Public Class ExButtonEventArgs
122
+
123
+ Inherits EventArgs
124
+
125
+
126
+
127
+ Public Property BackColor As Color
128
+
129
+ Public Property GroupID As String
130
+
131
+ End Class
132
+
133
+ ```
134
+
135
+
136
+
137
+ **プロパティ変更箇所サンプルソース**
138
+
139
+ ```VB
140
+
141
+ Private Sub Button_Change_Click(sender As Object, e As EventArgs) Handles Button_Change.Click
142
+
143
+ '任意のボタンの背景色を変えると、他の同一クラスのボタンの背景色も変わる。
144
+
145
+ ExButton1.BackColor = Color.FromArgb(100, 100, 255)
146
+
147
+ End Sub
148
+
149
+ ```
150
+
151
+ この継承クラスのGroupIDプロパティを、デザイン時にでも各グループに応じて設定すれば良いです。
152
+
153
+ (上記例ではこのプロパティの型をStringにしていますが、Integerに変更してもいいでしょう。)
154
+
155
+
156
+
157
+ 共有・非共有(=インスタンス)をよく理解することが必要ですが、一応、この継承クラスの保守とフォームデザイン構築を独立させることが可能となります。
158
+
159
+
160
+
161
+ 短所としては、一括変更したいプロパティの分だけ共有イベント関連のコードを用意する必要があることです。
162
+
163
+ (ちょっとやりすぎ感もあったりします。)
164
+
165
+ また、ボタン以外のコントロールにも同じようなことを行うには、そのコントロール用の継承クラスを用意する必要があります。

1

表現の修正

2019/02/10 04:29

投稿

kenshirou
kenshirou

スコア772

test CHANGED
@@ -24,6 +24,6 @@
24
24
 
25
25
 
26
26
 
27
- これならば、「ButtonC2」「ButtonD2」…とボタンが増えても、このグループのコンテナに配置するだけでOKです。
27
+ これならば、「ButtonC2」「ButtonD2」…とボタンが増えても、このグループのコンテナボタンを追加するだけで、同グループのボタンと同様に扱ってくれます。
28
28
 
29
29
  ただし、デザインの制約上、同じグループのボタンを同じコンテナに配置できない場合は、YAmaGNZ様例示のように、グループ化したいボタン等コントロールをリスト化することになります(おそらくリスト化はフォームのコンストラクタかフォームロード時に行う)が、この場合、ボタン追加をする場合にはデザインとコードの両方の編集が必要となります。