Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как добавить много текста в стринговую переменную? 
:(
    Опции темы
cardinal
Дата 19.3.2007, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Если нужно много добавлять в текстовою переменную
Код
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 спасибо!


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.