Как быстро склеивать строки

Склеивание строк стандартными методами происходит довольно медленно, особенно когда результирующая строка очень большая. Для примера вставьте на форму MSFlexGrid, заполните ячейки произвольными значениями и вставьте такой код:

Dim Text As String
Dim i As Long
Dim j As Long
With MSFlexGrid1
For i = 1 To .Rows - 1
For j = 1 To .Cols - 1
Text = Text + .TextMatrix(i, j) + Chr$(9)
Next
Text = Left$(Text, Len(Text) - 1)
Text = Text + Chr$(13) + Chr$(10)
Next
Text = Left$(Text, Len(Text) - 2)
End With
Склеивание ячеек происходит медленно так как переменная Text постоянно изменяет свой размер при добавлении нового значения. Гораздо быстрее будет воспользоваться API функцией CopyMemory:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Private Sub Command1_Click()
Dim Text As String
Dim i As Long
Dim j As Long
' Переменная pos обозначает номер позиции в текстовой
' строке, с которой будет добавляться новый символ
Dim pos As Long
Dim src As String
' Заполняем строку пробелами
Text = Space$(10000)
With MSFlexGrid1
For i = 1 To .Rows - 1
For j = 1 To .Cols - 1
' Присваиваем src содержимое ячейки плюс символ табуляции
src = .TextMatrix(i, j) + Chr$(9)
' Если начальная позиция плюс длина добавляемой строки
' превышает размер строки Text, то прибавляем к ней следующие
' 10000 пробелов
If pos + LenB(src) > LenB(Text) Then Text = Text + Space$(10000)
' Копируем содержимое добавляемой строки в переменную Text
' с позиции pos
CopyMemory ByVal StrPtr(Text) + pos, ByVal StrPtr(src), LenB(src)
' Устанавливаем новую позицию для текста
pos = pos + LenB(src)
Next
' После прохода всех колонок убираем из конца строки символ табуляции
' просто сдвинув позицию на 2 байта (каждый символ занимает 2 байта)
pos = pos - 2
' Добавляем символы перевода строки
src = Chr$(13) + Chr$(10)
If pos + LenB(src) > LenB(Text) Then Text = Text + Space$(10000)
CopyMemory ByVal StrPtr(Text) + pos, ByVal StrPtr(src), LenB(src)
pos = pos + LenB(src)
Next
' Убираем из конца строки символы перевода строки
Text = Left$(Text, pos \ 2 - 2)
End With
End Sub
Этот способ более громоздкий, но он стоит того, так как быстрее примерно в 20 раз.
Hosted by uCoz