我想在特定数量的可见行之后拆分文本框的文本。
我发现了一些"允许#34;但他们所有的代码都考虑了" vbCrLf"参数,但我想使用多行文本框的可见行进行拆分。
为了更清楚地理解,请考虑使用以下文本的多行文本框:
"教科书的历史可以追溯到古代历史的文明。例如,古希腊人写了用于教育的文本。现代教科书的根源在于印刷机所实现的标准化。 Johannes Gutenberg本人可能会出版Ars Minor的印刷版,这是Aelius Donatus的拉丁语法教科书。教师和教师使用早期教科书,他们使用这些书作为教学辅助工具(例如,字母书),以及自学的人。"
当我使用Textbox.Linecount
函数时,它返回数字6,因为文本框显示六行(这取决于控件的大小),但如果我使用像strText = Split(TextBox.Text, vbCrLf)
这样的函数,它将返回1,因为只有一个vbCrLf
。但是我需要考虑到控件的可见行,将文本拆分为两个文本框,就像在MS Word的分页符中发生的那样。
如需更好的视觉说明,请查看附图。
实施例
答案 0 :(得分:0)
首先,我不相信有一种强大而优雅的方法可以做到这一点,但实验很有趣,它可能对你有用。
以下内容会将TextBoxInput
的内容拆分为TextBoxPage1
和TextBoxPage2
,以打破PAGED_TEXT_BOX_LINES
指定的行号。
它使用文本框本身来检测自然换行符,从而隐含地满足文本框,字体等的大小。
所需的行数被硬编码为常量 - 不这样做需要另外计算文本框的行高(需要根据字体度量和文本框的内部行前导大小进行计算)
它只处理两个"页面"。但是,这个概念可以简单地通过基于TextBoxPage2
中最后的文本的剩余部分重复该过程来扩展。
Private Sub CommandButton1_Click()
Const PAGED_TEXT_BOX_LINES As Integer = 5
Dim text As String
Dim i As Long
Dim textLength As Long
Dim curLine As Integer
text = TextBoxInput.text
textLength = Len(text)
TextBoxPage1.SetFocus
'add characters of the input string until the first page textbox
' exceeds maximum line count
For i = 1 To textLength
TextBoxPage1.text = Mid$(text, 1, i)
If TextBoxPage1.LineCount > PAGED_TEXT_BOX_LINES Then
'retreat cursor until we reach previous line, so we can
' detect the word that wrapped
curLine = TextBoxPage1.curLine
Do While TextBoxPage1.curLine = curLine
TextBoxPage1.SelStart = TextBoxPage1.SelStart - 1
Loop
'the remaining text after the SelStart is what
' wrapped, so stop page 1 after SelStart
TextBoxPage1.text = Mid$(text, 1, TextBoxPage1.SelStart)
TextBoxPage2.text = Trim$(Mid$(text, TextBoxPage1.SelStart + 1))
Exit For
End If
Next i
End Sub