いつもお世話になっております。
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
VB.NET は分かりませんが。
>TEXT2とTEXT5についてはLocation.Yを他とずらしています。
これはどうずらしているんでしょうか。
もし TEXT2 を TEXT1/TEXT3 より下に、TEXT5 を TEXT4/TEXT6 より
下にずらしているんだとすると ControlSorter の結果が 0 になって
結局ソートされていないように見えてるだけな気がするのですが。
ControlSorter に比較しているコントロール名と比較結果をデバッグ
出力する処理を追加して比較結果を確認してみてはいかがでしょう。
>下にずらしているんだとすると ControlSorter の結果が 0 になって
下にずらしております。
>ControlSorter に比較しているコントロール名と比較結果をデバッグ
>出力する処理を追加して比較結果を確認してみてはいかがでしょう。
やってみましたが決定的な部分は分かりませんでした…。
TEXT2とTEXT3が間違ってソートされてる様には思い条件を追加したり
しましたがうまくまいりません。そもそもの判断材料がたりないのでしょうか?
>やってみましたが決定的な部分は分かりませんでした…。
ん?
例えば TEXT2/TEXT3 を比較した結果が 0 になってたりしませんか?
>TEXT2とTEXT3が間違ってソートされてる様には思い条件を追加したり
>しましたがうまくまいりません。そもそもの判断材料がたりないのでしょうか?
TextBox の位置でソートしようとしているとの事なので Location で
充分だとは思います。
ツイート | ![]() |