RichTextBox:тормозища при поиске и выделению текста

Создание, использование компонентов ActiveX
vlad707
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 27.01.2004 (Вт) 11:33

RichTextBox:тормозища при поиске и выделению текста

Сообщение vlad707 » 28.01.2004 (Ср) 11:34

Вкраце, ( ПРОШУ НЕ ОСТАВИТЬ БЕЗ ВНИМАНИЯ )
Работаю в Аксесс 2002
при вводе в RichTextBox 4000 строк, поиске и выделении красным цветом одного слова- хорошая машина выполняет задание 2,5 часа -(((((((. поиск произвожу при помощи instr () {код ниже}
Да, причём, производительность падает по экспоненте в зависимости от введенного текста.
Простое выделение текста ,без поиска происходит так же медленно ,как и поиск...
пример: выделение в 32762 символах (200 строк) по 4 символа, пропуск и заного 4 символа (5471 раз) занимает 3 мин 46 сек
как вы понимаете- никуда не годится...

вопросы:
1 Как повысить производительность ???
2 в экселе или в ворде воиск и выделение не будет ли наботать быстрее?? (а потом перекинуть в ричтекстбокс)
3 метод find работает быстрее instr Я идиот! Убейте меня, кто-нибудь!?
не работает такая строка

indexToText = RichTextBox1.Find(Text, start, RichTextBoxFinds.MatchCase)
ругается на RichTextBoxFinds.MatchCase
работает такая строка но не совсем правильно
lWhere = RichTextBox1.Find("кабел", 0, , rtfNoHighlight)

4 при выполнении скрытия и появление контролла- он перезагружается..-((( (как будто срабатывает событие лоад...)
Private Sub Кнопка13_Click()
Me.RichTextBox1.Value = Me.Поле9.Value
End Sub

Private Sub Кнопка14_Click()
Me.RichTextBox1.Visible = False
End Sub
вообще скрытие контролла поможет увеличить производительность??

Скажите как быть ,проблема очень актуальна! бъюсь не один день....

код моего поиска

Private Sub Кнопка1_Click()
Dim lWhere, lPos As Long
Dim sTmp, sSearch, t As String
Dim dn, dk, dr As Date
lPos = 1
dn = Time
'Здесь вы можете указать слово для поиска и замены
sSearch = "кабел"
'поиск по всему тексту
Do While lPos < Len(Me.RichTextBox1.text)
sTmp = Mid(Me.RichTextBox1.text, lPos, Len(Me.RichTextBox1.text))
Debug.Print Len(Me.RichTextBox1.text)
lWhere = InStr(sTmp, sSearch)
lPos = lPos + lWhere
If lWhere Then 'если строка для поиска найдена
Me.RichTextBox1.SelStart = lPos - 2 'установить начало выделения
Me.RichTextBox1.SelLength = Len(sSearch) 'установить длину выделения
'Me.RichTextBox1.Object.SelColor = RGB(255, 0, 0) 'изменить цвет выделения красным цветом
Me.RichTextBox1.SelColor = RGB(255, 0, 0) 'изменить цвет выделения красным цветом
'Выделить текст жирным шрифтом
'RichTextBox1.SelBold = True
'Выделить текст курсивом
'RichTextBox1.SelItalic = True
'Выделить текст подчеркнутым шрифтом
'RichTextBox1.SelUnderline = True
'Просмотр текста в виде простого текста
'MsgBox RichTextBox1.Text
'Просмотр текста в виде RTF
'MsgBox RichTextBox1.TextRTF
Else
Exit Do
End If
Loop
dk = Time
dr = dk - dn
MsgBox dn & " , " & dk & " разница" & dr
End Sub

или

Private Sub Кнопка4_Click()
Dim lPos, lPos1 As Long
Dim Length_word, i As Integer
Dim txt, sSearch As String
lPos = 1
lPos1 = 0
i = 0

'Здесь вы можете указать слово для поиска и замены
sSearch = "кабел"
txt = Me.RichTextBox1.text
'длина всего текста
'Length_text = Len(Me.RichTextBox1.Text)
'длина всего текста
Length_word = Len(sSearch)
'поиск по всему тексту
Do

i = i + 1
lPos = InStr(lPos, txt, sSearch)
If i = 1 Then
lPos1 = lPos
End If
If i <> 1 And lPos <= lPos1 + Length_word Then
Exit Do
End If
Me.RichTextBox1.SelStart = lPos 'установить начало выделения
Me.RichTextBox1.SelLength = Length_word 'установить длину выделения
lPos = lPos + Length_word
Me.RichTextBox1.SelColor = RGB(255, 0, 0) 'изменить цвет выделения красным цветом

Loop Until lPos = 0

End Sub

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 09.03.2004 (Вт) 20:30

Значит, так. Полным переходом на API (при любом обрашении к RTB) ты отвоюешь примерно половину времени, в худшем случае. Далее, перед поиском посылай этому козлу WM_SETREDRAW со значением 0, а после - с 1. Что касается поиска... если мне не изменяет память, у него есть собственный метод Find() (а следовательно, и соотв. оконное сообщение :) ), который на неск. порядков круче твоего InStr(). Вообще, в мире грамотный пипл докторские защищает на алгоритмах поиска, так что советую не брезговать и воспользоваться. Для выделения и закраски - тоже API, не помню точно, что именно, но сообщения там есть, будь спок. И, конечно, блочь перерисовку - у тебя это будет самая частая функция.


Вернуться в Компоненты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 31

    TopList