Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:

Error. Page cannot be displayed. Please contact your service provider for more details. (14)


Как добавить много текста в стринговую переменную?

Поиск:
Если нужно много добавлять в текстовою переменную
Код
Dim A As String, N As Integer
For N = 1 To 1000
    A = A & "Text" 'Частое добавление к строке
Next N

Тогда используйте класс "ClassSAdd"
Код
Option Explicit
Private nTextPos As Long
Private nLenText As Long
Private mvarsText As String

Public Property Let sText(ByVal vData As String)
    If vData = "" Then
        Clear
        Exit Sub
    End If
    mvarsText = vData & String$(1024, " ")
    nTextPos = Len(vData)
    nLenText = Len(mvarsText)
End Property

Public Property Get sText() As String
    sText = RTrim(mvarsText)
End Property

Public Sub Add(sText As String)
    Dim nLocalLen_sText As Long
    nLocalLen_sText = Len(sText)
    If nLocalLen_sText = 0 Then Exit Sub
    If (nTextPos + nLocalLen_sText) > nLenText Then
        mvarsText = mvarsText & String$(1024 + nLocalLen_sText, " ")
        nLenText = Len(mvarsText)
    End If
    Mid$(mvarsText, nTextPos, nLocalLen_sText) = sText
    nTextPos = nTextPos + nLocalLen_sText
End Sub

Public Sub Clear()
    mvarsText = String$(1024, " ")
    nTextPos = 1
    nLenText = 1024
End Sub

Private Sub Class_Initialize()
    Clear
End Sub

И так будет намного быстрее
Код
Dim B As New ClassSAdd, N As Integer
For N = 1 To 1000
    B.Add "Text"
Next N


Akina:
Цитата(Vach @  25.8.2005,  16:45)
Если нужно много добавлять в текстовою переменную

Код

Function MakeLongString(ByVal Fragment As String, ByVal  Count As Integer) As String
Dim i As Integer
Dim Length As Integer
i=1
Length=Len(Fragment)
While i<Count
   i=i+i
   Fragment=Fragment & Fragment
Wend
MakeLongString=Left(Fragment,Length*Count)
End Function


Так будет еще быстрее...

Vach:
 Akina я криво пример описал. 
Мой пример предназначен для плюсования разных переменных. Тоесть "Text" меняется.
Ускорение происходит именно из замены "Fragment=Fragment & Fragment" на вклеивание в пустой буфер.
При увеличении длины "Fragment" новое добавление происходит всё медленнее.

Akina:
Тогда:
  • Dim-нуть стринговый массив нужной высоты.
  • Присвоить каждому элементу значение очередной переменной.
  • Собрать в строку с помощью Join(Array,"").
Опять же быстрее выйдет. 

Vach:
 Вариант с Array
Код
Option Explicit
Private mvarsMText() As String
Private mvarsMTextCoun As Long

Public Property Let sText(ByVal vData As String)
    Clear
    mvarsMTextCoun = 1
    mvarsMText(0) = vData
End Property

Public Property Get sText() As String
    sText = Join(mvarsMText, "")
End Property

Public Sub Add(sText)
If mvarsMTextCoun > UBound(mvarsMText) Then
    ReDim Preserve mvarsMText(mvarsMTextCoun + 1000)
End If
mvarsMText(mvarsMTextCoun) = sText
mvarsMTextCoun = mvarsMTextCoun + 1
End Sub

Public Sub Clear()
    ReDim mvarsMText(0)
    ReDim mvarsMText(1000)
    mvarsMTextCoun = 0
End Sub

Private Sub Class_Initialize()
    Clear
End Sub

При сравнении получилось следующие
Добавление 20 тысяч строк:
ClassSAdd :O,200000000002213
ClassSAddArray :З,00000000051242E-02
C :4,84700000000629
Вывод: Array работает быстрее и при увеличении числа добавлений обгоняет всё больше.

Добавление 20 тысяч строк и чтение результата:
ClassSAdd :7,59099999999872
ClassSAddArray :28,6109999999984
sText = sText & "Text" :21,9619999999939
Вывод: ClassSAdd работает быстрее и отрыв повышается при увеличении добавлений

Если нужно собрать строку быстро а читать результат только в конце тогда ClassSAddArray быстрее и на оборот.
Akina спасибо!
Автор: Vach






Просмотров: 3005

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную