|
Вопрос # 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 Вадим К : я просто невнимательно прочитал ваш ответ ) идея была по сути той же: массив строк, возможность менять их порядок при помощи указателей.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|