Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Delphi: Создание простого цветного TMemo или TEdit

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9

Открыть новую тему     Написать ответ в эту тему

StalkerSoftware



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Hi всезнающий All,  
 
Предыстория вопроса:
  У меня есть своя библиотека. В ней есть контролы порожденные от TEdit и TMemo в которые я добавил некоторую свою функциональность.
Сейчас мне понадобилось добавить в программу проверку орфографии. Сама проверку у меня уже сделана.  
 
Основная задача:
  Для того, что бы можно было выделять слова с орфографическими ошибками, нужно непосредственно в наследников TMemo и TEdit добавить возможность выделять цветом или просто подчеркивать эти слова.  
 
  Я соотв6тственно стал изучать этот вопрос. Большинство компонент которые это реализуют (например RichView, SynEdit, SyntaxMemo от TMS или FastReport и т.д.) являются наследниками TCustomControl и в следствии этого фактически дублируют тот функционал который уже есть в TMemo. Кроме того в них куча другого функционала, который абсолютно не нужен для выполнения основной задачи.  
И как результат, из за всего этого, интеграция их возможностей по выделению слов в своих наследников TEdit и TMemo представляется весьма сложной.
RichEdit тоже не подходит, так как в нем так же много лишнего да и не хочется из за простого выделения слов тащит себе в программу весь его код.
 
  В результате поисков я нашел компонент (Highlight within TMemo), который умеет раскрашивать слова и порожден от TMemo. Так же есть его почти точная копия (Live spelling memo editor) которая не раскрашивает, а подчеркивает слова.
 
  Но у этих компонент есть одна, довольно серьезная проблема: При скролинге или при наборе текста в них видно мерцание текста из за их полной перерисовки.
 
  Соответственно я бы хотел попросить уважаемых посетителей данного форума помочь мне с этим вопросом, т.е. избавиться от этого мерцания.
 
P.S. Думаю подобный простой, основанный на TMemo компонент для выделения или подчеркивания слов может понадобиться не только мне.

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 18:25 06-08-2009
urmigar



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StalkerSoftware
 
Вот можно пример посмотреть
 
P.S. Хм... Вроде это тот компонент, что тебе не понравился? Тогда так. Сделай всё как там есть, т.е. перехватывай WMPaint сообщение, но не нужно много рисовать, попробуй оставить только код, который подчёркивает. Моргать должно меньше.

Всего записей: 437 | Зарегистр. 18-01-2008 | Отправлено: 21:57 06-08-2009 | Исправлено: urmigar, 22:08 06-08-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В общем представляю на суд публики Мемо с подавленным мерцанием (полдня копал, чтобы убить мерцание при разных событиях). Код  рабочий (по крайней мере на моей машине), багов не нашел (надеюсь ).
Подробнее...
 
достаточно интересно было избавляться от различных артефактов, кое какие функции не работали как мне надо было. В общем тестируйте.  
ЗЫ. Найден косяк с выделением, как победить на данный момент ХЗ.


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 06:41 07-08-2009 | Исправлено: ShIvADeSt, 07:59 07-08-2009
StalkerSoftware



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urmigar
 
Тот код что ты привел, этот тот же компонент на который я дал ссылку.
Если только подчеркивание (см. мой второй компонент), то мерцание конечно меньше, но все равно оно заметно.
 
ShIvADeSt
Скачал, собрал (т.е. взял модуля от Highlight within TMemo плюс твой модуль в качестве Unit1.pas), посмотрел.
Сначала я в него внес только одно изменение: В обработчик MouseUp в самое его начала я добавил строку
Код:
if SelLength = 0 then invalidate;
как советовал data man, что бы после выделения восстанавливалась раскраска.
И в самом Memo я сменил шрифт с курьера на Arial 9.
 
Есть несколько проблем:
 
1) Не работает выделение с помощью клавишь. Хотя с помощью мыши и контекстного меню выделение текста происходит, но если в этот момент нажать в Memo клавишу, то выделение текста пропадает.
 
2) Когда выделяешь текст, а потом выделение убираешь, то видно что текст во время этих операций немного смещается влево и вверх. Как я понимаю это происходит из за того, что при выделение текста работают не твои обработчики Paint, а какой то другой. Может есть какое то событие Paint, которое срабатывает именно во время операции по выделению текста ?
Для того, что бы этого смещения не было, надо в обработчики WMPrint и WMPrintClient внести небольшие изменения:
Заметить строку
Код:
x:=psRect.Left
на
Код:
x:=psRect.Left+4

и заменить строку
Код:
Y:=0;
на
Код:
Y:=1;

Но я сильно подозреваю, что эти числа 4 и 1 сильно зависят от фонта, его размера и возможно коэффициента размера (который ставиться в свойствах дисплея). То есть эти числа надо вычислять, только как я не знаю.
 
3) Если находясь в самом начале Memo, нажать Ctrl+End (т.е. переместиться в самый конец текста), то в самом низу Memo виден артефакт в виде куска строки, который исчезает после нажатия любой клавиши.
 
4) Находимся в самом низу текста в самом низу memo. Жму Ctrl+Home и перемещаюсь в самое начало текста и в самое начало memo. После этого я жму любую клавишу и в нижней части memo появляется еще одна строка.
 
5) При скролинге Memo с помощью клавиши Down (особенно если он длительный и непрерывный), видно что в самой нижней части memo дублируются строки.
 
Небольшой вопрос: Я правильно понимаю, что обработчик WMPrintClient нужен для того, что бы происходила перерисовка не всего Memo, а только его изменившихся частей ?

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 15:16 07-08-2009 | Исправлено: StalkerSoftware, 16:07 07-08-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Все эти глюки происходят потому что помимо нашей собственной отрисовки действует еще врожденное в мемо поведение (в частности глюки при выделении и снятии его). Чтобы подавить все эти глюки надо перехватывать ВСЕ события от мыши и клавиатуры и самому отрисоывать поведение Мемо. Как только придумаю (не раньше чем через 2 недели, ибо отпуск) как отрисовать правильно выделение мышью и клавиатурой часть глюков будет убито.

Цитата:
Но я сильно подозреваю, что эти числа 4 и 1 сильно зависят от фонта, его размера и возможно коэффициента размера (который ставиться в свойствах дисплея). То есть эти числа надо вычислять, только как я не знаю.

Именно так и есть. У меня эти цифры были 1 и 1. Вобщем это смещение относительно нашей отрисовки и отрисовки виндой (если внимательно вглядеться то видно, что при выделении кое что сбрасывается - то есть работает не наша отрисовка, а встроенная).  
Вообще по хорошему надо не так делать этот контрол, а создавать класс причем не от Мемо, а от TObject. В нем перехватывать оконные функции главного окна, потом уже порождать класс Мемо и в нем уже перехватывать все что относится к нему. Чтобы точно убедиться в отсутвии влияния оконных обработчиков.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:34 08-08-2009
StalkerSoftware



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
 Именно так и есть. У меня эти цифры были 1 и 1. Вобщем это смещение относительно нашей отрисовки и отрисовки виндой (если внимательно вглядеться то видно, что при выделении кое что сбрасывается - то есть работает не наша отрисовка, а встроенная).  

А какая же там должна быть формула, что бы можно было высчитать эти отступы ?
Или при перехвате события отрисовки выделения, это будет уже не актуально ?
 

Цитата:
Вообще по хорошему надо не так делать этот контрол, а создавать класс причем не от Мемо, а от TObject. В нем перехватывать оконные функции главного окна, потом уже порождать класс Мемо и в нем уже перехватывать все что относится к нему.

В принципе я с этим согласен (по поводу порождения цветного memo от TObject или TCustomControl), но это было бы хорошо и правильно, если бы мне просто был нужен новый компонент для выделение или подчеркивания текста, тем более, что таких компонентов весьма много.  
Но у меня ситуация несколько другая: Мне надо именно в своих наследников TMemo и TEdit добавить функциональность выделения или подчеркивания слов. Поэтому то и стоит задача, сделать это в стандартом TMemo (в TEdit я думаю смогу это сделать сам по примеру TMemo), что бы доработки были минимальными, что облегчит внедрения этого кода в свои компоненты.
 

Цитата:
Все эти глюки происходят потому что помимо нашей собственной отрисовки действует еще врожденное в мемо поведение (в частности глюки при выделении и снятии его)

Стандартную отрисовку memo я заметил, особенно она видна во время выделения текста.
 

Цитата:
Как только придумаю (не раньше чем через 2 недели, ибо отпуск) как отрисовать правильно выделение мышью и клавиатурой часть глюков будет убито.  

Хорошо, тогда через 2 недели, отпуск это святое

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 17:53 08-08-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StalkerSoftware
Итак вот модуль с выделением мышью и клавиатурой. Возможны баги особенно с удалением выделенного текста.
Подробнее...
Подавил почти все родные события и сам их переписал. Глюки которые ты описал я в этой версии не заметил (раньше может быть были, но раньше сам код глючный был). В общем смотри - если пойдет, то дальше править не буду - ибо не хочется все остальное переделывать (удаление, откат и прочее - потому что нудно и муторно).

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 12:37 31-08-2009
data man



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Работает классно ! Думаю многим пригодится.
 
Ложечка багов (только у меня или нет ?) - если нажать среднюю кнопку и поскролить, появляются "артефакты".

Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 14:43 31-08-2009
volser

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Не работает выделение текста в мемо.

Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 15:51 31-08-2009
data man



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
volser
Все прекрасно выделяется - надо брать из последнего поста ShIvADeSt

Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 16:13 31-08-2009
StalkerSoftware



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
 
Скачал, собрал (D7.1), посмотрел.
Вот результат:
 
1) Очень слабая скорость работы, при длительном нажатии курсорных клавиш и как следствие их очень большая инерционность.  
Запускаем демку, жму клавишу Down и удерживаю ее несколько секунд, потом отпускаю ее и курсор еще время бежит вниз.
1.1) Если после этого побегать курсором в Memo, и опять нажать клавишу Down и удерживать ее несколько секунд, то текст сколируется рывками, причем периодически при этом происходит остановка скролинга, хотя вертикальный ползунок продолжает двигаться.
В предыдущем варианте проблем 1 и 1.1 не наблюдалось.
 
2) Первоначально курсор позиционируется на половине буквы, и при дальнейшем горизонтальном продвижении курсора видно, что он движется по середине букв.
 
3) Проблемы с выделением текста как клавиатурой, так и мышью.
Становлюсь курсором в самое начало строки. жму Shift+End, в результате выделяется часть строки (примерно три четверти), хотя сам курсор стоит в конце строки.
При посимвольном выделении текста мышью или клавиатурой ситуация аналогичная.
 

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 16:55 31-08-2009 | Исправлено: StalkerSoftware, 17:01 31-08-2009
volser

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
data man
 
Я собирал с последнего поста. StalkerSoftware описал аналогичную проблему пункт 3.

Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 17:32 31-08-2009
data man



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
volser
Так "заказчик" и описал проблему точнее, а не в "общем".
Черт его знает, у меня почему-то такого не наблюдается.
Может и от компа зависит (у меня не очень быстрый) - я пункт 1 на это и списывал.
А вот пункт 2 - это да, есть такое.

Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 17:44 31-08-2009 | Исправлено: data man, 17:46 31-08-2009
StalkerSoftware



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
data man

Цитата:
Черт его знает, у меня почему-то такого не наблюдается.

 
Какой из указанных в моей последнем посте пунктов, у тебя не наблюдается ?

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 18:32 31-08-2009
data man



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StalkerSoftware
3.
Но зато выявился такой - нажимаю Shift-End, выделяю, отпускаю,  нажимаю стрелки, потом просто Shift и снова выделяется. Возникает не всегда.
А вообще ShIvADeSt же написал
Цитата:
Возможны баги
так что...
 
 

Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 18:46 31-08-2009 | Исправлено: data man, 18:47 31-08-2009
StalkerSoftware



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
data man

Цитата:
нажимаю Shift-End, выделяю, отпускаю,  нажимаю стрелки, потом просто Shift и снова выделяется

Я у себя тоже такое один раз наблюдал, но подумал, может у меня клавиша какая запала ...
 
Выходит это еще один глюк.
 
А ошибки 1 и 1.1 у тебя наблюдаются ?

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 19:12 31-08-2009
data man



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StalkerSoftware
Да, я списывал на скорость компа.
 

Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 19:25 31-08-2009
StalkerSoftware



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
data man

Цитата:
Ложечка багов (только у меня или нет ?) - если нажать среднюю кнопку и поскролить, появляются "артефакты".

 
У меня это тоже есть, только что заметил.

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 20:13 31-08-2009
data man



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StalkerSoftware
Давно хотел спросить - а что так принципиально использовать именно TMemo ?

Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 20:20 31-08-2009
StalkerSoftware



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
data man

Цитата:
Давно хотел спросить - а что так принципиально использовать именно TMemo ?

Посмотри первое и шестое сообщение этого топика. Там я вроде бы достаточно подробно написал, почему это принципиально важно.

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 20:39 31-08-2009
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Delphi: Создание простого цветного TMemo или TEdit


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru