我在TextBox
上有一个Form
。我在该.SelStart
中使用TextBox
属性获取光标位置。当我在TextBox
中单击时,它会按要求工作。然后,我使用该位置,通过按打印它们的字幕的相同形式的按钮在光标位置上插入某些符号。
但是,如果我在TextBox
中用键盘键入某些字符,则Selstart
会返回0。即使我键入了多个字符并 cursor 明显位于文本末尾,SelStart
仍为0。现在,如果我在其他 form 上打印 button ,则新字符始终在TextBox
这不是我想要的。我希望即使在使用键盘键入内容时,也总是在光标位置打印字幕。
这种行为非常令人困惑。有人可以帮忙吗?
Private LastPosition as Long 'declared in form module
Private sub t_LostFocus() 'to obtain last position in `TextBox`
LastPosition = Me!t.SelStart
End Sub
Private Sub Insert()
Dim Text As String
If LastPosition = 0 AND IsNull(Me!t.value) Then
Me!t.Value = " " + Me.ActiveControl.Caption
LastPosition = LastPosition + Len(Me.ActiveControl.Caption) + 1
ElseIf LastPosition >=0 AND Not IsNull(Me!t.Value) Then
Text = Me!t.Value
Me!t.Value = Left(Text, LastPosition) & " " & Me.ActiveControl.Caption & Mid (Text, LastPosition + 1)
LastPosition = LastPosition + Len(Me.ActiveControl.Caption)+1
Else
Me!t.Value = Me!t.Value + " " + Me.ActiveControl.Caption
End If
End Sub
Private Sub button1_Click()
Call Insert
End Sub
答案 0 :(得分:1)
首先,有关在访问表单上输入数据的一些事实。需要分别理解这些内容,以正确解释问题中描述的行为,尤其是在尝试更改控件的默认行为时。
TextBox.SelStart
,SelLength
和SelText
仅在控件具有焦点时才有效。当TextBox控件再次获得焦点时,默认值为所有文本都被选中,因此SelStart
= 0且SelLength
= Text
属性的长度。使用鼠标并在特定字符位置单击TextBox时,将绕过默认行为,并按预期将光标置于鼠标光标上。Text
属性和Value
属性。 Text
属性代表在控件中显示的文本字符串。显示的文本可以不同于控件表示的基础值,尤其是在Value
是非文本数据类型的情况下(例如,整数存储为数字,但表示为单个文本数字)。 Value
属性返回一个VBA变体,该变体本身保存 specific 数据类型的基础值。
ControlSource
属性),Value
数据类型将与绑定源列相同。ControlSource
为空),Value
数据类型由TextBox.Format
属性决定。如果Format
为空,则数据类型为text,并将有效匹配Text
属性。Text
和Value
并不总是同步的,当控件具有焦点并正在编辑时尤其如此。当文本由表单用户编辑(即不是通过代码)时,Value
不会更新,直到控件失去焦点或 Shift + Enter 保存表单为止(除非Enter关键行为已更改)。大多数将更新控件的事件还将涉及单击或以其他方式将焦点移到控件外部,例如保存记录,将焦点更改为另一个控件等。
Value
时,将解释显示的文本(可通过Text
属性访问)和/或将其转换为适当的数据类型,然后将其保存到{{1 }}属性。 (有时,通过将“值”重新格式化为Value
属性中指定的表示形式,继续进行同步。例如,如果Format
则:输入为“ 4-12-19”的文本->已更新价值:#4/12/19 00:00#→更新文本:“ 2019年4月12日,星期五”。我要讲的最后一个重要事实:
Format = Long Date
属性(即使它也是String数据类型)也会刷新TextBox.Value
属性,并且光标位置和重置文本选择,以便选择整个文本。换句话说,Text
设置为0且SelStart
设置为SelLength
的长度,就像TextBox新获得焦点时所观察到的行为(如上文第一点所述) )。最后是所有这些细节的症结所在:
Text
事件处理程序中,LostFocus
== 0 。通过在各种事件中放置一些“记录”语句来跟踪代码是值得的,以便您可以观察它们的发生时间和顺序。
SelStart