teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

補足を追記

2019/02/10 04:40

投稿

kenshirou
kenshirou

スコア772

answer CHANGED
@@ -76,6 +76,7 @@
76
76
  (上記例ではこのプロパティの型をStringにしていますが、Integerに変更してもいいでしょう。)
77
77
 
78
78
  共有・非共有(=インスタンス)をよく理解することが必要ですが、一応、この継承クラスの保守とフォームデザイン構築を独立させることが可能となります。
79
+ これなら、ボタンの配置が同一コンテナ・同一フォームでなくともOKです。
79
80
 
80
81
  短所としては、一括変更したいプロパティの分だけ共有イベント関連のコードを用意する必要があることです。
81
82
  (ちょっとやりすぎ感もあったりします。)

3

表記の重複を削除

2019/02/10 04:40

投稿

kenshirou
kenshirou

スコア772

answer CHANGED
@@ -20,7 +20,6 @@
20
20
  2.このクラス内に共有イベントを用意して、上記ボタンの対象プロパティに変更があったら、このクラスの共有イベントを発生させる。
21
21
  3.この共有イベントのハンドラ内で指定プロパティ値の設定を行うようにすれば、このクラスのインスタンスすべてでこのイベントハンドラの処理が行われる。
22
22
 
23
- 共有・非共有(=インスタンス)をよく理解することが必要ですが、一応、この継承クラスの保守とフォームデザイン構築を独立させることが可能となります。
24
23
  以下にボタンの継承クラス(ExButton)を使用した例を示します。
25
24
 
26
25
  **継承クラスと共有イベント引数用クラス**

2

別方法の追記

2019/02/10 04:37

投稿

kenshirou
kenshirou

スコア772

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
- これならば、「ButtonC2」「ButtonD2」…とボタンが増えても、このグループテナ上にボタンを追加るだけ、同グループボタと同様に扱ってくます
21
+ 3.の共有イベントのハンドラ内で指定プロパティ値の設定を行うようにすれば、このクラスタンべてイベトハンドラの処理が行わ
22
+
15
- ただし、デザインの制約上、同じグループのボタンを同じコンテナに配置できない場合は、YAmaGNZ様例示のうに、グループ化したいボタン等コントロールをリスト化することになりま(おそらくリスト化はフォームコンストラタかフォームロード時に行う)が、この場合、ボタン追加をする場合にはデザインとコードの両方の編集必要となります。
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

表現の修正

2019/02/10 04:29

投稿

kenshirou
kenshirou

スコア772

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