- PR -

VB.NETでDLLとEXEで値の受け渡し

投稿者投稿内容
とっち
常連さん
会議室デビュー日: 2003/01/13
投稿数: 28
投稿日時: 2004-04-15 09:53
いつも参考にさせて頂いております。


A.EXE(MDI親フォーム)とB.DLL(MDI子フォーム)があります。

A.EXEからB.DLLを操作するのは出来たのですが(参照設定にて)
B.DLLからA.EXEを操作する方法が分からず投稿いたしました。

A.EXEにはPublic Sharedで公開された変数があり
B.DLLからその値を参照/変更したいのです。

相手がDLLであれば参照設定することによって出来るのですが
EXEの場合はどうすればよいのでしょうか?

ご教授お願いいたします。

ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-04-15 10:34
なんか、この件に関しては設計思想上いくつか問題がありそうですが…。
たとえば、今はA.EXE[親]がB.DLL[子]のフォームを開く設計でも、次にC.EXE[別の親]からB.DLL[子]のフォームを開いたら、どうなりますか?

それはともかく、私だったら、B.DLLのフォームに、親フォームへ渡したい情報をPublicプロパティで保持し、それを親フォームから参照するように考えます。
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-04-15 10:40
もうひとつ大きな疑問につき、発言を分けます。

引用:

とっちさんの書き込み (2004-04-15 09:53) より:

A.EXEにはPublic Sharedで公開された変数があり


なぜShared??
もしA.EXEの親フォームが2枚以上開いていたり、B.DLLの子フォームを2枚以上開いていたら、どんな挙動を示すでしょうか。
親フォームも子フォームも絶対に1枚しか開かない保障でもありますか?

[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-04-15 10:42 ]
とっち
常連さん
会議室デビュー日: 2003/01/13
投稿数: 28
投稿日時: 2004-04-15 11:26
ぢゃん♪さん、レスありがとう御座います。

「Shared」の意味をよく理解できていませんでした。

勉強不足で申し訳ありません。

質問を若干変更させていただきます。

やりたいこと
 A.EXE(MDI親)からB.DLL(MDI子)を開きます。
 このB.DLLはメニュー画面です。
 さらにB.DLLからC.DLL(MDI子)を開き、B.DLLは閉じます。
 C.DLLは入力画面です。
 C.DLLを閉じたら、B.DLLを開きます。

現状
 B.DLLからC.DLLを開くとB.DLLを閉じたときにC.DLLも閉じてしまう為
 B.DLLからA.EXEにたいし、「C.DLLを開きなさい」と命令したいと考えてます。

ぢゃん♪さんがおっしゃるように
>>B.DLLのフォームに、親フォームへ渡したい情報をPublicプロパティで保持し、
>>それを親フォームから参照するように考えます
をやりたいのです。
B.DLLに次に開くDLLの情報をPublicプロパティで保持するのは出来るのですが
どのタイミング(イベント)でA.EXEからB.DLLのPublicプロパティを取得して
良いかが分かりません。

A.EXEから「B.DLLが閉じた」イベントを感知することは出来ますでしょうか?

よろしくお願いいたします。

なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-04-15 11:28
ついでに言うと、
引用:

とっちさんの書き込み (2004-04-15 09:53) より:
相手がDLLであれば参照設定することによって出来るのですが
EXEの場合はどうすればよいのでしょうか?


DLLでもできません。
循環参照になってしまうからです。
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-04-15 12:46
引用:

とっちさんの書き込み (2004-04-15 11:26) より:

A.EXEから「B.DLLが閉じた」イベントを感知することは出来ますでしょうか?


Form.Closed イベントでしょう。
VB.NETのようですから、「イベントとイベント・ハンドラ」を参考にしましょう。

子フォームを開く枚数が決まっている場合と、開く枚数が不定な場合とでは、方法が変わるように思います。
たとえば、子フォームを開く枚数が決まっていない前提なら、親フォームのメソッド(をAddressOfで)子フォームに渡し、子フォームでClosedイベントを拾ったら、そのイベント処理中で親フォームのメソッドを呼び出す、と。

C#なら、もうちょっとスマートな方法が使えるんですけどね……。

[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-04-15 12:53 ]
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-04-15 13:13
ついでですから、(MDIではありませんが)ちょちょいと作ってみたサンプルコードを。
コード:

'************
'***子フォーム側***
'************
Public Class Form2
Inherits System.Windows.Forms.Form

" Windows フォーム デザイナで生成されたコード "

Private ClosedToParent As EventHandler

Public Sub SetClodedEvent(ByVal method As EventHandler)
ClosedToParent = method
End Sub

Private Sub Form2_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
If Not (Me.ClosedToParent Is Nothing) Then
Me.ClosedToParent(sender, e)
End If
End Sub
End Class


コード:

'************
'***親フォーム側***
'************
Public Class Form1
Inherits System.Windows.Forms.Form

" Windows フォーム デザイナで生成されたコード "

Protected subForms(2) As Form2

Private Sub Form2_Closed(ByVal sender As Object, ByVal e As System.EventArgs)
Dim form As Form2 = sender
MessageBox.Show("Form2(" + form.Text + ")を閉じた。")
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
subForms(0) = New Form2
subForms(1) = New Form2
subForms(2) = New Form2
subForms(0).Text = "subForms(0)"
subForms(1).Text = "subForms(1)"
subForms(2).Text = "subForms(2)"
subForms(0).SetClodedEvent(New EventHandler(AddressOf Me.Form2_Closed))
subForms(1).SetClodedEvent(New EventHandler(AddressOf Me.Form2_Closed))
subForms(2).SetClodedEvent(New EventHandler(AddressOf Me.Form2_Closed))
subForms(0).Show()
subForms(1).Show()
subForms(2).Show()
End Sub
End Class



[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-04-15 13:14 ]
とっち
常連さん
会議室デビュー日: 2003/01/13
投稿数: 28
投稿日時: 2004-04-15 15:01
ぢゃん♪さま

わざわざ、サンプルまでご提示いただきましてありがとう御座います。
早速試してみます。

スキルアップ/キャリアアップ(JOB@IT)