![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Hacker |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 21.3.2006 Репутация: нет Всего: нет |
Помогите. Ситуация такая: прога читает данные с COM-порта и заносит их в memo по мере поступления.
Если применять метод memo.text:=memo.text+s; // то текст мемки будет весь копироваться. Во-первых это приведёт к миганию, а во вторых если наберётся МНОГО данных, прога не будет успевать копировать текст и принимать данные с порта. Вопрос: как можно добавлять текст в конец memo, НО чтобы он добавлялся НЕ как строка (memo.lines.append()), а просто дописывался без перерисовки всего компонента и без копирования всего содержимого мемки в неё же. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
Промежуточный вариант: memo.lines[memo.lines.count-1]:=memo.lines[memo.lines.count-1]+s
-------------------- Обижено школьников: 8 |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Hacker, с одной строкой будет тотже эффект
может имеет смысл накапливать текст скажем по 1024 байта, а потом добавлять к какому-нибудь буферу. Можно использвать TMemorystreem Если не нужно перерисовывать так зачем вообще его отображать прямо сразу ![]() Это сообщение отредактировал(а) alexeis1 - 21.3.2006, 15:28 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Hacker |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 21.3.2006 Репутация: нет Всего: нет |
2 alexeis1 Я имел ввиду, что не нужно перерисовывать весь текст, просто добавлять и всё (например пишешь в delphi прогу, она же не перерисовывает весь текст проги при вводе каждого символа).
2 bems Спасибо, как я сам не додумался. Может у кого есть ещё идеи, желательно чтобы курсор оставался на месте и не трогался программой (чтобы пользователь мог просматривать, прокручивать и даже редактировать текст во время приёма данных). P.S: Блин, даже не ожидал получить ответы так быстро, бывает задашь вопрос (на других форумах) - неделя, две... ответов нету ![]() |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
||||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
эт смотря какой вопрос ![]() -------------------- Обижено школьников: 8 |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Hacker, я не понял, текст многострочный или просто одна длинная строка.
Если многострочный, то может накапливать текст до символа конец строки, а затем добавлять эту строку memo1.add(s); -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Hacker |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 21.3.2006 Репутация: нет Всего: нет |
Текст ОЧЕНЬ_МНОГОстрочный.
Текст принимается из буфера порта таймером каждые 50 мс, следовательно он идёт пакетами по n байт (max-128), значит придётся каждые 50 мс "проезжать" по строке до ближайшего Enter'а(если он будет), а как быть с последней строкой, если после неё не будет #13, то она не добавится в memo, ведь прога не знает, когда считать чтение законченным - это определяет пользователь, а вообще этот способ я попробую. Вот код, которым у меня сейчас считываются данные:
Вместо BytesRead для проверки можно подставить например '1234567'; Щас буду пробовать. ![]() Это сообщение отредактировал(а) Hacker - 21.3.2006, 16:35 |
||||||
|
|||||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
А если двойную буферизацию, и делать как раньше
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
Hacker |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 21.3.2006 Репутация: нет Всего: нет |
Вроде решил. Подкорректируйте, если найдёте скрытые ошибки. Испытал-пока работает.
Всем спасибо за ответы! |
|||
|
||||
Poseidon |
|
||||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
![]()
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
||||
|
|||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Hacker,
Простой пример:
-------------------- |
|||
|
||||
Hacker |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 21.3.2006 Репутация: нет Всего: нет |
Метод Add добавляет СТРОКУ в конец и перекидывает каретку, а мне нужно, чтобы просто добавлялись символы. Вот например, есть у меня в memo текст:
если я напишу memo.lines.add(' rulit!!!') или memo.lines.append(' rulit!!!'), то у меня получится:
А мне нужно, чтобы получилось:
И чтоб ещё при этом курсор остался на месте и текст в мемке не мигал как ёлка новогодняя. ![]() Ещё пример: мы можем писАть в файл функцией WriteLn, тогда она к нашей строке прибавит '$A$D', а можем использовать просто Write, и тогда ничего не добавится. Так вот memo.lines.add() добавляет сзади к строке '$A$D', которые мне совсем не нужны. |
||||||
|
|||||||
Демо |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Тогда так:
Это сообщение отредактировал(а) Демо - 21.3.2006, 21:08 -------------------- |
||||
|
|||||
Hacker |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 21.3.2006 Репутация: нет Всего: нет |
Демо. Работает, но с глюками. Иногда две строки подряд в одну запихивает. Если писать memo.text:=memo.text+s; тогда такого не бывает.
Вот, что получается с твоим примером:
Как видишь, в первой строке запихана и вторая и появилась одна пустая строка. Такое возможно если в буфере окажется только $A или $A$D или $D Добавлено @ 22:02
Нет не правду сказал. Такое возможно если в конце буфера окажется $A или $A$D или $D |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |