コントロールのTABINDEXを自動付与するには?


イナフ  2005-09-06 01:48:59  No: 124929

いつもお世話になっております。

VB.netにて画面に配置されているコントロールのタブを左上から右下へ
移動できる様にソースにて自動でタブインデックスを設定しているのですが
なかなかうまく参りません。下記のようにテキストを配置しTEXT1〜6へ順に
タブ移動を行える様にしたいのです。(:の後は手動設定したタブインデックスです)
[TEXT1:2][TEXT2:1][TEXT3:6]
[TEXT4:3][TEXT5:4][TEXT6:5]

画面内のコントロールを取得し,Location.XとLocation.Yを判断し,
自作クラスにてソートを試みているのですが,どうしても
TEXT1→TEXT3→TEXT2→TEXT4→TEXT6→TEXT5となります。
TEXT2とTEXT5についてはLocation.Yを他とずらしています。
独自クラスの判断がおかしいのでしょうか・・・?

    'フォーカス順を設定する
    Sub MAK_CONS()←フォームロードで呼んでます。

        Dim Con As Control
        Dim i As Long
        Dim lngOld As Long

        'フォームに配置されているコントロールの一覧
        For Each Con In Controls
            ReDim Preserve MjobjCON(MjlngFocusMAX)
            MjobjCON(MjlngFocusMAX) = Con
            MjlngFocusMAX = MjlngFocusMAX + 1
        Next

        Dim strlenCompX As IComparer = New ControlSorter
        Array.Sort(MjobjCON, strlenCompX)

        Dim i As Integer = 0
        For Each FrmCon As Control In MjobjCON
            FrmCon.TabIndex = i
            i += 1
            Debug.WriteLine(FrmCon.TabIndex & " " & FrmCon.Name & vbTab & "X:" & FrmCon.Location.X & vbTab & "Y:" & FrmCon.Location.Y)
        Next

    End Sub

End Class

Public Class ControlSorter
    Implements IComparer

    Public Function Sorter(ByVal c1 As Object, ByVal c2 As Object) As Integer Implements IComparer.Compare

        Dim lx1 As Integer = CType(c1.location.x, Integer)
        Dim ly1 As Integer = CType(c1.location.y, Integer)
        Dim lx2 As Integer = CType(c2.location.x, Integer)
        Dim ly2 As Integer = CType(c2.location.y, Integer)
        Dim rtn As Integer = 0

        If lx1 < lx2 _
        And ly1 <= ly2 Then

            rtn = -1

        ElseIf lx1 < lx2 _
        And ly1 > ly2 Then

            rtn = 1

        Else

            rtn = 0

        End If

        Return rtn

    End Function

End Class


Geo=TK3  2005-09-06 03:23:05  No: 124930

VB.NET は分かりませんが。

>TEXT2とTEXT5についてはLocation.Yを他とずらしています。

これはどうずらしているんでしょうか。
もし TEXT2 を TEXT1/TEXT3 より下に、TEXT5 を TEXT4/TEXT6 より
下にずらしているんだとすると ControlSorter の結果が 0 になって
結局ソートされていないように見えてるだけな気がするのですが。

ControlSorter に比較しているコントロール名と比較結果をデバッグ
出力する処理を追加して比較結果を確認してみてはいかがでしょう。


イナフ  2005-09-06 04:10:50  No: 124931

>下にずらしているんだとすると ControlSorter の結果が 0 になって
下にずらしております。

>ControlSorter に比較しているコントロール名と比較結果をデバッグ
>出力する処理を追加して比較結果を確認してみてはいかがでしょう。
やってみましたが決定的な部分は分かりませんでした…。

TEXT2とTEXT3が間違ってソートされてる様には思い条件を追加したり
しましたがうまくまいりません。そもそもの判断材料がたりないのでしょうか?


Geo=TK3  2005-09-06 07:32:30  No: 124932

>やってみましたが決定的な部分は分かりませんでした…。

ん?
例えば TEXT2/TEXT3 を比較した結果が 0 になってたりしませんか?

>TEXT2とTEXT3が間違ってソートされてる様には思い条件を追加したり
>しましたがうまくまいりません。そもそもの判断材料がたりないのでしょうか?

TextBox の位置でソートしようとしているとの事なので Location で
充分だとは思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加