Ms access Access VBA检查文本框中的光标是否位于第一行或最后一行

Ms access Access VBA检查文本框中的光标是否位于第一行或最后一行,ms-access,vba,Ms Access,Vba,目标:我有一个具有连续表单的Access数据库,我想添加一项功能,您可以通过按向上或向下箭头转到下一条或上一条记录 问题:我有一个名为txtProjekt的多行文本框,我希望数据库检查文本框是否填充了多行文本,如果光标位于文本框的最后一行,则只跳转到下一条记录。同样,我希望它只在光标位于文本框的第一行时跳转到上一条记录 我只能用SelStart检查当前光标位置,但无法找出光标所在的行 你有什么想法吗 当前代码: Private Sub Form_KeyDown(KeyCode As Intege

目标:我有一个具有连续表单的Access数据库,我想添加一项功能,您可以通过按向上或向下箭头转到下一条或上一条记录

问题:我有一个名为
txtProjekt
的多行文本框,我希望数据库检查文本框是否填充了多行文本,如果光标位于文本框的最后一行,则只跳转到下一条记录。同样,我希望它只在光标位于文本框的第一行时跳转到上一条记录

我只能用
SelStart
检查当前光标位置,但无法找出光标所在的行

你有什么想法吗

当前代码:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
On Error GoTo err_Form_KeyDown

If Me.ActiveControl.Name = "txtProjekt" Then
    If Not (Me.txtProjekt.SelStart = 0 And Me.txtProjekt.SelLength = Len(Me.txtProjekt.Text)) Then
        GoTo exit_Form_KeyDown
    End If
End If

If KeyCode = vbKeyUp Then
    DoCmd.GoToRecord acActiveDataObject, Record:=acPrevious
    KeyCode = 0
ElseIf KeyCode = vbKeyDown Then
    DoCmd.GoToRecord acActiveDataObject, Record:=acNext
    KeyCode = 0
End If

exit_Form_KeyDown:
Exit Sub

err_Form_KeyDown:
MsgBox Err.description
Resume exit_Form_KeyDown
End Sub
编辑: 结果(感谢@Newd):

(请确保在表单中激活KeyPreview,否则它不会执行任何操作)

Private子表单_KeyUp(KeyCode为整数,Shift为整数)
关于错误转到错误表单
如果Shift=False,则
键动作键代码,真
如果结束
退出表格加密:
出口接头
错误形式键控:
MsgBox Err.description
恢复退出表单加密
端接头
私有子表单_KeyDown(KeyCode为整数,Shift为整数)
On Error GoTo err\ U Form\ U KeyDown
Dim curPos作为整数
如果Shift=False,则
键操作键代码,False
如果结束
退出表单键按下:
出口接头
错误形式键控:
MsgBox Err.description
继续退出\u表单\u键关闭
端接头
Private Sub-keyAction(KeyCode为整数,KeyUp为布尔值)
On Error GoTo err_keyAction
静态curPos尽可能长
如果KeyUp=False,则
如果Me.ActiveControl.Name=“txtProjekt”,则
如果不是(Me.txtProjekt.SelStart=0和Me.txtProjekt.SelLength=Len(Me.txtProjekt.Text)),则
curPos=Me.txtProjekt.SelStart
转到退出键操作
如果结束
如果结束
其他的
如果Me.ActiveControl.Name=“txtProjekt”,则
如果curPos>=0,则
如果Me.txtProjekt.SelStart curPos,则
转到退出键操作
如果结束
curPos=-1
其他的
转到退出键操作
如果结束
如果结束
如果结束
如果KeyCode=vbKeyUp,则
DoCmd.GoToRecord acactivedaotobject,记录:=acPrevious
KeyCode=0
ElseIf KeyCode=vbKeyDown然后
DoCmd.GoToRecord acactivedaotobject,记录:=acNext
KeyCode=0
如果结束
退出键操作:
出口接头
错误键操作:
MsgBox Err.description
恢复退出按键操作
端接头

(我知道,所有这些
GoTo Exit\u keyAction
都是糟糕的风格,所以不要从我这里复制太多)

我目前没有时间完整地写出这些代码来合并您的代码。然而,我认为如果你能够达到你现在的目的,你应该能够利用它

基本上,这只是一种判断用户是否点击了多行文本框的末尾或开头的方法

Public intown作为整数
作为整数的公共intOnUp
'当用户按下该键时
私有子txtProjekt_KeyDown(KeyCode为整数,Shift为整数)
如果KeyCode=vbKeyUp或KeyCode=vbKeyDown,则
'保存光标位置
intOnDown=txtProjekt.SelStart
如果结束
端接头
'当用户放开钥匙时
私有子txtProjekt_KeyUp(KeyCode为整数,Shift为整数)
如果KeyCode=vbKeyUp或KeyCode=vbKeyDown,则
如果intOnDown-txtProjekt.SelStart=0,则“如果SelStart相同
Debug.Print“指针未移动,因此必须在末尾或开头”
如果结束
如果结束
端接头
当用户按下
Keydown
上的向上键或向下键时,您可以使用上面的代码收听,然后在
keydup
上再次收听(当他们放开键时)。然后检查
SelStart
是否已更改。如果没有,则表示它们位于字段的开头或结尾,您可以执行记录切换


注意:如果您的备注字段将超过最大
整数
大小,请通过更改为
进行相应调整,并且您可能希望对其进行错误处理

嗨,纽德,非常感谢你的回答。我做了一点不同,因为整个表单都应该听按键,我不想有另一个公共变量,但是你的回答帮助我解决了我的问题。谢谢:)@Dorian没问题。在回顾了你的答案历史之后,我发现一旦你越过了如何判断你是否点击了文本框末尾的障碍,你就知道如何处理它了。这是一个非常有趣的问题。@Dorian另外,你能发布你的最终代码吗,我对阅读它很感兴趣。代码太长,无法作为注释发布,因此我将添加另一个答案。@Dorian即使你只想编辑你的主要文章并将其作为
更新扔到那里。
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
On Error GoTo err_Form_KeyUp

If Shift = False Then
    keyAction KeyCode, True
End If

exit_Form_KeyUp:
Exit Sub

err_Form_KeyUp:
MsgBox Err.description
Resume exit_Form_KeyUp
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
On Error GoTo err_Form_KeyDown
Dim curPos As Integer

If Shift = False Then
    keyAction KeyCode, False
End If

exit_Form_KeyDown:
Exit Sub

err_Form_KeyDown:
MsgBox Err.description
Resume exit_Form_KeyDown
End Sub

Private Sub keyAction(KeyCode As Integer, KeyUp As Boolean)
On Error GoTo err_keyAction
Static curPos As Long

If KeyUp = False Then
    If Me.ActiveControl.Name = "txtProjekt" Then
        If Not (Me.txtProjekt.SelStart = 0 And Me.txtProjekt.SelLength = Len(Me.txtProjekt.Text)) Then
            curPos = Me.txtProjekt.SelStart
            GoTo exit_keyAction
        End If
    End If
Else
    If Me.ActiveControl.Name = "txtProjekt" Then
        If curPos >= 0 Then
            If Me.txtProjekt.SelStart <> curPos Then
                GoTo exit_keyAction
            End If
            curPos = -1
        Else
            GoTo exit_keyAction
        End If
    End If
End If

If KeyCode = vbKeyUp Then
    DoCmd.GoToRecord acActiveDataObject, Record:=acPrevious
    KeyCode = 0
ElseIf KeyCode = vbKeyDown Then
    DoCmd.GoToRecord acActiveDataObject, Record:=acNext
    KeyCode = 0
End If


exit_keyAction:
Exit Sub

err_keyAction:
MsgBox Err.description
Resume exit_keyAction
End Sub