【问题标题】:Auto scroll to bottom with a textbox使用文本框自动滚动到底部
【发布时间】:2011-09-30 05:51:02
【问题描述】:

我有一个由 ms 访问创建的 mdb 文件。它在里面有一个表格,表格里面有一个大文本框。

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

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

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

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

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

我希望有一些简单而漂亮的方法来实现这一点。我不想添加一些仅适用于某些计算机的代码,因为它依赖于 Windows 平台的内核/等。

【问题讨论】:

  • 文本框设计的问题在于,一旦失去焦点,它将恢复显示文本的开头(而不是结尾)。就我而言,这是一个设计缺陷。控件应该有一个属性,允许设计者指定是否显示文本内容的顶部/底部。

标签: forms ms-access vba


【解决方案1】:

您可以通过调用 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

【讨论】:

  • 您还应该输入.selength = 0 以避免用户使用箭头键时出现问题。
  • 这根本不会向下滚动
【解决方案2】:

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,然后单击 Position |带到前面以确保它覆盖 BackBox。现在再次测试表单。看起来应该有一个文本框在显示最后几行模式和编辑整个内容模式之间切换。

【讨论】:

    【解决方案3】:

    只需将以下代码放在linefeed 之后或Change event txtStatus

    txtStatus.SelStart = Len(txtStatus) - 1
    

    【讨论】:

      猜你喜欢
      • 2017-02-07
      • 1970-01-01
      • 2014-12-22
      • 2014-12-20
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      相关资源
      最近更新 更多