Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Общие вопросы > Как вставить текст в конец Memo |
Автор: Hacker 21.3.2006, 15:12 |
Помогите. Ситуация такая: прога читает данные с COM-порта и заносит их в memo по мере поступления. Если применять метод memo.text:=memo.text+s; // то текст мемки будет весь копироваться. Во-первых это приведёт к миганию, а во вторых если наберётся МНОГО данных, прога не будет успевать копировать текст и принимать данные с порта. Вопрос: как можно добавлять текст в конец memo, НО чтобы он добавлялся НЕ как строка (memo.lines.append()), а просто дописывался без перерисовки всего компонента и без копирования всего содержимого мемки в неё же. |
Автор: bems 21.3.2006, 15:18 |
Промежуточный вариант: memo.lines[memo.lines.count-1]:=memo.lines[memo.lines.count-1]+s |
Автор: Alexeis 21.3.2006, 15:21 |
Hacker, с одной строкой будет тотже эффект может имеет смысл накапливать текст скажем по 1024 байта, а потом добавлять к какому-нибудь буферу. Можно использвать TMemorystreem Если не нужно перерисовывать так зачем вообще его отображать прямо сразу ![]() |
Автор: Hacker 21.3.2006, 15:53 |
2 alexeis1 Я имел ввиду, что не нужно перерисовывать весь текст, просто добавлять и всё (например пишешь в delphi прогу, она же не перерисовывает весь текст проги при вводе каждого символа). 2 bems Спасибо, как я сам не додумался. Может у кого есть ещё идеи, желательно чтобы курсор оставался на месте и не трогался программой (чтобы пользователь мог просматривать, прокручивать и даже редактировать текст во время приёма данных). P.S: Блин, даже не ожидал получить ответы так быстро, бывает задашь вопрос (на других форумах) - неделя, две... ответов нету ![]() |
Автор: bems 21.3.2006, 16:06 | ||
эт смотря какой вопрос ![]() |
Автор: Alexeis 21.3.2006, 16:07 |
Hacker, я не понял, текст многострочный или просто одна длинная строка. Если многострочный, то может накапливать текст до символа конец строки, а затем добавлять эту строку memo1.add(s); |
Автор: Hacker 21.3.2006, 16:33 | ||||||
Текст ОЧЕНЬ_МНОГОстрочный.
Текст принимается из буфера порта таймером каждые 50 мс, следовательно он идёт пакетами по n байт (max-128), значит придётся каждые 50 мс "проезжать" по строке до ближайшего Enter'а(если он будет), а как быть с последней строкой, если после неё не будет #13, то она не добавится в memo, ведь прога не знает, когда считать чтение законченным - это определяет пользователь, а вообще этот способ я попробую. Вот код, которым у меня сейчас считываются данные:
Вместо BytesRead для проверки можно подставить например '1234567'; Щас буду пробовать. ![]() |
Автор: Romikgy 21.3.2006, 16:46 |
А если двойную буферизацию, и делать как раньше |
Автор: Hacker 21.3.2006, 17:16 | ||
Вроде решил. Подкорректируйте, если найдёте скрытые ошибки. Испытал-пока работает.
Всем спасибо за ответы! |
Автор: Poseidon 21.3.2006, 20:07 | ||||
![]()
|
Автор: Демо 21.3.2006, 20:12 | ||
Hacker, Простой пример:
|
Автор: Hacker 21.3.2006, 20:56 | ||||||
Метод Add добавляет СТРОКУ в конец и перекидывает каретку, а мне нужно, чтобы просто добавлялись символы. Вот например, есть у меня в memo текст:
если я напишу memo.lines.add(' rulit!!!') или memo.lines.append(' rulit!!!'), то у меня получится:
А мне нужно, чтобы получилось:
И чтоб ещё при этом курсор остался на месте и текст в мемке не мигал как ёлка новогодняя. ![]() Ещё пример: мы можем писАть в файл функцией WriteLn, тогда она к нашей строке прибавит '$A$D', а можем использовать просто Write, и тогда ничего не добавится. Так вот memo.lines.add() добавляет сзади к строке '$A$D', которые мне совсем не нужны. |
Автор: Демо 21.3.2006, 21:04 | ||||
Тогда так:
|
Автор: Hacker 21.3.2006, 21:54 | ||||
Демо. Работает, но с глюками. Иногда две строки подряд в одну запихивает. Если писать memo.text:=memo.text+s; тогда такого не бывает. Вот, что получается с твоим примером:
Как видишь, в первой строке запихана и вторая и появилась одна пустая строка. Такое возможно если в буфере окажется только $A или $A$D или $D Добавлено @ 22:02
Нет не правду сказал. Такое возможно если в конце буфера окажется $A или $A$D или $D |