Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2014, 03:46   #1
Kotaries
Пользователь
 
Регистрация: 20.06.2011
Сообщений: 27
По умолчанию TreeView, Canvas, Вывод текста

Здравствуйте все.

Не могу справиться с отрисовкой текста на TreeView в XE2.
Мне нужно нарисовать на ноде основным цветом (пусть будет красный) текст, а другим цветом (пусть синим) выделить в нем некоторые слова.
Шрифт использую моноширинный Courier New, и стараюсь реализовать это так: сначала вывожу весь требуемый текст красным (в onAdvancedDrawItem), а затем в том же событии уже "ручками" через textOut выводить отдельные слова того же текста синим цветом.
Делаю это примерно так:

Допустим, мне нужно в фразе "в этой строке ЭТО СЛОВО нужно сделать синим"

Код:
//выбираем для ноды основной цвет - красный
Sender.Canvas.Font.Color:=col;
//если рисуем первый раз, сразу выходим, пока что красный
if(Stage<>cdPostPaint) then exit;

//если уже рисуем поверх, то берем тот шрифт, что сейчас используется
sender.Canvas.Font.Assign(tree.font);
//ставим синий цвет и подчеркивание
Sender.Canvas.Font.Color:= clBlue;
Sender.Canvas.font.Style:=[fsUnderline];
//границы нашей ноды
Rect:=Node.DisplayRect(true);

//тут я заранее знаю, сколько букв должно быть ПЕРЕД синим словом (их ведь не нужно рисовать)
str:='в этой строке ';
int:=sender.Canvas.TextWidth(str);
sender.Canvas.TextOut(rect.Left+int,rect.Top,'ЭТО СЛОВО');
Примерно таким же образом, конечно более сложным, я обрабатываю все ноды. Но почему-то в некоторых нодах синий текст прорисовывается левее или правее, чем нужно. А в некоторых - все идеально. При чем погрешность не кратна ширине символа, так что ошибку в расчетах я либо исключаю вовсе, либо сваливаю на "sender.Canvas.TextWidth". Не пойму, в какую сторону копать :(

Последний раз редактировалось Kotaries; 18.07.2014 в 17:55.
Kotaries вне форума Ответить с цитированием
Старый 18.07.2014, 18:16   #2
Kotaries
Пользователь
 
Регистрация: 20.06.2011
Сообщений: 27
По умолчанию

Вопрос решил сам. Дело в том, что в данный пример я написал так, чтобы форумчанам не пришлось разбираться в лишних деталях моей проги. И упустил кое-какую деталь.

Дело в том, что конечно же, я не знал заранее в процессе прорисовки слов, что в начале фразы нужно будет пропустить именно текст "в этой строке ", поэтому я рассчитывал количество символов и заполнял фиктивную переменную sometext (string), а дальше уже высчитывал ее длину через textWidth.
Делаю я это примерно так:

Код:
//вычислим длину текста ДО нашего слова
setLength(sometext,тут_длина_текста_который_нужно_пропустить);
 //теперь нужно взять смещение слева
 w:=sender.Canvas.TextWidth(sometext)+2;
 //выводим новый красивый текст
 sender.Canvas.TextOut(rect.Left+w,rect.Top+1,а_тут_уже_слово_которое_цветом);

Ну так вот, при ближайшем рассмотрении, выяснилось, что при setLength(s) в переменную записываются вовсе не нуллы, и конечно же не пробелы. А записывается тупо всякий мусор (спасибо notepad++).

Код:
нарисовали слово "белый" (s=NULNULNULNULNULNULNULNULNULNUL?в????NULNULNULNUL) w=304
нарисовали слово "белый" (s=NULNULNULNULNULNULNULNULNULNUL?в????NULNULNULNUL) w=304
нарисовали слово "белый" (s=NULNULNULNULNULNULNULNULNULNUL?в????NULNULNULNUL) w=304
нарисовали слово "белый" (s=NULNULNULNULNULNULNULNULNULNUL?в???ЯNULNULNULNUL) w=295
Вот и получалась разная длина (видите буковку "Я" в последней строке? Она появилась сама собой когда я просто свернул-развернул прогу. Космический мусор, видимо, в переменную попал, потому что я ее не задал явно, а просто выделил ей место setLength'ом)

Решение проблемы - варварское, но теперь все работает! Я тупо заполняю переменную пробелами:

Код:
sometext:='';while(length(sometext)<нужная_мне_длина) do sometext:=sometext+' ';
Ну как обычно, короче. Сам пост создал - сам ответил, ай да я XD
Kotaries вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемещение текста по canvas Alex2009 Общие вопросы Delphi 11 04.12.2013 20:38
Прорисовка TreeView в Canvas Manson_0 Компоненты Delphi 1 17.11.2011 14:50
Захват изображения с камеры И ВЫВОД НА CANVAS FoxWMulder Мультимедиа в Delphi 6 20.01.2011 16:53
Выравнивание текста в canvas Чай_ник Помощь студентам 2 06.12.2010 00:38
Вывод БД в TreeView? Snegovik Помощь студентам 23 30.09.2008 20:43