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

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

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

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

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

ShIvADeSt



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

Цитата:
1) Несколько небольших вопросов по GetTextStart  
1.1) Как я понимаю это вместо GotoXY ?  
1.2) Наверное GetFocus лучше написать как Windows.GetFocus, что бы четко было видно чей он.  
1.3) Правильно ли я понимаю, что для того что бы GetCaretPos выдал правильные координаты для нашего memo он должен быть в этом момент в фокусе ?

да
да
да

Цитата:
2) Просто для информации: если данный код превратить в компонент и в WMPaint не поменять  
if StartCaretPos.cx = 0 then GetTextStart();  
на
if not (csDesigning in ComponentState) and (StartCaretPos.cx = 0) then GetTextStart();  
то Delphi при загрузке формы с таким memo валится в кору.

Мб, я же не компонент писал, там может быть такие тонкости надо учитывать.

Цитата:
3) Небольшая недоработка: Если в ColorMemo выделить текст, а потом табом или мышью перейти на другой компонент, то это выделение останется.  
В стандартном memo оно снимается.

В процедуре PaintText там где идет простановка аттрибутов выделения - сделай проверку на фокус. Мне наоборот нравится когда видно выделение.

Цитата:
4) ColorMemo при своей отрисовке не учитывает свойство Alignment.

Посмотрю на работе какое поведение у стандартного и попробую сделать.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:53 19-09-2009
ShIvADeSt



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

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 06:54 21-09-2009
StalkerSoftware



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

Цитата:
в общем тестируйте

Нашел одну ошибку связанную с горизонтальным скролингом:
WordWrap := False;
ScrollBars := sbBoth;
 
Делаем длинную строку (например 100 символов 'W').
Перемещаемся в начало строки и начинаем понемногу жать клавишу "Left".
Пока курсор не достиг границы memo и не начался горизонтальный скролинг, курсор идет четко между символами (как и должно), но сразу после начала скролинга, курсор начинает скакать посередине символа.

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 13:26 21-09-2009
ShIvADeSt



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

Цитата:
Делаем длинную строку (например 100 символов 'W').  
Перемещаемся в начало строки и начинаем понемногу жать клавишу "Left".  
Пока курсор не достиг границы memo и не начался горизонтальный скролинг, курсор идет четко между символами (как и должно), но сразу после начала скролинга, курсор начинает скакать посередине символа.

проверю.
 
Поправил баг, все таки необходимо при старте запоминать позицию самого первого символа в строке, а то при увеличении шрифта происходит увеличение отступа от края - в итоге криво рисуется.
Подробнее...
Сразу говорю - след поведение НЕ БАГ. Если выставить шрифт около 20 и больше и наклонный шрифт, то позиционирование курсора идет на 1 2 пикселя влево относительно правой верхней точки большой буквы W. Проверял поведение в АкельПаде - точно так же курсор движется не по правой крайней точке, а немного левее, то есть буква делиться пополам - большая часть левее, и примерно 2 пикселя правее. Повторяю - не баг.
Проверяйте остальное.
 
ЗЫ. По идее - после последних изменений подсветка должна работать и в режиме разработки. Кстати убрал баги при пустом Мемо

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 14:13 21-09-2009 | Исправлено: ShIvADeSt, 02:58 22-09-2009
StalkerSoftware



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
 
Нашел ошибку:
WordWrap := False;
ScrollBars := ssVertical или ssNone;
Жмем букву и не отпускаем ее несколько секунд, как только курсор достигает правого края memo, вместо буквы выводится пустое место.
 

Цитата:
По идее - после последних изменений подсветка должна работать и в режиме разработки.  

Ну "подсветка в режиме разработки" работала еще в первом варианте  твоего кода. Главное что бы хранилище ключевых слов с цветовыми настройками было доступно компоненту в Design-Time.
 
Небольшое замечание по коду GetTextStart:
У тебя в ней не определено значение TSize, если кол-во строку равно нулю.
Я немного переделал там код:
 Result.cx := 0;
 Result.cy := 0;
 if Self.Lines.Count <= 0 then Exit;
Так и начальное значение есть и вложеностей условий немного меньше
 

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 12:17 22-09-2009
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StalkerSoftware
ShIvADeSt
мне скора лицензия выпадет, на принтер и увеличение семейного контента.
 
Добавлено:
бага - это из-за едита. будем вместе пользовать контрол F

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 19:46 22-09-2009
ShIvADeSt



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

Цитата:
Нашел ошибку:
WordWrap := False;
ScrollBars := ssVertical или ssNone;
Жмем букву и не отпускаем ее несколько секунд, как только курсор достигает правого края memo, вместо буквы выводится пустое место.  

Угу, я просто такое извращение даже представить не мог - длинные строки без горизонтальной прокрутки, поэтому даже не тестировал В общем вот код в котором это работает. Единственное на больших буквах если курсор заходит за пределы правого края он позиционируется на 1 пиксель левее чем должен. Практически не заметно, почему - непонятно. Разбираться не буду, так как итак уже извращаюсь с нахождением позиции курсора по самое не хочу
Подробнее...
В общем проверяйте.
 
Добавлено:
delover
Ты как всегда жжешь, я ни фига не понял, что ты хотел сказать и к чему это было

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

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



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

Цитата:
Единственное на больших буквах если курсор заходит за пределы правого края он позиционируется на 1 пиксель левее чем должен.
Да есть такое. Но это похоже происходит только для случая  WordWrap = False и ScrollBars = ssVertical или ssNone. В остальных случаях все нормально.
 

Цитата:
ак как итак уже извращаюсь с нахождением позиции курсора по самое не хочу
Зато теперь ты (а благодаря тебе и остальные) лучше освоил методики позиционирования курсора в многострочных контролах.
 
2 All
 
Это компонент TColorMemo (новая версия 1.4) сделанный на базе последнего варианта кода от  
ShIvADeSt .
 
Я в него добавил :  
 - свойство Separators для задания разделителей;
 - возможность подчеркивать волнистой линией слова;
 - событие OnCheckWord для задания цвета букв, фона и подчеркивания для  
   слов;
 - свойство KeepSelOnLostFocus для задания режима снимать или нет  
   выделение с ColorMemo при потере фокуса.
 
Код работает в D7-D2010.
 
Вроде бы все работает нормально, но было бы неплохо что бы All, его еще  
немного погонял на ошибки, особенно на висте и Windows7.
 
Скачать TColorMemo можно здесь (10 кб).
 
Отзывы и сообщения об ошибках оставляем в этой теме.
 

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 18:49 23-09-2009 | Исправлено: StalkerSoftware, 18:50 23-09-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StalkerSoftware
Финальная версия кода, теперь список слов для подсветки задается в переменной HighlightWords, для массового добавления слов служит процедура
procedure AddHighlightWords(Words:string;Separator:char);
Так же снимание выделения при потере фокуса теперь зависит от встроенного свойства Мемо - HideSelection (я про него забыл ). То есть выставляете в True и при потере фокуса происходит снятие выделения. Так что  

Цитата:
свойство KeepSelOnLostFocus для задания режима снимать или нет  

можно убрать спокойно.
Подробнее...

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:20 24-09-2009 | Исправлено: ShIvADeSt, 05:38 24-09-2009
ShIvADeSt



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

Цитата:
Скачать TColorMemo можно здесь (10 кб).  

Не могу скачать - сервер не отвечает.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:40 24-09-2009
StalkerSoftware



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

Цитата:
Не могу скачать - сервер не отвечает
Да, сервер похоже умер. Буду его подымать.
 

Цитата:
Так же снимание выделения при потере фокуса теперь зависит от встроенного свойства Мемо - HideSelection

Согласен, действительно есть такое родное свойство и другое тут не нужно.
 

Цитата:
теперь список слов для подсветки задается в переменной HighlightWords, для массового добавления слов служит процедура
procedure AddHighlightWords(Words:string;Separator:char);  
Тоже вариант, хотя ИМНО обработчик событий в данном случае более универсальный вариант.
 
Я смотрю, ты помимо озвученных тобой изменений в очередной раз поменял внутренности обработчиков WMKillFocus и WMSetFocus, с чем это связанно ?
 
Добавлено:
ShIvADeSt

Цитата:
Не могу скачать - сервер не отвечает.

Уже работает.
 
Добавлено:
2 All
 
Немного обновил код TColorMemo. Убрал свойство KeepSelOnLostFocus.
Вместо него теперь как и должно быть работает стандартное свойство HideSelection.
 
Скачать TColorMemo можно здесь (10 кб).
 
Отзывы и сообщения об ошибках оставляем в этой теме.

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 15:01 24-09-2009 | Исправлено: StalkerSoftware, 15:32 24-09-2009
delover

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

Цитата:
Ты как всегда жжешь, я ни фига не понял, что ты хотел сказать и к чему это было

Надеюсь, я пропустил из виду появление очень интересных свойств редакторов. В смысле подключаться буду с последним апдейтом.  
 
Кстати на счёт цветного мемо. Ребят, Вы не видели случайно легальные коды RGB, для цвета clWebLightSaphire? Пока что я "притормозил" разработки именно из-за этого. Пока, что плексиглаз набор мне кажется слишком маленьким. Да и в фаст-репорт добавлять пока нечего. (ИМХО). Там надо "ColorOptions" взаимосвязанный с галками экономии тонера на принт. Ну правда, очень сложно мне смотреть идентификатор "string" не жирным шрифтом. По дефолту от TVision этот идент должен быть болд. А приписывать эту особенность редактора в релизе (fr) к "экономии" тонера - беспочвенно. Математика строк в fr особенная, она своя, и содержит свою нагрузку на термин. Это ясно, а вот хеширование отстаёт. Лицензия на fr у меня недействительна, иногда обыдно. Пекатить это легко в ран-тайме (Имхо), но вот наблюдать разницу fr с Turbo Pascal 6.5 (ибн ~pure pascal) не так то это просто. Я бы лучше в memo углубился. Что-то произошло с буфером обмена.
 
#

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 21:55 24-09-2009 | Исправлено: delover, 04:23 25-09-2009
ShIvADeSt



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

Цитата:
Я смотрю, ты помимо озвученных тобой изменений в очередной раз поменял внутренности обработчиков WMKillFocus и WMSetFocus, с чем это связанно ?

При смене фокуса и возврате обратно было видно мерцание выделенных строк. Когда строк выделено более 1 мерцание вообще мерзкое. Пришлось разбираться.

Цитата:
Тоже вариант, хотя ИМНО обработчик событий в данном случае более универсальный вариант.

Ээээ а для чего тут обработчик событий? Здесь же никаких событий не происходит - просто когда надо (в любой момент) добавляем слова процедурой или просто
HighlightWords.Add() // это если по одному слову.
 


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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 23:51 24-09-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StalkerSoftware
Посмотрел код компонента, насчет волнистой ты обманул Скорее зигзаг получается (так как идет +-1 относительно У. Я думал, там синусоида рисуется, хотя на таких мелких скачках (+- 1) пофигу что рисовать.
 
ЗЫ. Добавь в код мои обновления для WMSetFocus и WMKillFocus - с ними ИМХО поведение идеальное.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:19 25-09-2009 | Исправлено: ShIvADeSt, 03:20 25-09-2009
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
У Вас в программе видел приблизительно такой код (строка 310):
"example"
А не проще ли использовать компоненты nnStorage? Правда вполне возможно, что тут у Вас получается другая очередь событий (_win_msg)... Но я понимаю, что Вам неверное даже и не интересно думать о спай логах не сейчас и не в будущем. Зигзаг а надо блакнот ++.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 11:54 25-09-2009
ShIvADeSt



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

Цитата:
У Вас в программе видел приблизительно такой код (строка 310):

Хз я ЭТОТ код не писал. Я писал код только по Мемо. Остальное даже не смотрел

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

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



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

Цитата:
насчет волнистой ты обманул Скорее зигзаг получается  

Ну что получилось, то получилось. А так как амплитуда там маленькая, то выглядит вполне себе волнисто.
Если хочешь, можешь сделать ее более волнистой и я включу этот код в компонент.
 

Цитата:
Добавь в код мои обновления для WMSetFocus и WMKillFocus - с ними ИМХО поведение идеальное.

Сделал.
Вот немного подправленный TColorMemo, версию ему я не менял.
Скачать TColorMemo можно здесь (10 кб).
 
 
Добавлено:
2 ShIvADeSt
 
В соответствии с первоначальными задумками и данной темой
я стал на базе TColorMemo сделать TColorEdit, но что оно не очень оно у меня молучается.
Отрисовка идет не правильная.
 
К TEdit я добавил три свойства WordWrap, WantReturns, Alignment, что бы  
можно было в Edit визуально вводить текст в виде виде нескольких строк  
(хотя конечно реально там одна строка). Все эти свойства работают и  
отрисовывают текст для стандартного TEdit нормально.
В ряде случаев такой псевдо многострочный Edit удобнее чем Memo.
 
А потом я добавил в него функциональность ColorMemo.
Само цветовое выделение текста работает вроде бы нормально, но вот отрисовка всего этого глючит.
Вот ссылка на код ColorEdit и небольшую демку к нему.
 
Как я понимаю, основная проблема тут зарыта в обработчиках WMPaint,
WMPrintClient и в PaintLine, так где идет расчет координат и непосредственная
отрисовка текста. Пробовал их менять, но честно говоря получилось весьма не  
очень. Все же получившийся ColorMemo оказалось перенести на Edit гораздо  
сложнее, чем я первоначально думал.
 

Всего записей: 682 | Зарегистр. 23-06-2008 | Отправлено: 14:17 25-09-2009
delover

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

Цитата:
я ЭТОТ код не писал. Я писал код только по Мемо.

Ну тогда простите, писали писали, не отнекивайтесь.
 
Добавлено:
Добавлено:
Нашёл как это делается. Бу завтра. Надеюсь то, что высмотрю можно будет использовать и мне.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 19:28 25-09-2009 | Исправлено: delover, 20:27 26-09-2009
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
http_//cc.codegear.com/Item/24263
ntfszip.dpr
строка 71
// ru-board src

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 23:07 26-09-2009
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
(unit1) Если я правильно понял - бэгграунд в мемках = clBlack?

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 16:47 28-09-2009 | Исправлено: ShIvADeSt, 02:26 29-09-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