2010-12-16 12 views
2

私はVB.NETプロジェクトでCOM Interopを使用してVB6フォームを操作しています。私のVB6フォームのコントロールのいくつかはインデックスが付けられていて、そうでないものもあるので、インデックスのないものではctl.Indexを呼び出すことができません。コントロールがインデックスに登録されている場合は、うまくいく方法はありますか?VB6コントロールが.NETでインデックスされているかどうかを調べる方法(コントロール配列)

+0

私はでIsArrayが働くかもしれないと思ったが、VB6のように、それはコントロール配列は、実際に私がコントロールするかどうかをテストするためにVB6の機能があるとは思わない配列 –

答えて

2

あなたは型名の機能を使用することができます - のように - コントロール配列は、タイプ「オブジェクト」ではなく、実際の制御タイプを返します。そう:

If TypeName(ctrl) = "Object" Then 
    isControlArray = true 
End If 
+0

このソリューションは、CommandButtonオブジェクトでは機能しません。 TypeNameは配列内であっても "CommandButton"と表示します。 – Martin

1

私は、これを機能させるための解決策をナイフとフォークで管理しています。しかし、毎回フォーム上のすべてのコントロールを反復するほど効率的ではありません。私は私の心の後ろに、コントロールが配列かどうかをテストするためのVB6関数がありますが、私はそれを思い出すことができないことを覚えているようです。興味のある人のための私の機能は以下の通りですが、私は可能ならばこれにもっとクリーンな解決策を見つけることに興味がありますか?

Private Function FindIndex(ByRef objCtl As Object) As Integer 
    For Each ctl As Object In objCtl.Parent.Controls 
     If objCtl.Name = ctl.Name AndAlso Not objCtl.Equals(ctl) Then 
      'if the object is the same name but is not the same object we can assume it is a control array 
      Return objCtl.Index 
     End If 
    Next 
    'if we get here then no controls on the form have the same name so can't be a control array 
    Return 0 
End Function 

誰もが興味を持っている場合は、次のVB6の等価です:VB6で

Private Function FindIndex(ByRef F As Form, ByRef Ctl As Control) As Integer 
    Dim ctlTest As Control 
    For Each ctlTest In F.Controls 
     If (ctlTest.Name = Ctl.Name) And (Not (ctlTest Is Ctl)) Then 
      'if the object is the same name but is not the same object we can assume it is a control array 
      FindIndex = Ctl.Index 
      Exit Function 
     End If 
    Next 
    'if we get here then no controls on the form have the same name so can't be a control array 
    FindIndex = 0 
End Function 
+0

であることを考えていません。コントロール配列の一部です。 – MarkJ

関連する問題