SendKeysでTabを送るのが一番手軽で簡単ですが、SendKeysはメモリリーク等の問題もあるのであまりお勧めできません。というわけでデフォルトボタンとキャンセルボタンを使用して実現させてみました。
サンプルは下のようなフォームを作成してテストしました。CmdNextをデフォルトボタン、CmdPrevをキャンセルボタンとしています。
※上記2つのコマンドボタンはForm_Loadイベントで画面から外しています。
'--------------------------------------------------------
' Form
'--------------------------------------------------------
PubliccolCtlAsCollection
Private SubForm_Load()
CmdNext.Default =True'デフォルトボタン
CmdNext.TabStop =False
CmdNext.Top = CmdNext.Top * -1'見えない所へ移動
CmdPrev.Cancel =True'キャンセルボタン
CmdPrev.TabStop =False
CmdPrev.Top = CmdPrev.Top * -1'見えない所へ移動
CallEnumControl(Me, colCtl)
End Sub
Private SubCmdNext_Click()
CallNextPrevFocus(Me, colCtl, "Next")
End Sub
Private SubCmdPrev_Click()
CallNextPrevFocus(Me, colCtl, "Prev")
End Sub
'--------------------------------------------------------
' Module
'--------------------------------------------------------
Public SubEnumControl(MyFormAs Form, MyCollectionAs Collection)
DimctlAsControl
DimiAs Integer
SetMyCollection =NewCollection
For EachctlInMyForm.Controls
If TypeOfctlIsMenuThen
Else
MyCollection.Add Item:=ctl, Key:="TabIndex"&CStr(ctl.TabIndex)
End If
Next
End Sub
Public SubNextPrevFocus(MyFormAs Form, MyCollectionAs Collection, FlgAs String)
DimctlAsControl
DimiMaxTabIndexAs Integer
DimiMinTabIndexAs Integer
DimiAs Integer
DimiTab()As Integer
DimcolTabAs NewCollection
Dimsv_iTabAs Integer
IfFlg = "Next"OrFlg = "Prev"Then
Else
Exit Sub
End If
ReDimiTab(1ToMyCollection.Count)
'一番近い次のTabIndexを検索します
iMaxTabIndex = -9999
iMinTabIndex = 9999
Fori = 1ToMyCollection.Count
Setctl = MyCollection(i)
Ifctl.TabStop =True Andctl.Enabled =True Andctl.Visible =True Then
iTab(i) = ctl.TabIndex - MyForm.ActiveControl.TabIndex
colTab.Add Item:=ctl.TabIndex, Key:=CStr(iTab(i))
'最小のタブインデックスを取得
IfiMinTabIndex > ctl.TabIndexThen
iMinTabIndex = ctl.TabIndex
End If
'最大のタブインデックスを取得
IfiMaxTabIndex < ctl.TabIndexThen
iMaxTabIndex = ctl.TabIndex
End If
End If
Next
IfFlg = "Next"Then
IfiMinTabIndex = 9999Then
Exit Sub
End If
sv_iTab = 9999
Fori = 1ToMyCollection.Count
IfiTab(i) > 0Then
IfiTab(i) < sv_iTabThen
sv_iTab = iTab(i)
End If
End If
Next
'一番近いTabIndexのコントロールへSetFocusします
Ifsv_iTab <> 9999Then
Setctl = MyCollection("TabIndex"&colTab(CStr(sv_iTab)))
ctl.SetFocus
Else
'直近のTabIndexが見つからなかった時は先頭へ移動
Setctl = MyCollection("TabIndex"&iMinTabIndex)
ctl.SetFocus
End If
Else
IfiMaxTabIndex = -9999Then
Exit Sub
End If
sv_iTab = -9999
Fori = 1ToMyCollection.Count
IfiTab(i) < 0Then
IfiTab(i) > sv_iTabThen
sv_iTab = iTab(i)
End If
End If
Next
'一番近いTabIndexのコントロールへSetFocusします
Ifsv_iTab <> -9999Then
Setctl = MyCollection("TabIndex"&colTab(CStr(sv_iTab)))
ctl.SetFocus
Else
'直近のTabIndexが見つからなかった時は最後へ移動
Setctl = MyCollection("TabIndex"&iMaxTabIndex)
ctl.SetFocus
End If
End If
SetcolTab =Nothing
End Sub
DownLoad vbtips069.lzh 3KB (VB6.0)