Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2009, 15:07   #1
iiunbreakableii
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 89
По умолчанию Как укорить работу со строками в Richedit?

Здравствуйте господа, ПРОграммеры!
Подскажите пожалуйста как ускорить этот процесс:
Код:
procedure TMainForm.colorize;
var
  i, tagpos,spacepos: integer;
  str, CurState: string;
begin
  for I := 0 to Richedit.Lines.Count - 1 do          
    begin
      str:=Richedit.lines.Strings[i];
      tagpos:=pos('/',str);
      while tagpos<>0 do
        begin
           spacepos:=posex(' ',str,tagpos+1);
           Richedit.SelStart:=Richedit.Perform(em_lineindex,i,0)+tagpos;
           Richedit.SelLength:=spacepos-tagpos-1;
           Richedit.SelAttributes.Color:=clblue;
           tagpos:=posex('/',str,tagpos+1);
        end;
    end;
end;
Когда в Richedit грузятся большие файлы(>1 Mb), то программа "уходит в себя" как минимум на 5 минут.
iiunbreakableii вне форума Ответить с цитированием
Старый 28.07.2009, 15:10   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Не понял, Вам нужно ускорить именно этот участок или загрузку текстов в RichEdit?
Касательно, Вашего фрагмента текста - использование RichEdita для раскраски самая худшая идея. Я как-то пытался сделать подсветку синтаксиса. Лучше использовать другие компоненты.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 28.07.2009, 15:30   #3
iiunbreakableii
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 89
По умолчанию

Мне нужно ускорить сам цикл обработки строк.
Вообще-то кроме подсветки, в проге выделяются слова (справа и слева от '/')
Вот код
Код:
procedure TMainForm.BbtnClick(Sender: TObject);
var
  i, j, x, y, tagpos,spacepos: integer;
  str, CurState, word: string;
  sum: Extended;
begin
  b.RemoveRows(1,b.RowCount-1); //B - TADVStringGrid
  for I := 0 to Tagged.Lines.Count - 1 do	//Tagged - TRichedit
    begin
      str:=Tagged.lines.Strings[i];
      tagpos:=pos('/',str);
      while tagpos<>0 do
        begin
          spacepos:=tagpos-1;
          while (spacepos>0)and(str[spacepos]<>' ') do dec(spacepos);
          word:=copy(str,spacepos+1,tagpos-spacepos-1);
          spacepos:=tagpos+1;
          while (spacepos<length(str))and(str[spacepos]<>' ') do inc(spacepos);
          CurState:=copy(str,tagpos+1,spacepos-tagpos);
          x:=b.Rows[0].IndexOf(CurState); if x<1 then ShowMessage('Warning! \'+curstate+'/ not found.');
          y:=b.Cols[0].IndexOf(Word);
          if y=-1 then
             begin
               b.AddRow; y:=b.RowCount-1;
               b.Cells[0,y]:=LowerCase(word);
               for j:= 1 to n do
                 begin
                   b.Cells[j,b.RowCount-1]:='0';
                   b.CellProperties[j,b.RowCount-1].FontColor:=clblue;
                 end;
             end;
          b.Cells[x,y]:=inttostr(strtoint(b.Cells[x,y])+1);
          b.CellProperties[x,y].FontColor:=clred;
          tagpos:=posex('/',str,tagpos+1);
        end;
    end;
  for i:= 1 to b.RowCount-1 do
    begin
      sum:=b.RowSum(i,1,b.ColCount);
      for j:= 1 to b.ColCount-1 do
        b.Cells[j,i]:=FloatToStrF(strtoint(b.Cells[j,i])/sum,ffNumber,2,2);
    end;
end;
iiunbreakableii вне форума Ответить с цитированием
Старый 28.07.2009, 15:33   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
использование RichEdita для раскраски самая худшая идея.
Ну почему же, если грамотно сделать подкачку в РичЭдит то вполне можно его использовать. Впрочем собственный редактор написать не так уж и сложно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.07.2009, 11:02   #5
iiunbreakableii
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 89
По умолчанию

А как грамотно сделать подкачку в Richedit?
iiunbreakableii вне форума Ответить с цитированием
Старый 29.07.2009, 11:42   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А как грамотно сделать подкачку в Richedit?
Я лично так сразу не готов ответить. Это нужно разработать стратегию. Читать файл не весь а олько ту его часть которая может поместиться на экране, и при отрисовке отрисовывать сразу стили... т.е. фактически написать свой РичЭдит...
Ну я бы так по крайней мере сделал...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.07.2009, 13:08   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Я и говорю, используй не RichEdit. Компоненты по подсветке синтаксиса уже обсуждались (лично я участвовал в двух таких темах) - используйте поиск по форуму. Задача решается гораздо быстрей.
Ну а так, надо отслеживать прокрутку RichEdita - чтобы не было проблем со скоростью читать лучше через буфер (минимум на три видного пространства RichEdita - а то как же с PageUp PageDown). Работу с фалами осуществлять через потоки (сам проверял - быстрей чем стандартными методами).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как автоматизировать работу Intery Microsoft Office Word 13 31.07.2009 18:24
RichEdit вставка форматированного текста и расстояние между строками. Armorer Общие вопросы Delphi 2 30.04.2009 08:16
задача на работу с файлами и строками MiH@N Помощь студентам 8 24.06.2008 00:44
Задачка на работу с символами и строками Go6a Помощь студентам 10 30.03.2008 16:31
Как найти работу? Lika Свободное общение 7 15.12.2007 16:20