午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

動的作成したコントロール同士の連携、Classモジュール練習

動的作成したコントロール同士の連携

連携したコントロール同士の動的作成
 
例えば
スライダーとテキストボックスを連携させて
スライダーを動かしたらその値を連携しているテキストボックスに表示
テキストボックスに数値を入力したらその数値を連携しているスライダーに反映
こんな動き
イメージ 7
動画を見たほうが早いかな
 
 
今までは回りくどい無駄な書き方をしていたけど
少しまともな書き方ができたのでメモ
 
 
クラスモジュール(Class1)
 
Private WithEvents exSL As MSComctlLib.Slider
Private WithEvents exTB As MSForms.textBox

Private myForm As Object 'Object型にしておくと他のユーザーフォームでもそのまま使えるこっち

'初期設定、登録
Public Sub AddSlider(c As MSComctlLib.Slider, myTextBox As MSForms.textBox, myUserForm As Object)
    Set exSL = c
    Set exTB = myTextBox
    Set myForm = myUserForm
End Sub
'スライダーのスクロールイベント Private Sub exSL_Scroll() exTB.Text = exSL.Value 'テキストボックスにスライダーの値を表示 Call myForm.testOne(exSL) '登録したユーザーフォームのメソッドを実行 End Sub
'テキストボックスのキーダウンイベント Private Sub exTB_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 'エンターかタブキーを押したらテキストボックスの値をスライダーに反映する If KeyCode.Value = vbKeyReturn Or KeyCode.Value = vbKeyTab Then exSL.Value = CInt(exTB.Text) Call myForm.testOne(exSL) End If End Sub
 
 

f:id:gogowaten:20191018153428p:plain


 
 
 
フォームモジュール(UserForm1)
Private mySl() As New Class1
Private Sub UserForm_Initialize()
    Dim Sl As MSComctlLib.Slider
    Dim TB As MSForms.textBox
    Dim i As Long
    
    'スライダーとテキストボックス作成
    For i = 0 To 1
        ReDim Preserve mySl(i)
        
        Set Sl = Me.Controls.Add("MSComctlLib.Slider")
        With Sl
            Sl.Top = i * Sl.Height
            
        End With
        Set TB = Me.Controls.Add("Forms.TextBox.1")
    
        With TB
            .Top = Sl.Top
            .Left = Sl.Width
        End With
        
        'スライダーとテキストボックスをクラスに入れる
        mySl(i).AddSlider Sl, TB, Me
    Next i
    
End Sub

Public Sub testOne(Sl As MSComctlLib.Slider) ' Slider)
   Me.TextBox1.Text = Sl.Value
End Sub
 
 

f:id:gogowaten:20191018153441p:plain

UserForm2

f:id:gogowaten:20191018153450p:plain

UserForm1は   Me.TextBox1.Text = Sl.Value
UserForm2は   Me.TextBox1.Text = Sl.Value*2
違いを確認するためにUserForm2は数値を2倍


 
 
フォームデザイン画面

f:id:gogowaten:20191018153502p:plain

f:id:gogowaten:20191018153511p:plain

動的作成だから確認用のテキストボックス1個だけ
UserForm1もUserForm2も同じ
 
 
'初期設定、登録
Public Sub AddSlider(c As MSComctlLib.Slider, myTextBox As MSForms.textBox, myUserForm As Object)
    Set exSL = c
    Set exTB = myTextBox
    Set myForm = myUserForm
End Sub
 
クラスモジュールのこれ
スライダーとテキストボックスとユーザーフォームを一度にまとめて登録
これで連携できる
今までは別々に登録してそれぞれに付けた名前で連携先を判別とかものすごい遠回りをしていたw
 
UserForm自体も登録することで、どのUserFormのスライダーとテキストボックスなのかも判別できるのでUserFormごとに同じようなClassを書く必要がなくなる
 
 
 
ダウンロード先
ファイル名:動的作成したコントロール同士の連携テスト.xlsm
 
 
 
 
イメージ 1
これなんかにも使っているけど使うのは今度からにしよう
書きなおすのめんどくさい