|
▼かみちゃん さん、ichinose さん、
おはようございます。早速の回答ありがとうございます。
ichinoseさんいつもすみません。
クラスモジュールを使ったコントロール配列については、持っている本に少し書かれていたのですが、読んでいても難解だったもので、挑戦していませんでした。
>クラスや配列については、ここの常連さんの角田さん「目安箱」で
>説明されていますから、参考にして下さい。
>私もまだ、途中までしか読んでないけど、分かりやすいですよ!!
>それに上記のコードの仕様をもっと簡単に実現できるかも・・・。
>
私もここを読んで挑戦してみようと考え始めたのですが・・・(それでも半分以上は読でなんとなくわかったような気がしていたのですが・・・(*'-'*))
例題コードを自分なりに分析してやってみます。
かみちゃん さん、ichinose さん、ありがとうございました。
時間がかかるかもしれませんが、できたら(できなかったらまた質問します)連絡したいと思います。
>ちょっとコントロールの数が多いので、少ない数のコントロールで例題コードを
>記述します。
>ユーザーフォーム(Userform1)には、
>ラベルコントロールが3つ(Label1〜Label3)
>テキストボックスが3つ(Textbox1〜Textbox3)
>
>を貼り付けてください(オブジェクト名が、結構重要)
>
>コードの仕様は、
>
>・フォームのラベルをクリックすると、
>クリックされたラベルの文字(Caption)が赤くなります。
>
>・この状態でいずれかのテキストボックスをクリックすると
> 赤色のラベル文字の内容が当該テキストボックスに表示されます。
>
>
>では、コードです。
>
>クラスモジュールを3つ用意して下さい(「挿入」---「クラスモジュール」)。
>クラス名は、Class1、Class2、Class3、つまり、作成されたままの名前を
>使います。
>
>まずは、それぞれのクラスモジュールのコード
>
>'Class1
>'============================================================
>Private evlbl() As Class2
>Private l_id As Long
>Private lbcnt As Long
>Private evtxt() As Class3
>Private t_id As Long
>Private txtcnt As Long
>Public Event lblclick(ByVal lbl As MSForms.Label)
>Public Event txtclick(ByVal txt As MSForms.TextBox)
>'============================================================
>Sub init_lbl(lbl_count)
> ReDim evlbl(1 To lbl_count)
> For idx = 1 To lbl_count
> Set evlbl(idx) = New Class2
> Next
> lbcnt = lbl_count
>End Sub
>'==============================================================
>Sub set_lbl(id As Long, lbl As MSForms.Label)
> With evlbl(id)
> Set .lbl = lbl
> .lbl_id = id
> Set .parentobj = Me
> .callbackproc = "evlbl_Click"
> End With
>End Sub
>'==============================================================
>Public Sub evlbl_Click(id As Long)
> RaiseEvent lblclick(evlbl(id).lbl)
>End Sub
>'===============================================================
>Sub init_txt(txt_count)
> ReDim evtxt(1 To txt_count)
> For idx = 1 To txt_count
> Set evtxt(idx) = New Class3
> Next
> txtcnt = txt_count
>End Sub
>'================================================================
>Sub set_txt(id As Long, txt As MSForms.TextBox)
> With evtxt(id)
> Set .txt = txt
> .txt_id = id
> Set .parentobj = Me
> .callbackproc = "evtxt_Click"
> End With
>End Sub
>'===============================================================
>Public Sub evtxt_Click(id As Long)
> RaiseEvent txtclick(evtxt(id).txt)
>End Sub
>
>
>'Class2
>'==================================================================
>Public WithEvents lbl As MSForms.Label
>Public lbl_id As Long
>Public parentobj As Object
>Public callbackproc As String
>Private Sub lbl_Click()
> wk = CallByName(parentobj, callbackproc, VbMethod, lbl_id)
>End Sub
>
>
>'Class3
>'=================================================================
>Public WithEvents txt As MSForms.TextBox
>Public txt_id As Long
>Public parentobj As Object
>Public callbackproc As String
>Private Sub txt_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
> wk = CallByName(parentobj, callbackproc, VbMethod, txt_id)
>End Sub
>
>
>'Userform1のモジュールに
>'=================================================================
>Private cpy_lbl As MSForms.Label
>Private WithEvents cls As Class1
>'=================================================================
>Private Sub cls_lblclick(ByVal lbl As MSForms.Label)
> If Not cpy_lbl Is Nothing Then
> cpy_lbl.ForeColor = &H0
> End If
> lbl.ForeColor = &HFF
> Set cpy_lbl = lbl
>End Sub
>'=================================================================
>Private Sub cls_txtclick(ByVal txt As MSForms.TextBox)
> txt.Text = cpy_lbl.Caption
>End Sub
>'=================================================================
>Private Sub UserForm_Initialize()
> Dim idx As Long
> Set cls = New Class1
> With cls
> .init_lbl 3 'ラベルの数
> For idx = 1 To 3 '←らヘルの数だけループ
> .set_lbl idx, Controls("label" & idx)
> Next
> .init_txt 3 'テキストボックスの数
> For idx = 1 To 3 'テキストボックスの数だけループ
> .set_txt idx, Controls("textbox" & idx)
> Next
> End With
> Set cpy_lbl = Nothing
>End Sub
>
>
>以上です。確認して下さい。
>
>クラスや配列については、ここの常連さんの角田さん「目安箱」で
>説明されていますから、参考にして下さい。
>私もまだ、途中までしか読んでないけど、分かりやすいですよ!!
>それに上記のコードの仕様をもっと簡単に実現できるかも・・・。
>
>
>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=51;id=FAQ
>
>↑から入って追ってみてください。
|
|