VB.netでコンボボックスの選択状態と押したボタンの内容を記録する簡単なプログラムを作っています。
ただし、ウィンドウのデザインは複数作成する必要があるので、dllファイルの差し替えでウィンドウのデザインを切り替えたり、同一のdll内でも切り替えボタンなどでコンボボックスの選択状態を保持したままウィンドウの切り替えを行う予定です。
そのため、dll側で持っている変数の内容をexe側で処理したいのですが、方法がわかりません。
下記のようなコードを組んでみましたが、exe側では変数の内容は反映されていないようです。
●exe側フォーム
lang
1Public Class Form1 2 3 'ウィンドウ読み込み時 4 Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown 5 'リスト読み込み 6 Interface_Control_Form1.CtrlCombobox1.Items.Add("test1-1") 7 Interface_Control_Form1.CtrlCombobox1.Items.Add("test1-2") 8 End Sub 9 10 11 'ボタン1 12 Private Sub Button1_Click() Handles Interface_Control_Form1.CtrlButton1_Click 13 Call Main(1) 14 End Sub 15 16 'ボタン2 17 Private Sub Button2_Click() Handles Interface_Control_Form1.CtrlButton2_Click 18 Call Main(2) 19 End Sub 20 21 'ボタン3 22 Private Sub Button3_Click() Handles Interface_Control_Form1.CtrlButton3_Click 23 Call Main(3) 24 End Sub 25 26 'メインの処理、押されたボタンから呼び出される 27 Sub Main(BTN_num As Integer) 28 '選択されたComboboxを検出する 29 Dim MainClass As New interface_form.Main_Control 30 Debug.Print("exe側:{0}", MainClass.CB1value) '★Combobox1の値を確認(3) 31 End Sub 32 33End Class
●dll側Class
lang
1Public Class Main_Control 2 Public CB1value As Long 3 4 ''変数参照? 5 'Public ReadOnly Property Ctrl_CB1value() As Long 6 ' Get 7 ' Return CB1value 8 ' End Get 9 'End Property 10 11 12 'Combobox変更用イベント 13 Public Event ChangedConbobox1(ByVal sender As System.Object, ByVal e As System.EventArgs) 14 'イベントトリガー 15 Public Sub ModConbobox1(ByVal idx As Long) 16 CB1value = idx 17 RaiseEvent ChangedConbobox1(Me, New EventArgs) 18 End Sub 19 20End Class
●dll側ユーザーコントロール
lang
1Public Class Interface_Control_Form 2 3 Public ReadOnly Property CtrlCombobox1() As System.Windows.Forms.ComboBox 4 Get 5 Return ComboBox1 6 End Get 7 End Property 8 9 10 'Comboboxの値変更処理 11 Dim WithEvents Cur_Control As New Main_Control 12 'Dim WithEvents As New Main_Control 13 Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged 14 Debug.Print("dll側イベント発生前:{0}", Cur_Control.CB1value) '★Combobox1の値を確認(1) 15 Cur_Control.ModConbobox1(Me.ComboBox1.SelectedIndex) 16 End Sub 17 18 '他ウィンドウでComboboxが変更された時の連動 19 Private Sub ChangedComboBox() Handles Cur_Control.ChangedConbobox1 20 Debug.Print("dll側イベントヒット後:{0}", Cur_Control.CB1value) '★Combobox1の値を確認(2) 21 Me.ComboBox1.SelectedIndex = Cur_Control.CB1value 22 End Sub 23 24 25 'ここから下はボタンのイベント処理。今回はあまり関係なし。 26 Public Event CtrlButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 27 Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click 28 RaiseEvent CtrlButton1_Click(sender, e) 29 End Sub 30 31 Public Event CtrlButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 32 Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click 33 RaiseEvent CtrlButton2_Click(sender, e) 34 End Sub 35 36 Public Event CtrlButton3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 37 Private Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click 38 RaiseEvent CtrlButton3_Click(sender, e) 39 End Sub 40 41 42 Public ReadOnly Property CtrlButton1() As System.Windows.Forms.Button 43 Get 44 Return Button1 45 End Get 46 End Property 47 48 Public ReadOnly Property CtrlButton2() As System.Windows.Forms.Button 49 Get 50 Return Button2 51 End Get 52 End Property 53 54 Public ReadOnly Property CtrlButton3() As System.Windows.Forms.Button 55 Get 56 Return Button3 57 End Get 58 End Property 59 60End Class
●イミディエイトウィンドウの内容("test1-2"を選択)
dll側イベント発生前:0
dll側イベントヒット後:1
exe側:0
「dll側で持っている変数の内容をexe側で処理したい」とは具体的にどのようなことでしょうか?どの変数をどうしたいのでしょうか?
dllで定義した Main_Control クラス内の CB1value の変数をexe側のコメント「★Combobox1の値を確認(3)」の部分で読み出そうとしています。
後からこの記事を見に来た方のために、要点をまとめます。 元々の質問の問題に関しては、 sugar_yasさん への 2018/11/27 17:56 の返信で記載したコードで解決しています。 今回の原因となっていたインスタンスが分断してしまう問題に関しては、 kenshirouさん への 2018/11/29 14:08 の返信で解決しています。 これでexe側でも正常にイベントを拾えるようになります。
回答3件
あなたの回答
tips
プレビュー