作者在 2025-04-06 16:21:28 发布以下内容
左右两个文本框中的文件,它们的行数不一定是一样的。但是比对后,为了方便用户的观察和分析研究,程序会在两边适当的位置插入一些“斜纹行”。这样一来,两边的行数就一样了。只要有1行两边对齐了,整个文本就左右对齐了。
但是,因为2个文本框是相互独立的,用户的操作很容易造成两边“错位”。怎样才能让用户很方便地“对齐文本”并“同步滚动”呢?我采用的方法是“瞬间限高”。具体的说明如下:
先把操作方法说明一下:不管当前的窗口是否已经对齐,只要用鼠标选中某一行中的几个字,就可以让两个文本的内容“对齐并同步滚动”。
注意:(两边)窗口中的“行”,都分为2类:“顶行(仅1行)”和“其他行”。
1.如果在“顶行”中选择几个字,则产生类似【PageUp】的效果,“顶行”会“下移”到窗口底部(滚动条的滑块上移,内容后退)。
2.如果在“其他 1 行”中选择几个字,则【该行】会向上移动到窗口的【顶行】。比如,选中“窗口底行”中的几个字,该行就移动到了窗口顶部,近似于按了PageDown键。
关键是,另一个窗口中的文本,会自动向“选中字的窗口”对齐。
接下来,说一下怎样设计程序:
1.定义2个1维的数组(长整型):GL()、GR()。把左边的文本的每行的首字的“位置”放入GL(),把右边的……放入GR()。(VB代码在文章的末尾)
2.根据选中的字符的位置,算出数组的“下标值”。
3.★把2个文本框的高度设置成“1行”。然后依据“下标值”呼唤左右的2个对应行。因为2个文本框是左右并排的,这样一来,左右2行就被迫“对齐”了。再把“高度”复原。这2行就“滚动”到了“顶部”,而且2个文本“整个对齐”了。
用户是感觉不到文本框的变化的,视觉效果跟按了PageUp、PageDown相似。
Private Sub DuiQi() '为了左右对齐:GL()、GR()
Dim i%, j%, a&, s&
txt1=RT1.Text
txt2=RT2.Text
a = 1
s = 1
i = 1
ReDim Preserve GL(i)
GL(1) = 1
Do
s = InStr(a, txt1, vbCrLf)
If s = 0 Then Exit Do
i = i + 1
ReDim Preserve GL(i)
GL(i) = s + 2 '左边第 i 行的第1个字的位置
a = s + 2
Loop
i = 1
a = 1
s = 1
ReDim Preserve GR(i)
GR(1) = 1
Do
s = InStr(a, txt2, vbCrLf)
If s = 0 Then Exit Do
i = i + 1
ReDim Preserve GR(i)
GR(i) = s + 2 '右边第 i 行的第1个字的位置
a = s + 2
Loop
End Sub
Private Sub RT1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
'选中几个字,可以左右对齐。
Dim a1 As Long, i%
If RT1.SelLength = 0 Then Exit Sub
a1 = RT1.SelStart + 1
For i = 1 To UBound(GL)
If GL(i) > a1 Then Exit For
Next i
i = i - 1
If Y - RT2.Top < 280 Then'为了限定在★第 1 行,要根据字体、窗口调整数据280
Call UW(i) '选中▲第一行中几个字 Up 后退、文本下移、行号变小
Else
Call DW(i) '选中●其他行中几个字;该行置顶 Down 前进、文本上移、行号变大
End If
End Sub
Private Sub UW(i As Integer) '【Up】仅仅选中【顶行】、对齐、向上滚动20行
Dim n%
n = i - 29'后退。适当调整,与窗口的总行数有关
If n < 1 Then n = 1
RT1.Height = 700'★压缩行高适当调整,一行的窗口高度,与字体大小有关
RT1.SelStart = GL(n)'后退【PageUp】
RT1.Height = 7230'窗口原来的高度 适当调整
RT1.SelStart = GL(i)
RT1.SelLength = 1
RT2.Height = 700
RT2.SelStart = GR(n)'后退【PageUp】
RT2.Height = 7230
RT2.SelStart = GR(i)
RT2.SelLength = 1
End Sub
Private Sub DW(i As Integer) '选中任何1行【非顶行】、对齐、置顶【Down】
RT1.Height = 700★压缩行高
RT1.SelStart = GL(i)
RT1.SelLength = 1
RT1.Height = 7230'窗口原来的高度 适当调整
RT2.Height = 700
RT2.SelStart = GR(i)
RT2.SelLength = 1
RT2.Height = 7230
End Sub