VSFlexGrid复制 粘贴 剪切 删除 的实现

VSFlexGrid控件功能强大,百度一搜,就能找到如何使用该控件的入门例子了。

例如这篇文章:http://blog.163.com/maoyue_26/blog/static/6987496120119157231971/

很多博客都有这篇文章,所以原作者以无从考究

 

我也刚用完到这篇文章的粘贴、复制、剪切功能实现的部分,

其中对粘贴功能做了一些修正。

引用的帖子,实现的功能是,假设你本来有4*4的格子,你要粘贴5*5,那么就会只帮你贴4*4的;

我实现的是自动扩充为5*5,

其次,引用的帖子中的粘贴功能,在判断列数上,会少判断一列(粘贴过来的会少了一列)

如果数据从Excel粘贴到VSFlexGrid,记得是没问题的,

数据从VSFlexGrid粘贴到VSFlexGrid,就会出现问题。

 

还有一些极端情况,原来的代码也没考虑,例如本来为0行0列的格子。(我的也有点bug)

 

最后,就是原来代码通过mid函数找换行符和制表符,当数据量很大的时候(50万个字符),基本是假死现象。

我直接将粘贴板中的字符串变为字符数据,这样50万也只需要30毫秒。

 

但是引用的文章给了我莫大的帮助,带领了我入门,还是要深表感谢的。

代码确实要放到生产环境中,才能检验其正确及可靠性啊~~

 

代码如下:

'粘贴
Public Sub GridPaste(grid As VSFlexGrid)
    Dim i As Long
    Dim j As Long
    Dim t As Long   '要粘贴的文本的总字符数
    
    
    Dim s As Long   '每行的列计数器(通过分隔符\t Chr(9) 判断)
    Dim colSel As Long  '要粘贴的最大列数
    Dim rowSel As Long   '要粘贴的总行数(通过换行符\t Chr(13) 判断)
    
    Dim lastChar As String
    
    Dim Buffer() As Byte
    Dim beginTime As Long
    Dim endTime As Long
        
    'If grid.Rows = 1 Then Exit Sub
    t = Len(Clipboard.GetText)
    If t = 0 Then Exit Sub
    t = t - 1
    
    lastChar = Right(Clipboard.GetText, 1)
    'MsgBox "last char is " & Asc(lastCha)
    'MsgBox Clipboard.GetText
    
    '这个算法 用Mid方法,每次都要在字符串中找出一个字符,当文本很大(50万)的时候,速度会很慢,基本为死机状态
    'For i = 1 To t
    '    If Mid(Clipboard.GetText, i, 1) = Chr(9) Then
    '        s = s + 1     '\t制表符 则 加列
    '    ElseIf Mid(Clipboard.GetText, i, 1) = Chr(13) Then
    '        rowSel = rowSel + 1    '\n回车   则 既要加行又要加列  (否则会少了最后一列)
    '        s = s + 1
    '        If s > colSel Then      '记录最大列数
    '            colSel = s
    '        End If
    '        s = 0           '列计数清0
    '    End If
    'Next
    '将整个文本放入数组
    
    '将字符串直接变为数组,通过下标直接取数,50万字符耗时31毫秒
    'beginTime = GetTickCount()
    Buffer = Clipboard.GetText
    For i = 0 To t
        If Buffer(i) = 9 Then
            s = s + 1     '\t制表符 则 加列
        ElseIf Buffer(i) = 13 Then
            rowSel = rowSel + 1    '\n回车   则 既要加行又要加列  (否则会少了最后一列)
            s = s + 1
            If s > colSel Then      '记录最大列数
                colSel = s
            End If
            s = 0
        End If
    Next
    'endTime = GetTickCount()
    'MsgBox "共耗费时间:" & (endTime - beginTime) & "毫秒"
    
    
    'beginTime = GetTickCount()
    'rowSel = UBound(Split(Clipboard.GetText, Chr(9)))
    'rowSel = UBound(Split(Clipboard.GetText, Chr(13)))
    'endTime = GetTickCount()
    'MsgBox "共耗费时间:" & (endTime - beginTime) & "毫秒"
    
    '如果Clipboard.GetText不以换行符结束,则要主动多加一行
    If lastChar <> vbCr And lastChar <> vbCrLf And lastChar <> vbLf Then
        rowSel = rowSel + 1
    End If
    
    '计算要粘贴的总列数 也许每一行的项数不同,用一下算法计算出最大列数
    'colSel = -Int(-(s / rowSel))       '除不尽的向上取整 : -Int(-变量)是整数向上取整的方法
    
    'MsgBox "粘贴的行*列:" & rowSel & "*" & colSel
    'MsgBox "鼠标所在行数-列数:" & grid.rowSel & "*" & grid.colSel
    'MsgBox "表格总行数-列数:" & grid.Rows & "*" & grid.Cols
    
    '如果表格没有列头,或只有列头,需要加入以下代码修正
    If 2 > grid.Rows Then   '创建2行的数据表,第一行为列头,第二行开始才存放数据
        grid.Rows = grid.Rows + 1
    End If
    
    If grid.rowSel <= 0 Then
        grid.Row = grid.Row + 1
    End If
    
    If 0 = grid.Cols Then   '若grid.Cols为0,那么grid.Col会是-1
        grid.Cols = 1
        grid.Col = 0
        'grid.colSel = 0
    End If
    '修正结束
    
    
    
    
    '判断 如果 粘贴的行 + 鼠标所在行 > 表格总行数,则表格总行数要增加这么多:(粘贴的行 + 鼠标所在行)- 表格总行数
    If (rowSel + grid.rowSel > grid.Rows) Then
        grid.Rows = rowSel + grid.rowSel
    End If
    '判断 如果 粘贴的列 + 鼠标所在列 > 表格总行列,则表格总列数要增加这么多:(粘贴的行 + 鼠标所在行)- 表格总行数
    If (colSel + grid.colSel > grid.Cols) Then
        grid.Cols = colSel + grid.colSel
    End If
    
    'MsgBox "表格总行数-列数:" & grid.Rows & "*" & grid.Cols
    
    
    '将选中的格子里面的内容先清空,否则会有各种奇怪现象
    For i = grid.rowSel To grid.Row + rowSel - 1
        For j = grid.colSel To colSel + grid.Col - 1
            grid.TextMatrix(i, j) = ""
        Next
    Next
    
    '通过程序实现选中多行多列的格子,否则,只有鼠标点中的格子有东西,其他没有
    '记住减1,例如鼠标在第1行,一共要粘贴5行,那就是选中1至5行,所以是1+5-1
    grid.rowSel = rowSel + grid.Row - 1
    '记住减1,例如鼠标在第1列,一共要粘贴5列,那就是选中1至5列,所以是1+5-1
    grid.colSel = colSel + grid.Col - 1
    
    grid.Clip = Clipboard.GetText
End Sub

 

你可能感兴趣的:(VB)