回答編集履歴
4
補足を追記
answer
CHANGED
@@ -76,6 +76,7 @@
|
|
76
76
|
(上記例ではこのプロパティの型をStringにしていますが、Integerに変更してもいいでしょう。)
|
77
77
|
|
78
78
|
共有・非共有(=インスタンス)をよく理解することが必要ですが、一応、この継承クラスの保守とフォームデザイン構築を独立させることが可能となります。
|
79
|
+
これなら、ボタンの配置が同一コンテナ・同一フォームでなくともOKです。
|
79
80
|
|
80
81
|
短所としては、一括変更したいプロパティの分だけ共有イベント関連のコードを用意する必要があることです。
|
81
82
|
(ちょっとやりすぎ感もあったりします。)
|
3
表記の重複を削除
answer
CHANGED
@@ -20,7 +20,6 @@
|
|
20
20
|
2.このクラス内に共有イベントを用意して、上記ボタンの対象プロパティに変更があったら、このクラスの共有イベントを発生させる。
|
21
21
|
3.この共有イベントのハンドラ内で指定プロパティ値の設定を行うようにすれば、このクラスのインスタンスすべてでこのイベントハンドラの処理が行われる。
|
22
22
|
|
23
|
-
共有・非共有(=インスタンス)をよく理解することが必要ですが、一応、この継承クラスの保守とフォームデザイン構築を独立させることが可能となります。
|
24
23
|
以下にボタンの継承クラス(ExButton)を使用した例を示します。
|
25
24
|
|
26
25
|
**継承クラスと共有イベント引数用クラス**
|
2
別方法の追記
answer
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
デザインの制約がありますが、例えば同じグループの「ButtonA2」と「ButtonB2」を同じパネル等コンテナ上に配置することができるのであれば、以下の方法で対応できます。
|
2
2
|
(以下の例では「ButtonA2」と「ButtonB2」をパネル「Panel2」上に配置したものとします。)
|
3
|
-
|
4
3
|
```VB
|
5
4
|
Private Sub Button_Change_Click(sender As Object, e As EventArgs) Handles Button_Change.Click
|
6
5
|
For Each ctr As Control In Panel2.Controls
|
@@ -10,6 +9,75 @@
|
|
10
9
|
Next
|
11
10
|
End Sub
|
12
11
|
```
|
12
|
+
これならば、「ButtonC2」「ButtonD2」…とボタンが増えても、このグループのコンテナ上にボタンを追加するだけで、同グループのボタンと同様に扱ってくれます。
|
13
|
+
ただし、デザインの制約上、同じグループのボタンを同じコンテナに配置できない場合は、YAmaGNZ様例示のように、グループ化したいボタン等コントロールをリスト化することになります(おそらくリスト化はフォームのコンストラクタかフォームロード時に行う)が、この場合、ボタン追加をする場合にはデザインとコードの両方の編集が必要となります。
|
14
|
+
### 追記
|
15
|
+
ちょっと考え方を変えてみました。
|
16
|
+
概要は以下の通りです。
|
13
17
|
|
18
|
+
1.Buttonクラスを継承したクラスを作成。
|
19
|
+
同じグループのボタンはすべてこのクラスのものでデザインする。
|
20
|
+
2.このクラス内に共有イベントを用意して、上記ボタンの対象プロパティに変更があったら、このクラスの共有イベントを発生させる。
|
14
|
-
これ
|
21
|
+
3.この共有イベントのハンドラ内で指定プロパティ値の設定を行うようにすれば、このクラスのインスタンスすべてでこのイベントハンドラの処理が行われる。
|
22
|
+
|
15
|
-
|
23
|
+
共有・非共有(=インスタンス)をよく理解することが必要ですが、一応、この継承クラスの保守とフォームデザイン構築を独立させることが可能となります。
|
24
|
+
以下にボタンの継承クラス(ExButton)を使用した例を示します。
|
25
|
+
|
26
|
+
**継承クラスと共有イベント引数用クラス**
|
27
|
+
```VB
|
28
|
+
Public Class ExButton
|
29
|
+
Inherits Button
|
30
|
+
|
31
|
+
Private Shared Event ExBackColorChanged(ByVal e As EventArgs)
|
32
|
+
|
33
|
+
Public Sub New()
|
34
|
+
AddHandler ExButton.ExBackColorChanged, AddressOf btn_ExBackColorChanged
|
35
|
+
End Sub
|
36
|
+
|
37
|
+
Public Property GroupID As String = String.Empty
|
38
|
+
|
39
|
+
Public Overrides Property BackColor As Color
|
40
|
+
Get
|
41
|
+
Return MyBase.BackColor
|
42
|
+
End Get
|
43
|
+
Set(value As Color)
|
44
|
+
If value <> MyBase.BackColor Then
|
45
|
+
MyBase.BackColor = value
|
46
|
+
Dim e As New ExButtonEventArgs
|
47
|
+
e.BackColor = value
|
48
|
+
e.GroupID = Me.GroupID
|
49
|
+
RaiseEvent ExBackColorChanged(e)
|
50
|
+
End If
|
51
|
+
End Set
|
52
|
+
End Property
|
53
|
+
|
54
|
+
Private Sub btn_ExBackColorChanged(ByVal e As ExButtonEventArgs)
|
55
|
+
If e.GroupID = Me.GroupID Then
|
56
|
+
Me.BackColor = e.BackColor
|
57
|
+
End If
|
58
|
+
End Sub
|
59
|
+
End Class
|
60
|
+
|
61
|
+
Public Class ExButtonEventArgs
|
62
|
+
Inherits EventArgs
|
63
|
+
|
64
|
+
Public Property BackColor As Color
|
65
|
+
Public Property GroupID As String
|
66
|
+
End Class
|
67
|
+
```
|
68
|
+
|
69
|
+
**プロパティ変更箇所サンプルソース**
|
70
|
+
```VB
|
71
|
+
Private Sub Button_Change_Click(sender As Object, e As EventArgs) Handles Button_Change.Click
|
72
|
+
'任意のボタンの背景色を変えると、他の同一クラスのボタンの背景色も変わる。
|
73
|
+
ExButton1.BackColor = Color.FromArgb(100, 100, 255)
|
74
|
+
End Sub
|
75
|
+
```
|
76
|
+
この継承クラスのGroupIDプロパティを、デザイン時にでも各グループに応じて設定すれば良いです。
|
77
|
+
(上記例ではこのプロパティの型をStringにしていますが、Integerに変更してもいいでしょう。)
|
78
|
+
|
79
|
+
共有・非共有(=インスタンス)をよく理解することが必要ですが、一応、この継承クラスの保守とフォームデザイン構築を独立させることが可能となります。
|
80
|
+
|
81
|
+
短所としては、一括変更したいプロパティの分だけ共有イベント関連のコードを用意する必要があることです。
|
82
|
+
(ちょっとやりすぎ感もあったりします。)
|
83
|
+
また、ボタン以外のコントロールにも同じようなことを行うには、そのコントロール用の継承クラスを用意する必要があります。
|
1
表現の修正
answer
CHANGED
@@ -11,5 +11,5 @@
|
|
11
11
|
End Sub
|
12
12
|
```
|
13
13
|
|
14
|
-
これならば、「ButtonC2」「ButtonD2」…とボタンが増えても、このグループのコンテナに
|
14
|
+
これならば、「ButtonC2」「ButtonD2」…とボタンが増えても、このグループのコンテナ上にボタンを追加するだけで、同グループのボタンと同様に扱ってくれます。
|
15
15
|
ただし、デザインの制約上、同じグループのボタンを同じコンテナに配置できない場合は、YAmaGNZ様例示のように、グループ化したいボタン等コントロールをリスト化することになります(おそらくリスト化はフォームのコンストラクタかフォームロード時に行う)が、この場合、ボタン追加をする場合にはデザインとコードの両方の編集が必要となります。
|