回答編集履歴

1

追記

2020/03/30 08:34

投稿

YAmaGNZ
YAmaGNZ

スコア10489

test CHANGED
@@ -1 +1,195 @@
1
1
  各ライブラリで終わる時にイベントを発生させて、メイン側でそれを処理すればいいのではないでしょうか。
2
+
3
+
4
+
5
+
6
+
7
+ ### 追記
8
+
9
+ 微妙に違います。
10
+
11
+
12
+
13
+ DLL側で適切なところで下記のようにイベントを定義して
14
+
15
+ ```VBNET
16
+
17
+ Public Event SubProjectEnd(sender As Object, e As EventArgs)
18
+
19
+ ```
20
+
21
+ 終了する時に下記のようにイベントを発生させます。
22
+
23
+ ```VBNET
24
+
25
+ Private Sub CloseButton_Click(sender As Object, e As EventArgs) Handles CloseButton.Click
26
+
27
+ Me.Close()
28
+
29
+ RaiseEvent SubProjectEnd(Me, EventArgs.Empty)
30
+
31
+ End Sub
32
+
33
+ ```
34
+
35
+
36
+
37
+ メイン側では
38
+
39
+ ```VBNET
40
+
41
+ Private SubProjectInstance1 As SubProject.Form1
42
+
43
+
44
+
45
+ Private Sub Button1 click …以下略
46
+
47
+   'サブプロジェクト3の初期フォームインスタンスを生成
48
+
49
+   Me.SubProjectInstance1 = New SubProject.Form1
50
+
51
+ 'イベントハンドラを設定
52
+
53
+ AddHandler SubProjectInstance1.SubProjectEnd, AddressOf SubProject_SubProjectEnd
54
+
55
+
56
+
57
+   '画面に表示
58
+
59
+   Me.SubProjectInstance1.show()
60
+
61
+   'ログイン情報を設定
62
+
63
+   Me.SubProjectInstance1.部署名.Text = Login.Syain.Dname
64
+
65
+   Me.SubProjectInstance1.氏名.Text = Login.Syain.Name
66
+
67
+ End Sub
68
+
69
+
70
+
71
+ Private Sub SubProject_SubProjectEnd(sender As Object, e As EventArgs)
72
+
73
+ 'イベントハンドラを削除
74
+
75
+ RemoveHandler SubProjectInstance1.SubProjectEnd, AddressOf SubProject_SubProjectEnd
76
+
77
+
78
+
79
+ '処理が終わったのでLoginフォームを表示
80
+
81
+ End Sub
82
+
83
+ ```
84
+
85
+
86
+
87
+ といった感じで各ライブラリからの終了イベントを受け取って、希望の処理を行うようにするということです。
88
+
89
+
90
+
91
+ ---
92
+
93
+ P.S.
94
+
95
+ 各ライブラリのインターフェースを考え直したほうが良さそうに思えます。
96
+
97
+ 質問に提示された部分ですと
98
+
99
+ ライブラリ側を
100
+
101
+ ```VBNET
102
+
103
+ Public Class SubProject
104
+
105
+ Public Property 部署名 As String
106
+
107
+ Public Property 氏名 As String
108
+
109
+
110
+
111
+ Public Event SubProjectEnd(sender As Object, e As EventArgs)
112
+
113
+
114
+
115
+ Public Sub ShowForm()
116
+
117
+ Form1.部署名.Text = 部署名
118
+
119
+ Form1.氏名.Text = 氏名
120
+
121
+ Form1.Show()
122
+
123
+ End Sub
124
+
125
+
126
+
127
+ ' 処理が終わったら、このメソッドを呼び出して終了を通知する
128
+
129
+ Friend Sub ProjectEnd()
130
+
131
+ RaiseEvent SubProjectEnd(Me, EventArgs.Empty)
132
+
133
+ End Sub
134
+
135
+ End Class
136
+
137
+ ```
138
+
139
+ メイン側を
140
+
141
+ ```VBNET
142
+
143
+ Private SubProjectInstance1 As SubProject
144
+
145
+
146
+
147
+ Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
148
+
149
+   'サブプロジェクト1のインスタンスを生成
150
+
151
+   Me.SubProjectInstance1 = New SubProject
152
+
153
+
154
+
155
+ 'イベントハンドラを設定
156
+
157
+ AddHandler SubProjectInstance1.SubProjectEnd, AddressOf SubProject_SubProjectEnd
158
+
159
+
160
+
161
+   'ログイン情報を設定
162
+
163
+   Me.SubProjectInstance1.部署名 = Login.Syain.Dname
164
+
165
+   Me.SubProjectInstance1.氏名 = Login.Syain.Name
166
+
167
+
168
+
169
+   '画面を表示
170
+
171
+   Me.SubProjectInstance1.ShowForm()
172
+
173
+ End Sub
174
+
175
+
176
+
177
+ Private Sub SubProject_SubProjectEnd(sender As Object, e As EventArgs)
178
+
179
+ 'イベントハンドラを削除
180
+
181
+ RemoveHandler SubProjectInstance1.SubProjectEnd, AddressOf SubProject_SubProjectEnd
182
+
183
+
184
+
185
+ '処理が終わったのでLoginフォームを表示
186
+
187
+ End Sub
188
+
189
+ ```
190
+
191
+ といった感じでメイン側に公開すべき情報、公開しない情報を整理し適切なプロパティ、メソッドを作成するようにしたほうがよろしいかと思います。
192
+
193
+ 上記の例ですと、メイン側はサブロジェクト側へは「部署名」というテキストデータを設定する必要がありますが、このテキストデータの設定先がTextBoxでありそのTextプロパティに設定するということは知らなくてよいこととなります。
194
+
195
+ ですので、`Form1.部署名`とアクセスさせるのではなくプロパティを作成し、そこに情報をセットさせるという具合になります。