| 
| 
 | Вопрос # 3 099/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты! Задачка конечно, но  меня она поставила в тупик. Нажно ограничить колличество строк выводимых в Memo, причем при добавленнии новых строк ниже, удаляются верхние (т.е. общее число строк постоянно).Есть такой вариант, но уж ооочень медленный (обработка в Memo1.onChange):
 if Memo1.Lines.Count > 20 then
 for k:=0 to  Memo1.Lines.Count-20 do memo1.Lines.Delete(k);
 
 Есть ли более быстрые или даже мгновенные варианты реализации подобного?
 
|  |   Вопрос задал: Phoenix (статус: Посетитель)Вопрос отправлен: 18 августа 2009, 15:11
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: min@y™ Попробуй так:
 
 if Memo.Lines.Count < 21
  then Exit;
 
Memo.Lines.BeginUpdate();
try
  while Memo.Lines.Count > 20
    Memo.Lines.Delete(0);
finally
  Memo.Lines.EndUpdate();
end;
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 18 августа 2009, 15:45
 Оценка за ответ: 5
 Комментарий к оценке: хороший вариант, только если добавляем по одной-две строки, а если сразу 50? туши свет ;) |  
 Мини-форум вопросаВсего сообщений: 13; последнее сообщение — 18 августа 2009, 18:46; участников в обсуждении: 4. 
|   | Вадим К (статус: Академик), 18 августа 2009, 16:26 [#1]:А если сразу 50, то не надо и добавлять. просто берем последние 20 и заменяем. В целом, сразу писать в мемо напрямую и ограничивать кол-во строк через событие - плохая затея. Тормозить будет по умолчанию. Но быстрые способы есть.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Phoenix (статус: Посетитель), 18 августа 2009, 16:34 [#2]:а если добавлять в tstringlist, там ограничивать, а затем присваивать к memo? |  
|   | min@y™ (статус: Доктор наук), 18 августа 2009, 16:40 [#3]:Опиши, как тебе нужно, чтобы работало. Кто эти строки добавляет и при каких обстоятельствах? И зачем их удалять?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Phoenix (статус: Посетитель), 18 августа 2009, 16:46 [#4]:строки постоянно добавляет программа по ходу работы, получается очень много текста, и memo начинает тормозить при добавлении в него последующих строк и прокрутке. |  
|   | Вадим К (статус: Академик), 18 августа 2009, 16:55 [#5]:Ну так зачем в мемо добавлять. Пишите в файл и будет счастье. я так понимаю, это лог? Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Phoenix (статус: Посетитель), 18 августа 2009, 17:02 [#6]:да, это лог, и в файл пишется, но то что выводится в мемо - его визуальная часть, должна быть на виду. |  
|   | min@y™ (статус: Доктор наук), 18 августа 2009, 17:34 [#7]:Короче, вместо мемо пиши в LogList: TStringList, затем его обрезай до нужной длины (20 строк), а потом обновляй мемо: 
 Memo.Lines.Assign(LogList);
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | lx (статус: Посетитель), 18 августа 2009, 17:38 [#8]:+к этому можешь обновлять мемо "через раз" или по таймеру. |  
|   | Вадим К (статус: Академик), 18 августа 2009, 17:51 [#9]:есть простое решение и сложное. Подумать, надо ли все эти сообщения в мемо. Скорее всего там их нужна часть. 
 Второе решение - это завести массив строк (а лучше заведомо фиксированных в длине). этот массив будет циклическим буфером. Поэтому надо будет ещё указатель на его начало.
 При добавлении в буфер указатель увеличивается на единицу и строка записывается по новому адресу.
 А выводить не в мемо, а на форму или к примеру панель. и не всегда, а по мере появления события OnPaint. Это даст большой прирост скорости. Но вот только смысл в ней, если сообщения пробегают так быстро, что их читать невозможно.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Phoenix (статус: Посетитель), 18 августа 2009, 18:10 [#10]:да, мудреное это дело, придется полностью очищать через определенное время по таймеру. |  
|   | lx (статус: Посетитель), 18 августа 2009, 18:15 [#11]:имхо, лучше не массив строк сделать, а связный список - не придётся двигать строки при удалении. |  
|   | Вадим К (статус: Академик), 18 августа 2009, 18:31 [#12]:Связанный список будет в целом в данной задаче хуже. подумайте почему. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | lx (статус: Посетитель), 18 августа 2009, 18:46 [#13]:2 Вадим К : я просто невнимательно прочитал ваш ответ ) идея была по сути той же: массив строк, возможность менять их порядок при помощи указателей. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |