文本比对程序设计(按行)中的同步滚动问题--“瞬间限高”方法

作者在 2025-04-06 16:21:28 发布以下内容
图一A.png (上传于2025-04-06 16:21:28)
图一A.png

图一B.png (上传于2025-04-06 16:21:28)
图一B.png

图二A.png (上传于2025-04-06 16:21:28)
图二A.png

图二B.png (上传于2025-04-06 16:21:28)
图二B.png

    左右两个文本框中的文件,它们的行数不一定是一样的。但是比对后,为了方便用户的观察和分析研究,程序会在两边适当的位置插入一些“斜纹行”。这样一来,两边的行数就一样了。只要有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


默认分类 | 阅读 22 次
文章评论,共0条
游客请输入验证码
浏览99708次
文章分类