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

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

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

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

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

ShIvADeSt



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

Цитата:
А потом я добавил в него функциональность ColorMemo.
Само цветовое выделение текста работает вроде бы нормально, но вот отрисовка всего этого глючит.
Вот ссылка на код ColorEdit и небольшую демку к нему.  

Вот доработанный код для ColorEdit
Подробнее...
Тестируйте, заменил код в WM_KILLFOCUS иначе у меня почему то для однострочного едита он не отрабатывал.
Переделал процедуру DrawLine - теперь более на волну похоже ИМХО.
 
В общем тестируйте, все баги - в тему пуляйте.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 04:12 29-09-2009
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
У меня под d2006 выявилась можно сказать бага. После запуска проги встроенные в дельфу мемки на редакторе инспектора стринглиста стали копировать текст вместе со стилем из микрософт ворда или оутлука. ))) Кстати очень забавно, возможно ричь плаинт не вырубился.

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



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

Цитата:
Вот доработанный код для ColorEdit  

 
1) Если WordWrap = False, то при выделении текста, получается черные буквы на темно-синем фоне (в общем ничего не видно).
 
2) У меня такое впечатление, что обработчик WMPrintClient вообще не вызывается для ColorEdit (ставил в его начало Break Point). Все время идет вызов WMPrint.
 
3) Как то немного странно отрабатывает WMPaint. Включил WordWrap и WantReturns, набираю длинный текст, пробовал и автоперенос и ручной перенос (жал Enter), выделял текст как на одной строке так и на двух. Внешне все работает нормально, но под отладчиком у меня все время nMax равен 0, а nLineFirst все время равен nLineLast.
 
4) Если не трудно, то разъясни смысл функции TextFromLine.  
Особенно меня там смущает массив с именем Text размером 4 кб, а ведь Edit у Edit и так есть свойство Text.
 

Цитата:
Переделал процедуру DrawLine - теперь более на волну похоже.

Да, волна стала более плавная, но ее амплитуда несколько большая, если бы ее немного уменьшить, то было бы в самый раз.
 
 
 

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



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

Цитата:
1) Если WordWrap = False, то при выделении текста, получается черные буквы на темно-синем фоне (в общем ничего не видно).
 
2) У меня такое впечатление, что обработчик WMPrintClient вообще не вызывается для ColorEdit (ставил в его начало Break Point). Все время идет вызов WMPrint.
 
3) Как то немного странно отрабатывает WMPaint. Включил WordWrap и WantReturns, набираю длинный текст, пробовал и автоперенос и ручной перенос (жал Enter), выделял текст как на одной строке так и на двух. Внешне все работает нормально, но под отладчиком у меня все время nMax равен 0, а nLineFirst все время равен nLineLast.
 
4) Если не трудно, то разъясни смысл функции TextFromLine.  
Особенно меня там смущает массив с именем Text размером 4 кб, а ведь Edit у Edit и так есть свойство Text.  

 
по 1 вопросу - для сингллайн Едита срабатывает видимо внутренняя отрисовка, ее вообще не знаю как подавить. То есть она срабатывает уже после события отрисовки. При этом цвет берет по странному критерию. В общем не буду разбираться.
2. Может и не вызывается - если мешает удали.
3. Хз у меня вроде все нормально было, да и работает
4. Смысл следует из самого названия Для конкретной строки (надо было вместо Line написать Row) получает текст. Так как в отличие от TMemo у едита нет свойства Strings то мне надо как то определять какой текст для данной строки рисовать. Пришлось добавлять еще один способ.
 
Добавил в отрисовку след код

Код:
 
   SendMessage(Self.Handle,EM_GETRECT,0,LPARAM(@TxtOffset));
   Brush.Color := Self.Color;
   FillRect(Rect(0, rTxtRect.Top, TxtOffset.Left, rTxtRect.Top+rSize.cy))
 
   end; { with }
 
 
 finally
   SetLength(aCharsColor, 0);
 end; { try }
 
end; { PaintLine }
 

теперь выделение рисуется не самой границы контрола, а с небольшим отступом (как и должно быть) TxtOffset :TRect
 


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

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



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

Цитата:
по 1 вопросу - для сингллайн Едита срабатывает видимо внутренняя отрисовка, ее вообще не знаю как подавить. То есть она срабатывает уже после события отрисовки. При этом цвет берет по странному критерию. В общем не буду разбираться.  
Жаль, без исправления этой ошибки, ColorEdit'ом врядли можно будет пользоваться
 

Цитата:
2. Может и не вызывается - если мешает удали.  
Не то что бы мешает, но если WMPrintClient почему то все равно не вызывается, то зачем держать лишний код ...
Или у тебя он вызывается ?
 

Цитата:
4. Смысл следует из самого названия  
Нет, общий ее смысл я то понял. Просто меня смутила переменная Text, полностью созвучная со свойством Text этого компонента. Ну и не совсем понятно, почему буфер взят равным именно 4 кб ?
 
Нашел еще одну ошибку в ColorEdit:
Если в него ввести несколько строк текста, а потом вызвать например TM (т.е. что бы демка с ColorEdit потеряла фокус), то в ColorEdit остается видна только первая строка, когда фокус возвращается, то становятся видны все строки.

Всего записей: 683 | Зарегистр. 23-06-2008 | Отправлено: 16:20 30-09-2009
ShIvADeSt



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

Цитата:
Нет, общий ее смысл я то понял. Просто меня смутила переменная Text, полностью созвучная со свойством Text этого компонента. Ну и не совсем понятно, почему буфер взят равным именно 4 кб ?
 

вот переделанный код (заодно пофиксил баг с исчезновением нижних строк - там Handle видимо прыгал от окна родителя к окну контрола). Вроде бы пофиксил выделение в сингллайн едите, работает кривовато - потом может что придумаю.
Подробнее...
 
Посмотрел как в Мелкософт офисе сделано подчеркивание - сделал здесь так же (волнистая черта не айс). Зато зубчики теперь всегда начинаются сверху (у тебя было от центра).

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:12 01-10-2009 | Исправлено: ShIvADeSt, 06:40 01-10-2009
StalkerSoftware



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

Цитата:
Посмотрел как в Мелкософт офисе сделано подчеркивание - сделал здесь так же (волнистая черта не айс). Зато зубчики теперь всегда начинаются сверху (у тебя было от центра).
Теперь линия весьма красивая.
 

Цитата:
вот переделанный код (заодно пофиксил баг с исчезновением нижних строк - там Handle видимо прыгал от окна родителя к окну контрола).
Да, теперь при потере фокуса текст не пропадает.
 

Цитата:
Вроде бы пофиксил выделение в сингллайн едите, работает кривовато - потом может что придумаю.  
При выделении мышкой или просто тыканье мышкой в сингллайн едите очень заметно мерцание текста в едите. А при наборе текста видно некоторое замедление отображения курсора текста. Хотя само выделение теперь стало правильным.
 
 
 

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



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

Цитата:
При выделении мышкой или просто тыканье мышкой в сингллайн едите очень заметно мерцание текста в едите. А при наборе текста видно некоторое замедление отображения курсора текста. Хотя само выделение теперь стало правильным.  

Мерцание происходит потому что пришлось для сингллайна отказаться от двойной буферизации (в родном едите тоже мерцает, можешь проверить). Замедление отображения - попробую побороть, просто знаю почему это происходит, а вот как это исправить пока нет. Если не удастся - то это окончательный вариант, просто сингллайн едит очень странный контрол, он упорно пытается отрисовать себя сам, даже когда это не надо (если ты заметил, то для подавления самостоятельной отрисовки пришлось принудительно выходить из обработчика WM_PAINT, что можно (видел случаи), но не красиво).
 
Добавлено
 
Забейте на написаное выше, вроде бы (в очередной раз БЫ) победил глюки для single-line edit
Подробнее...
Метод называется анально-извращенный, но работает Мерцания не вижу, каретка движется правильно - вроде все в шоколаде.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:54 02-10-2009 | Исправлено: ShIvADeSt, 05:58 02-10-2009
StalkerSoftware



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

Цитата:
Метод называется анально-извращенный, но работает Мерцания не вижу, каретка движется правильно - вроде все в шоколаде.

Мерцания и пропадания каретки больше нет.
 
Я смотрю, что для победы над single-line edit ты фактически внутри WMPaint сделал еще один WMPaint по свойству WordWrap ...
А WMPrintClient так и не вызывается, думаю его можно вообще убрать.
 
1) В режиме (Alignment <> taLeftJustify) and (not WordWrap) при наборе текста, когда текст заполняет весь контрол, то текст исчезает (точнее говоря он весь уходит за левую границу контрола)
 
2) Общая ошибка для ColorEdit и ColorMemo. Копируем в буфер любой кусок текста. И вставляем его в ColorEdit или ColorMemo через стандартное контекстное меню контролов - все выделения пропадают. Но стоит нажать мышку или любую клавишу и все цветовое выделение восстанавливается назад. При вставке текста горячими клавишами такой ошибки не происходит.

Всего записей: 683 | Зарегистр. 23-06-2008 | Отправлено: 13:57 02-10-2009
ShIvADeSt



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

Цитата:
Я смотрю, что для победы над single-line edit ты фактически внутри WMPaint сделал еще один WMPaint по свойству WordWrap ...  
А WMPrintClient так и не вызывается, думаю его можно вообще убрать.

Убирай, просто при разработке какого контрола задействовали данное сообщение, не помню зачем - оставил тут тоже. Но у меня тоже ни разу на нем брейк не сработал, поэтому убирай. Я сделал не то что еще один WMPAINT - я просто через одно место реализовал отрисовку (вопреки MSDN), так как сам мелкософт поведение контрола реализовал через одно место.

Цитата:
1) В режиме (Alignment <> taLeftJustify) and (not WordWrap) при наборе текста, когда текст заполняет весь контрол, то текст исчезает (точнее говоря он весь уходит за левую границу контрола)

Судя повсему корни плывут из GetCaretPos (или как там оно называется, просто пишу из дома - проекта под рукой нет), там в коде для Мемо у меня было различные способы в зависимости от скролбаров - тут надо аналогично сделать, только в зависимости от вордврапа.

Цитата:
Копируем в буфер любой кусок текста. И вставляем его в ColorEdit или ColorMemo через стандартное контекстное меню контролов - все выделения пропадают.

Надо сделать обработчик WM_PASTE и перерисовку при нем. На работе буду - доделаю, приведу общий кусок. Потом там и там вставишь.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 16:07 02-10-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StalkerSoftware
В общем посмотрел то что ты написал. Насчет выравнивания - мне интересно, какое должно быть поведение при выравнивании центр? У едита такого свойства нет, у Мемо в этом случае происходит перенос на новую строку. Так что это не баг - это неправильно выставленные свойства.

Цитата:
Общая ошибка для ColorEdit и ColorMemo. Копируем в буфер любой кусок текста. И вставляем его в ColorEdit или ColorMemo через стандартное контекстное меню контролов - все выделения пропадают. Но стоит нажать мышку или любую клавишу и все цветовое выделение восстанавливается назад. При вставке текста горячими клавишами такой ошибки не происходит.

Вообще не смог повторить. Выделяю текст, нажимаю ПКМ,  делаю вставить - выделенный текст исчезает, выделений нет вообще. Проверил - в стандартном Едите поведение такое же.
 
Проверь как работает в стандартном контроле и сравни с переделанными.

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

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



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

Цитата:
Насчет выравнивания - мне интересно, какое должно быть поведение при выравнивании центр?
Это ты очень легко можешь увидеть и сам. Возьми ColorEdit, удали из него все, что относиться к функционалу Color, оставь только свойства WordWrap, WantReturns, Alignment и необходимы им обработчики (если хочешь я сам могу такое сделать и выложить этот Edit на своем сайте).
И ты увидишь, что текст вполне себе нормально скролируется и никуда не пропадает.
 

Цитата:
Вообще не смог повторить. Выделяю текст, нажимаю ПКМ,  делаю вставить - выделенный текст исчезает, выделений нет вообще. Проверил - в стандартном Едите поведение такое же.  
Эээ, ты меня видимо не так понял.
Копируешь любой текст в буфер обмена.
Запускаешь демку с ColorMemo. Тыкаешь мышкой в ColorMemo. Жмешь ПКМ, выбираешь в появившемся контекстном меню пункт "Вставить". Текст иp буфера вставляется в ColorMemo, но вся цветовая расцветка в нем пропадает.Если после этого в ColorMemo нажать любую клавишу или кнопку мыши, то цветовая расцветка опять появляется.

Всего записей: 683 | Зарегистр. 23-06-2008 | Отправлено: 19:44 06-10-2009
ShIvADeSt



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

Цитата:
Текст иp буфера вставляется в ColorMemo, но вся цветовая расцветка в нем пропадает.

Не цветовое выделение, а синтаксическая подсветка У меня выделение четко ассоциируется с выделением мышью (курсором).

Цитата:
Это ты очень легко можешь увидеть и сам. Возьми ColorEdit, удали из него все, что относиться к функционалу Color, оставь только свойства WordWrap, WantReturns, Alignment и необходимы им обработчики (если хочешь я сам могу такое сделать и выложить этот Edit на своем сайте).
И ты увидишь, что текст вполне себе нормально скролируется и никуда не пропадает.  

Сделай - я просто ставлю нормальный Едит и измененный. Выставляю одинаковые свойства и сравниваю поведение. Поэтому сделай сам как тебе надо, а я потом буду доделывать под нужное поведение. В общем как все сделаешь - так буду сразу все делать.

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

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



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

Цитата:
Не цветовое выделение, а синтаксическая подсветка У меня выделение четко ассоциируется с выделением мышью (курсором).  
Согласен. Но главное, что ты эту ошибку увидел.
 

Цитата:
Сделай
Сделал, качай TAdvEdit. Это тот же ColorEdit, только без Color-функционала. Можешь в нем менять свойства Alignment и WordWrap и увидишь что он во всех случаях ведет (отрисовывает) себя нормально.

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



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

Цитата:
1) В режиме (Alignment <> taLeftJustify) and (not WordWrap) при наборе текста, когда текст заполняет весь контрол, то текст исчезает (точнее говоря он весь уходит за левую границу контрола)  

Не удалось повторить. На всякий случай выкладываю полный код юнита.
Подробнее...

Цитата:
Запускаешь демку с ColorMemo. Тыкаешь мышкой в ColorMemo. Жмешь ПКМ, выбираешь в появившемся контекстном меню пункт "Вставить". Текст иp буфера вставляется в ColorMemo, но вся цветовая расцветка в нем пропадает.Если после этого в ColorMemo нажать любую клавишу или кнопку мыши, то цветовая расцветка опять появляется.  

Пофиксил, добавил обработчик WM_PASTE.
Насчет первого пункта - попробуй с последними сорсами проверить, у меня все нормально - ставил 2 контрола рядом и проверял, одинаково ведут себя.


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

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



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

Цитата:
Пофиксил, добавил обработчик WM_PASTE.

Проверил, все работает нормально.
 

Цитата:
Не удалось повторить. На всякий случай выкладываю полный код юнита.
Насчет первого пункта - попробуй с последними сорсами проверить, у меня все нормально - ставил 2 контрола рядом и проверял, одинаково ведут себя.  

Странно. У меня эта проблема воспроизводится 100%-но.
На всякий случай сделал Демку этой ошибки. Внутри архива exe+код демки+последний ColorEdit.pas+AdvEdit.pas которые я в ней использую. Запустил (попробуй сначала мой exe, а потом уже собери сам).  
Вверху AdvEdit, внизу ColorEdit.
В AdvEdit нажимаем 'w' и удерживаем ее, видим как текст разбегается (taCenter) в обе стороны, когда текст заполняет весь контрол он продолжает нормально скролироваться.
В ColorEdit нажимаем 'w' и удерживаем ее, видим как текст разбегается (taCenter) в обе стороны, когда текст заполняет весь контрол он исчезает.

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



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

Цитата:
Странно. У меня эта проблема воспроизводится 100%-но.  

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

Код:
 
 if Res > 0 then begin
   Result.cx := LoWord(Res);
   if Result.cx>Self.ClientRect.Right then Result.cx:=Result.cx-65535-FStartCaretPos.cx;
   Result.cy := HiWord(Res);
 end; { if }
 

на работе у меня Loword(Res) возвращает число более 65000 если текст за пределами едита, а дома что то около 10000 (плюс минус пару тысяч, точно не помню). Дома стоит WinXP SP3, на работе SP2 причем англ.
Когда дома будет время попробую это как нить обработать.


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

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



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

Цитата:
Дома стоит WinXP SP3, на работе SP2 причем англ.  
У меня на работе есть и XP SP3 (плюс все хот-фиксы безопасности) и XP SP2 (без хот-фиксов вообще), обе русские. Ошибка воспроизводится на обоих компах.
То есть получается, что дело либо в языке OS (что весьма странно), либо в каком то доп. софте, который на это влияет.
 

Цитата:
Когда дома будет время попробую это как нить обработать.
Хорошо, буду ждать.

Всего записей: 683 | Зарегистр. 23-06-2008 | Отправлено: 14:12 27-10-2009
MandrataPupa

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Позвольте чайнику задать вопрос.
Я давно и безуспешно искал исходники какого-нибудь текстового редактора, умеющего раскрашивать текст. Вот нашёл, наконец, эту тему, установил у себя последнюю версию компонента ColorMemo (огромное спасибо разработчикам) и начал пробовать приспосабливать под свои нужды. А требуется мне, чтобы весь текст от ";" до конца строки считался бы комментарием и красился в соответствующий текст. Дык вот, загвоздка как раз в том, как внутри TForm1.ColorMemo1CheckWord отловить конец строки. Ну, или, хотя-бы, момент перехода на следующую строку.  
Понимаю, что данный форум и, в том числе, эта тема не для подобных глупых вопросов. Но, если подскажите, буду очень благодарен. А если пошлёте - тоже не обижусь.

Всего записей: 12 | Зарегистр. 31-10-2010 | Отправлено: 21:15 31-10-2010
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Поиск #10 #13 либо обоих вместе, разные редакторы (программы) по разному метят конец строки, перевод на новую строку.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:22 01-11-2010
Открыть новую тему     Написать ответ в эту тему

Страницы: 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