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

回答編集履歴

1

追記

2020/03/30 08:34

投稿

YAmaGNZ
YAmaGNZ

スコア10679

answer CHANGED
@@ -1,1 +1,98 @@
1
- 各ライブラリで終わる時にイベントを発生させて、メイン側でそれを処理すればいいのではないでしょうか。
1
+ 各ライブラリで終わる時にイベントを発生させて、メイン側でそれを処理すればいいのではないでしょうか。
2
+
3
+
4
+ ### 追記
5
+ 微妙に違います。
6
+
7
+ DLL側で適切なところで下記のようにイベントを定義して
8
+ ```VBNET
9
+ Public Event SubProjectEnd(sender As Object, e As EventArgs)
10
+ ```
11
+ 終了する時に下記のようにイベントを発生させます。
12
+ ```VBNET
13
+ Private Sub CloseButton_Click(sender As Object, e As EventArgs) Handles CloseButton.Click
14
+ Me.Close()
15
+ RaiseEvent SubProjectEnd(Me, EventArgs.Empty)
16
+ End Sub
17
+ ```
18
+
19
+ メイン側では
20
+ ```VBNET
21
+ Private SubProjectInstance1 As SubProject.Form1
22
+
23
+ Private Sub Button1 click …以下略
24
+   'サブプロジェクト3の初期フォームインスタンスを生成
25
+   Me.SubProjectInstance1 = New SubProject.Form1
26
+ 'イベントハンドラを設定
27
+ AddHandler SubProjectInstance1.SubProjectEnd, AddressOf SubProject_SubProjectEnd
28
+
29
+   '画面に表示
30
+   Me.SubProjectInstance1.show()
31
+   'ログイン情報を設定
32
+   Me.SubProjectInstance1.部署名.Text = Login.Syain.Dname
33
+   Me.SubProjectInstance1.氏名.Text = Login.Syain.Name
34
+ End Sub
35
+
36
+ Private Sub SubProject_SubProjectEnd(sender As Object, e As EventArgs)
37
+ 'イベントハンドラを削除
38
+ RemoveHandler SubProjectInstance1.SubProjectEnd, AddressOf SubProject_SubProjectEnd
39
+
40
+ '処理が終わったのでLoginフォームを表示
41
+ End Sub
42
+ ```
43
+
44
+ といった感じで各ライブラリからの終了イベントを受け取って、希望の処理を行うようにするということです。
45
+
46
+ ---
47
+ P.S.
48
+ 各ライブラリのインターフェースを考え直したほうが良さそうに思えます。
49
+ 質問に提示された部分ですと
50
+ ライブラリ側を
51
+ ```VBNET
52
+ Public Class SubProject
53
+ Public Property 部署名 As String
54
+ Public Property 氏名 As String
55
+
56
+ Public Event SubProjectEnd(sender As Object, e As EventArgs)
57
+
58
+ Public Sub ShowForm()
59
+ Form1.部署名.Text = 部署名
60
+ Form1.氏名.Text = 氏名
61
+ Form1.Show()
62
+ End Sub
63
+
64
+ ' 処理が終わったら、このメソッドを呼び出して終了を通知する
65
+ Friend Sub ProjectEnd()
66
+ RaiseEvent SubProjectEnd(Me, EventArgs.Empty)
67
+ End Sub
68
+ End Class
69
+ ```
70
+ メイン側を
71
+ ```VBNET
72
+ Private SubProjectInstance1 As SubProject
73
+
74
+ Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
75
+   'サブプロジェクト1のインスタンスを生成
76
+   Me.SubProjectInstance1 = New SubProject
77
+
78
+ 'イベントハンドラを設定
79
+ AddHandler SubProjectInstance1.SubProjectEnd, AddressOf SubProject_SubProjectEnd
80
+
81
+   'ログイン情報を設定
82
+   Me.SubProjectInstance1.部署名 = Login.Syain.Dname
83
+   Me.SubProjectInstance1.氏名 = Login.Syain.Name
84
+
85
+   '画面を表示
86
+   Me.SubProjectInstance1.ShowForm()
87
+ End Sub
88
+
89
+ Private Sub SubProject_SubProjectEnd(sender As Object, e As EventArgs)
90
+ 'イベントハンドラを削除
91
+ RemoveHandler SubProjectInstance1.SubProjectEnd, AddressOf SubProject_SubProjectEnd
92
+
93
+ '処理が終わったのでLoginフォームを表示
94
+ End Sub
95
+ ```
96
+ といった感じでメイン側に公開すべき情報、公開しない情報を整理し適切なプロパティ、メソッドを作成するようにしたほうがよろしいかと思います。
97
+ 上記の例ですと、メイン側はサブロジェクト側へは「部署名」というテキストデータを設定する必要がありますが、このテキストデータの設定先がTextBoxでありそのTextプロパティに設定するということは知らなくてよいこととなります。
98
+ ですので、`Form1.部署名`とアクセスさせるのではなくプロパティを作成し、そこに情報をセットさせるという具合になります。