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

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

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

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

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

MandrataPupa

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

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



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть процедура PaintLine, в которую передается номер строки. Отредактируйте ColorMemo1CheckWord так чтобы в него передавался номер строки. Просто у меня нет процедуры ColorMemo1CheckWord поэтому я не знаю как она работает.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 09:26 01-11-2010
MikeZ

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Проблема с LoWord и координатами длинного текста выплыла и у меня (ХР СП3). Т.к. она системозависима, то, имхо, как-то фиксить её не получится - нельзя заранее узнать, координата -50000 - это глюк или текста много. Поэтому надо вообще от этого уйти и считать координату по-другому.  Положение ж самой каретки нам не надо вычислять? А отрисовать текст, имея канву, можно вычислить через длину текста и контрола.  
 
Добавлено:
MandrataPupa
StalkerSoftware
Я бы добавил в onCheckWord несколько параметров, типа строки, её номера, номера слова, типа подчеркивания (не только волнистую), её цвет. Оно будет надо или лучше не влазить со своими правками в чужую стройную конструкцию?

Всего записей: 407 | Зарегистр. 01-02-2004 | Отправлено: 11:42 01-11-2010 | Исправлено: MikeZ, 11:44 01-11-2010
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MikeZ
Если хотите доработать - дорабатывайте, так как я насколько помню в тупике из-за того, что разные системы по разному возвращают координаты. По другому я не знаю как решить проблему, там связано это с тем, чтобы отрисовывать не весь текст, а только его часть, видную на экране. Поэтому нужно знать позицию каретки. А она не однозначно возвращается.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 11:57 01-11-2010
MikeZ

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Попробую налепить «заплатку»: в WMPAINT'е рассчитать именно х-координату уже после GetTextPos через TextWidth и Align. Но будет некрасиво  
 
Добавлено:
В ColorMemo, как я понял, таких проблем нет?

Всего записей: 407 | Зарегистр. 01-02-2004 | Отправлено: 13:01 01-11-2010
MandrataPupa

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Надоел я уже тут наверное всем. Однако осмелюсь ещё раз влезть со своими проблемами.
Нельзя ли в ColorMemo сделать, чтобы обработчику OnCheckWord передавалась бы ещё инфа об конце строки? Щас по концу строки обрабатываемое слово cWord равно пробелу. Пусть бы было как есть, #13#10. Дело в том, что мне, допустим, надо покрасить комментарии от ";" до конца строки, а конец-то как раз и никак не отлавливается, что уж я только ни делал. Да и вообще, может быть полезно знать, когда следующая строка начинается. К примеру - захочется, допустим, раскрасить все строки в разный цвет, чтобы легче читалось.

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

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MandrataPupa
Можно, я ж и предложил. Докручу и выложу. Благо, не оч. много и всё за меня сделали.

Всего записей: 407 | Зарегистр. 01-02-2004 | Отправлено: 21:48 01-11-2010
MandrataPupa

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А лучше бы, наверное всё-таки знать именно номер строки. Это если делать полосатый текст (строка по-темнее, строка по-светлее). А если просто красить подряд тёмная/светлая, то при изменении размера по вертикали и при скроллинге расцветка будет прыгать. А может быть, я и ошибаюсь.

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



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

Цитата:
Дело в том, что мне, допустим, надо покрасить комментарии от ";" до конца строки, а конец-то как раз и никак не отлавливается, что уж я только ни делал. Да и вообще, может быть полезно знать, когда следующая строка начинается. К примеру - захочется, допустим, раскрасить все строки в разный цвет, чтобы легче читалось.

Это делается другим способов - если найден тег комментария, то прекращаем парсить текст и все красим цветом для комментария.
Полосатый текст тоже по другому делается - в процедуре PaintLine есть номер строки - выставляем бэкграунд в зависимости от четности нечетноси номера и потом уже рисуем на нем.
Но для этого надо вначале разобраться как работает код. А это Вы судя по всему забыли сделать


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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 04:52 02-11-2010
MandrataPupa

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

Цитата:
Но для этого надо вначале разобраться как работает код. А это Вы судя по всему забыли сделать  
По правде сказать, да, не разобрался. Но не забыл, а просто пока ещё абсолютно не ориентируюсь в среде. Всего только несколько дней пытаюсь постигнуть дельфи. До этого (ооочень давно!) имел дело только со старинным досовским паскалем. Посему прошу не судить строго. Вот только буквально сию минуту сделал для себя ОТКРЫТИЕ - оказывается есть возможность залезть внутрь процедур TColorMemo. А до этого даже не мог взять в толк, про какую это процедуру PaintLine Вы мне всё время пытаетесь втолковать. Ну теперь-то, будем надеяться, будет возникать меньше дурацких вопросов.

Всего записей: 12 | Зарегистр. 31-10-2010 | Отправлено: 10:26 02-11-2010 | Исправлено: MandrataPupa, 10:40 02-11-2010
MikeZ

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
На самом деле, имхо, информация лишней не бывает. Если есть возможность вывода номеров, то что, нам жалко, что ли?
 
Сделал ColorEdit:
1. Поправил вывод с центральным/правым выравниванием. Тестите.
2. Расширил список параметров, передаваемых в событие для раскраски (+ номер слова, общее кол-во слов)
3. Я совершенно не понял прикола обрабатывать наличие пустого Text в edit'е, заменяя его на пробел, если мы не просто выводим, а как-то обрабатываем текст, например, центрируем его. Убрал все «+' '» из текста и добавил проверки на пустые строки.
4. Я чуть приподнял (т.е. ближе к тексту) подчеркивание. Как по мне, так приятнее смотреть.
 
новая версия ниже...
 
Добавлено:
ColorMemo:
1. Расширил список параметров, передаваемых в событие для раскраски (номер слова, кол-во слов, полный текст строки, её номер, тип подчеркивания, его цвет)
2. Расширил варианты подчеркивания (наверное, и в ColorEdit надо добавить)
3. Пофиксил ту же фишку с добавлением пробелов к строкам
 
новая версия ниже...
 
UPD: в DrawUnderline в ColorMemo забыл clRed на ulColor заменить. Подправил.

Всего записей: 407 | Зарегистр. 01-02-2004 | Отправлено: 12:06 02-11-2010 | Исправлено: MikeZ, 18:57 03-11-2010
MikeZ

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

Всего записей: 407 | Зарегистр. 01-02-2004 | Отправлено: 17:10 02-11-2010 | Исправлено: MikeZ, 17:11 02-11-2010
MikeZ

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Еще чуток навернул (для ColorEdit и ColorMemo):
1. Опустил обратно позицию подчёркивания
2. Добавил слегка изменяемые для каждого слова стили шрифта:
  - подчёркивание и зачёркивание можно добавлять (если не задано для всего контрола) и удалять (если задано);
  - жирный можно только добавлять, если такой стиль для всего текста НЕ задан;
  - курсив никак не регулируется.
 
ColorEdit
 
ColorMemo

Всего записей: 407 | Зарегистр. 01-02-2004 | Отправлено: 18:53 03-11-2010
MandrataPupa

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А почему бы просто не назначать свой фонт для каждого случая, а не отдельные его свойства? Тут же всё в одном флаконе: и цвет (правда, ограниченный набор) и стиль и шрифт и зачёркивание/подчёркивание и всё остальное.

Всего записей: 12 | Зарегистр. 31-10-2010 | Отправлено: 09:18 05-11-2010
MikeZ

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

потому, что разный фонт - это разный размер букв. Всё было бы хорошо, но каретка, положение которой рассчитывается от исходного шрифта, начинает «уплывать» от нужного положения и чем больше текст, тем дальше. Поэтому я и Bold не могу отменить.
 
Попробуй перед строками 847, 881 и 925 (где TextOut) в ColorEdit добавить
Font.Style := Font.Style + [fsItalic];
И потести на длинных строках

Всего записей: 407 | Зарегистр. 01-02-2004 | Отправлено: 10:06 05-11-2010
MandrataPupa

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Понятненько. А таки жаль. Было бы очень гламурно. Мне так кажется. А если каждый раз от пересчитывать на разный шрифт, это, пожалуй, будет слишком муторно. Ну да ладно. Главное, что есть теперь возможность текст раскрашивать как душа пожелает. В общем и, в том числе, в целом, вещь получилась стоящая

Всего записей: 12 | Зарегистр. 31-10-2010 | Отправлено: 12:13 05-11-2010 | Исправлено: MandrataPupa, 12:27 05-11-2010
MikeZ

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MandrataPupa
Если со шрифтами, то у нас для этого RichEdit есть - там всё можно.

Всего записей: 407 | Зарегистр. 01-02-2004 | Отправлено: 17:39 05-11-2010
MandrataPupa

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RichEdit кушает только RTF-файлы. Меня это категорически не устраивает.  
Вот ещё поковыряюсь с дельфи, наберусь наглости и попытаюсь-таки самостоятельно перетянуть всё на обработку фонтов. Пока ещё слабо себе представляю даже масштаб задачи. Но таки попытаюсь обязательно. Хотя-бы поупражняюсь. Вдруг да получится чевота!

Всего записей: 12 | Зарегистр. 31-10-2010 | Отправлено: 20:38 05-11-2010
MikeZ

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
С чего бы?! Возьми RichEdit, сделай ему Lines.LoadFromFile обычный текстовый файл и он его замечательно скушает.
 
Добавлено:
Со шрифтами, конечно, тоже побалуйся. Только, сдаётся мне, что если еще и size обрабатывать, то там крыша может окончательно не выдержать!

Всего записей: 407 | Зарегистр. 01-02-2004 | Отправлено: 22:22 05-11-2010
ShIvADeSt



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

Цитата:
Вот ещё поковыряюсь с дельфи, наберусь наглости и попытаюсь-таки самостоятельно перетянуть всё на обработку фонтов.

Не получится. Объясняю в вкратце, чтобы было сделано. Была переписана вся отрисовка для Едита (Мемо в винде это многострочный Едит). Но при этом сам механизм работы - позицонирование каретки и прочее не трогалось. В связи с тем, что Едит не поддерживает разные шрифты, то попытка отрисовывать разные куски текста разным шрифтом чревато некорректной отрисовкой  каретки. А это в свою очередь ведет к самому главному, почему я не стал трогать механику работы - отрисовка выделения. Как только вы поломаете стандартный механизм (а отрисовка каретки - это часть этого) готовьтесь к самостоятельной отрисовке выделения для ВСЕХ случаев. Курить начапо топика, там много про это написано - код там же.
Итого, смысл  все это городить с Едитом, когда в сети куча примеров реализации поддержки разных шрифтов для РичЕдита - специально заточенный для этого. Если же есть желание написать собственный редактор - то как все нормальные люди делай собственный контрол (Смотри AkelPad или Beam Notepad) либо пиши его на основе. Теорию для написания своего контрола мону дать, сам  ее вдумчиво читал, когда дописывал данный контрол. Часть кода оттуда, там правда С++, но это не важно - надо уметь читать любой код.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:30 06-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