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

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

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

 Версия для печати • ПодписатьсяДобавить в закладки

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

spajwan

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тут столкнулся с проблемой - есть массив слов, и нужно его раскидать по строкам в Rich Edit так что бы одно слово было одним цветом, а следующее другого (в строке слов 7 - 8)  
 
например одно слово clBlue - а другое  clBlack и т.д.
 
кто сталкивался - отпишитесь плиз.
 
Да попытка через Font - успеха не приносит, сразу меняет всё одним цветом

Всего записей: 56 | Зарегистр. 21-06-2009 | Отправлено: 17:59 07-09-2017
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Для RichEdit-a это делается через свойство SelAttributes в связке с SelStart & SelLength. Выделяем слово, меняем атрибуты текста и так для каждого слова.

Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 08:03 08-09-2017 | Исправлено: NeoAnomaly, 08:09 08-09-2017
spajwan

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NeoAnomaly  а как выбрать конкретную строку для работы ?
 
потому как постоянно выбирает только первую строку
вот что написал
 
RichEdit.SelStart:=6;  //  позиция откуда начинать отсчитывать
RichEdit.SelLength:=3;   // кол-во перекрашиваемых букв
RichEdit.SelAttributes.Color:=clBlue;   // в какой цвет
 
естественно значения можно менять программно задав соответствующие переменные, но для этого нужно работать с конкретной строкой то как её правильно выбирать ?

Всего записей: 56 | Зарегистр. 21-06-2009 | Отправлено: 10:44 10-09-2017
ShIvADeSt



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

Цитата:
естественно значения можно менять программно задав соответствующие переменные, но для этого нужно работать с конкретной строкой то как её правильно выбирать ?

 
iSelStart := SendMessage( Handle, EM_LINEINDEX, iLineIndex, 0 );
 
Gets the character index of the first character of a specified line in a multiline edit control. A character index is the zero-based index of the character from the beginning of the edit control. You can send this message to either an edit control or a rich edit control.
При помощи Length(RichEdit.Lines[iLineIndex]) можешь получить длину самой строки. Комбинируя позицию iSelStart как начало выделения плюс длину строки, красишь строки.

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

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt попробовал так
 
iSelStart:=SendMessage(Handle,EM_LINEINDEX,iLineIndex,0);
 
RichEdit.SelStart:=iLineIndex;  //  позиция откуда начинать отсчитывать
RichEdit.SelLength:=3;   // кол-во перекрашиваемых букв
RichEdit.SelAttributes.Color:=clBlue;   // в какой цвет
 
inc(iLineIndex); // переключаюсь на следующий индекс
 
но всё равно выбирает только первую строку
 
тогда попробовал чуть иначе - вот так:
 
  y2:=RichEdit.CaretPos.Y+iLineIndex; // индекс строки в которой находится курсор
  x2:=RichEdit.CaretPos.X; // индекс символа в строке перед курсором
 
RichEdit.SelStart:=x2;  //  позиция откуда начинать отсчитывать
RichEdit.SelLength:=3;   // кол-во перекрашиваемых букв
RichEdit.SelAttributes.Color:=clBlue;   // в какой цвет
 
               inc(iLineIndex); // переключаюсь на следующий индекс
 
но всё равно выбирает только первую строку
 
 - а мне нужно обработать каждую строку в зависимости от условий .
 
что же делаю не так ?
 

Всего записей: 56 | Зарегистр. 21-06-2009 | Отправлено: 10:24 12-09-2017
NeoAnomaly

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

Цитата:
ShIvADeSt попробовал так  
 
iSelStart:=SendMessage(Handle,EM_LINEINDEX,iLineIndex,0);  
 
RichEdit.SelStart:=iLineIndex;  //  позиция откуда начинать отсчитывать  
RichEdit.SelLength:=3;   // кол-во перекрашиваемых букв  
RichEdit.SelAttributes.Color:=clBlue;   // в какой цвет  
 
inc(iLineIndex); // переключаюсь на следующий индекс  

spajwan, а почему RichEdit.SelStart := iLineIndex и хэндл чего передаёшь в функцию SendMessage?
 
Содержимое richedit - строка с символами перевода на новую строку, т.е. например, если ты возьмёшь длину первой строки + 1 (символ перевода) + длину второй строки + 1 = SelStart для третьей строки. Это то же самое, что делает:

Код:
iSelStart := SendMessage( RichEdit.Handle, EM_LINEINDEX, 2, 0 );  


Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 16:56 12-09-2017 | Исправлено: NeoAnomaly, 17:01 12-09-2017
spajwan

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NeoAnomaly   если честно то  до конца мне непонятно как работает эта функция - что такое Handle и EM_LINEINDEX что туда передаётся?
 
С двумя последними так понимаю:
 
 
Цитата:
iLineIndex
 
 
это индекс строки, потому передаю туда строки в зависимости от их местоположения в RichEdit - вот таким образом:
 
 
Цитата:
inc(iLineIndex); // переключаюсь на следующий индекс  

 
по идее он должен переключаться, но из того кода который написал почему-то не получается, хотя проверял ShowMessage - переключается - но закрашивать слова в другой строке нехочет.
 
а последнее параметр в функции  
 
 
Цитата:
,0);  

 
если правильно понимаю то это нулевая позиция в выбранной по индексу строке.
 
 
 
 
 
 
Добавлено:
ShIvADeSt - RichEdit тот который поддерживает юникод - на Delpi 7 этот сторонний компонент (который даёт возможность работать в символами юникода)  наз TntRichEdit .
 
может проблема в этом ?
 
подскажите насколько корректен или некорректен такой код ?
 

Код:
iSelStart:=SendMessage(Handle,EM_LINEINDEX,iLineIndex,0);  
 
RichEdit.SelStart:=iLineIndex;  //  позиция откуда начинать отсчитывать  
RichEdit.SelLength:=3;   // кол-во перекрашиваемых букв  
RichEdit.SelAttributes.Color:=clBlue;   // в какой цвет  
 
inc(iLineIndex); // переключаюсь на следующий индекс


Всего записей: 56 | Зарегистр. 21-06-2009 | Отправлено: 17:54 12-09-2017 | Исправлено: spajwan, 18:00 12-09-2017
ShIvADeSt



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

Цитата:
подскажите насколько корректен или некорректен такой код ?  

Некорректен, я бы на вашем месте освоил технический английский, прочитал хелп и разобрался в данном небольшом куске (чтобы в будущем не копи-пастить, а подгонять под себя ).
Вот так правильнее
iSelStart:=SendMessage(RichEdit.Handle, EM_LINEINDEX, iLineIndex, 0);  
RichEdit.SelStart:=iSelStart;  //  позиция откуда начинать отсчитывать
 


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

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

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Rich Edit пишем буковками разных цветов


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru