使用文本框自动滚动到底部

时间:2011-07-07 07:38:50

标签: forms ms-access vba

我有一个ms访问的mdb文件。它在表单内部和内部有一个表单,有一个大文本框。

制作此文本框的目的是通过在文本框中添加消息来显示某些工作的进度:

txtStatus.value = txtStatus.value & "Doing something..." & vbCrLf
txtStatus.value = txtStatus.value & "Done." & vbCrLf

但问题是,当文字的高度>文本框的高度,新消息不会自动显示。文本框有一个滚动条,但我必须手动滚动它。我想在弹出新文本时自动滚动到底部。

我尝试在On Change属性中添加此代码(从Internet复制),但代码失败,它什么都不做:

Private Sub txtStatus_Change()
    txtStatus.SelStart = Len(txt) - 1
End Sub

我希望有一些简单而美丽的方法来实现这一目标。我不想添加一些只能在某些计算机上运行的代码,因为它依赖于windows平台的内核/等。

3 个答案:

答案 0 :(得分:12)

你可以通过调用sub来实现;

AppendText "Bla de bla bla."
.
.
sub AppendText(strText As String)
    with txtStatus
        .setfocus '//required
        .value = .value & strText & vbNewLine
        .selstart = len(.Value)
    end with
end sub

答案 1 :(得分:0)

在史蒂夫·利维(Steve Lewy)对原始帖子的评论中提到的设计缺陷有一个解决方法。可能会出现一个文本框,该文本框可能同时执行以下两项操作:

  • 当内容对于盒子来说太大时,盒子不会 获得焦点,该框将显示其内容的最后一部分, 而不是它的第一部分。
  • 当框具有焦点时,它可以滚动到文本的任何部分, 但最初只显示文本的最后一部分, 光标放在文本的末尾。

这实际上是通过使用两个大小相同的重叠文本框来实现的,其中一个只有在焦点位于其他位置时才可见,而另一个只有在具有焦点时才可见。

这是在Access 2010中执行此操作的示例。

创建一个新的Access数据库,并在其唯一表中创建一个名为LongNote的备注字段。用一些长文本示例填充LongNote。创建用于编辑该表的表单。

使用所需的大小和字体创建一个名为BackBox的文本框,该文本框太小而无法完全显示其数据源LongNote的典型值。 (代替创建此框,您可以重命名在表单上创建的默认文本框。)

复制该框的精确副本,称为FrontBox。将FrontBox的数据源设置为BackBox的全部内容或内容的最后一部分,如下所示。最后部分的大小(以字符为单位)取决于框的大小及其字体,以及要显示的文本的类型。需要通过反复试验来选择它,以可靠地允许在框中显示许多字符。例如,下面是一个只能容纳250个字符的框的公式:

=iif(Len([BackBox])>=250,"... " & Right([BackBox],246),[BackBox]) 

如果整个值太大而无法显示,则在显示的部分之前三个点表示该值不完整。

创建另一个名为OtherBox的文本框,只需在已提及的两个框之外单击即可,因此它们都不是焦点。还要创建一个名为FocusTrap的微型(0.0097 x 0.0097)文本框,该文本框用于避免在显示表单时避免选择任何会引起焦点的文本框的全部内容(因为很难以这种方式选择文本)。

输入以下事件处理VBA代码:

' Prevent all text boxes from being focused when a new record becomes
' current, because the focus will select the whole text and make it ugly
Private Sub Form_Current()
   FocusTrap.SetFocus
End Sub
Private Sub Form_Open(Cancel As Integer)
   FocusTrap.SetFocus
End Sub

' When FrontBox receives focus, switch the focus to BackBox,
' which can display the entire text
Private Sub FrontBox_GotFocus()
   BackBox.SetFocus
   FrontBox.Visible = False
End Sub

' When BackBox receives the focus, set the selection to 
' the end of the text
Private Sub BackBox_GotFocus()
   BackBox.SelStart = Len([LongNote])
   BackBox.SelLength = 0
End Sub

' When BackBox loses focus, re-display FrontBox – if the text in 
' BackBox has changed, then FrontBox will follow the change
Private Sub BackBox_LostFocus()
   FrontBox.Visible = True
End Sub

测试表格。当您单击FrontBox时,它应该会消失,让您可以使用BackBox。当您在OtherBox中单击以从BackBox中删除焦点时,FrontBox应重新出现。在BackBox中所做的任何编辑都应反映在FrontBox中。

返回设计模式,移动FrontBox,使其完全覆盖BackBox,然后单击“位置” |“位置”。放到最前面以确保它覆盖了BackBox。现在再次测试表单。似乎只有一个文本框在“最后显示几行”模式和“整个内容编辑”模式之间切换。

答案 2 :(得分:-1)

只需在linefeed之后或Change event txtStatus

之后添加以下代码即可
txtStatus.SelStart = Len(txtStatus) - 1