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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2011, 16:58   #1
Jetro
Пользователь
 
Регистрация: 15.11.2010
Сообщений: 31
По умолчанию Добавляем форматированный текст в RichEdit из String

Ситуация такая - имеется RichEdit и имеется обычная строка, после обработки этой строки она добавляется в RichEdit.
Мне нужно чтобы после обработки строки некоторые слова в Риче были отформатированы. Как это сделать никак не могу понять, парюсь уже часа полтора.

Попытаюсь объяснить на примере:
Код:
str := обработка данных, в конце которой получаем например 'aaa bbb ccc', в которой bbb должен быть выделен например болдом ;
RichEdit.text := str;
После чего мне в риче хочется увидеть например такое:
Цитата:
aaa bbb ccc
ЗЫ. Об RichEdit.SelAttributes.Style мне известно, но к сожалению здесь не применимо, так как данные нужно брать из стринга, а в нем так данные не пометить.

ЗЗЫ. Надеюсь что достаточно развернуто описал суть проблемы - старался как мог.
Jetro вне форума Ответить с цитированием
Старый 23.06.2011, 17:34   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

немножко прооффтоплю...
есть такой пакет JEDI

и там TJvHTLabel
там он позволяет HTML коды для разметки использовать..
<b><c:Green>Зелёный Болд</b> <u>Подчёркнутый</u>
ну и т.д.

а если Вам нужно всё же в RichEdit выдлять - тогда задавайте нужный кусок и задавайте ему аттрибуты - примеры смотрите

http://www.programmersforum.ru/showthread.php?t=92036

http://www.programmersforum.ru/showthread.php?t=40478

или ещё много где...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.06.2011, 17:37   #3
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

А что происходит в "обработка строки"?
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 24.06.2011, 09:33   #4
Jetro
Пользователь
 
Регистрация: 15.11.2010
Сообщений: 31
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
есть такой пакет JEDI
Как по мне - плохой подход ставить дополнительные пакеты для тех действий, которые можно без проблем реализовать стандартными средствами.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а если Вам нужно всё же в RichEdit выдлять - тогда задавайте нужный кусок и задавайте ему аттрибуты - примеры смотрите
Такой вариант не подходит, так как изменять стили в уже заполненном риче уже поздно, тем более если стили изменять через поиск текста, то можно изменить не тот кусок, а похожий, и тд.

Цитата:
Сообщение от Valio Посмотреть сообщение
А что происходит в "обработка строки"?
Если кратко, то там я парсю текст, вырезая мусор, и дописывая свои фрагменты текста.

Вчера еще долго проводил эксперименты, и понял что решения у моей проблемы скорее всего нет. Я решил сменить подход, в итоге сейчас вывожу текст через TWebBrowser - тут уже без проблем я делаю все то чего хотел от RichEdit.

Спасибо за помощь.
Jetro вне форума Ответить с цитированием
Старый 24.06.2011, 10:13   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

В догонку к RichEdit
Цитата:
так как данные нужно брать из стринга, а в нем так данные не пометить.
Т.е. в строке позиция и длина участка, который нужно отформатировать известна.
Цитата:
после обработки этой строки она добавляется в RichEdit.
Т.е. позиция для вставки известна. Что мешает на основании этого настроить после вставки SelStart, SelLength и изменить SelAttributes.Style? Вот пример:
Код:
var xStart: Integer;
...
  // имеем в RichEdit некий текст
  RichEdit1.Lines.Add('Раз, два, три, четыре, пять');
  RichEdit1.Lines.Add('Вышел зайчик погулять');
  // нужно в конец добавить строку и второе слово выделить
  xStart:=Length(RichEdit1.Text);
  RichEdit1.Lines.Add('Вдруг охотник выбегает');
  RichEdit1.SelStart:=xStart+6; //6 - смещение второго слова относит.начала строки
  RichEdit1.SelLength:=7;       //7 - длина второго слова
  RichEdit1.SelAttributes.Style:=RichEdit1.SelAttributes.Style+[fsBold];
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 24.06.2011 в 10:35.
Аватар вне форума Ответить с цитированием
Старый 24.06.2011, 12:35   #6
Jetro
Пользователь
 
Регистрация: 15.11.2010
Сообщений: 31
По умолчанию

В целом можно было-бы реализовать форматирование и так, но это было-бы не слишком функционально, да и вероятнее всего после полного форматирования текста места вставки не совпадали-бы.
Попытаюсь описать более подробно то что я пытаюсь сделать.
Предположим что у нас есть такой текст:
Цитата:
Delphi — среда программирования, в которой [б]используется[б] язык программирования Object Pascal. Начиная со среды разработки Delphi 7.0, в [а]официальных[а] документах Borland стала использовать название Delphi для [а]обозначения[а] языка Object Pascal. [б]Начиная[б] с 2007 года уже язык Delphi ([в]производный[в] от Object Pascal) начал [[жить]] своей самостоятельной жизнью и претерпевал различные изменения связанные с современными тенденциями ([а]например[а], с развитием [а]платформы[а] .net) развития языков [б]программирования[б]: появились class helpers, перегрузки операторов и д.р.
Нам нужно в нем убрать теги, и выделить текст в соответствии с установленным тегом. Например:
[а] - жирный
[б] - курсив
[в] - подчеркнутый
[[..]] - перечеркнутый.
Я сделал следующим способом - для каждого тега сделал по циклу, который выполняется пока в тексте есть указанный тег. В цикле я удаляю тег, и возвращаю в стринг тот текст, который был внутри тега. Здесь можно было-бы сделать метку, в которой указать позицию нужного текста и его длину, но вот после обработки следующего цикла позиция нужного текста может изменится.
Я думал что в стринге можно сразу подсунуть форматирование что-то типа "{\b текст}", но рич такое форматирование отображает как текст.
Я решил задачу так - при возврате текста в стринг я к нему добавлял html-тег с нужным мне типом, а потом отображал все это в WebBrowser.
Jetro вне форума Ответить с цитированием
Старый 24.06.2011, 12:52   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
для каждого тега сделал по циклу
так действительно тяжело сохранить позиции форматирования, но если анализ делать в одном цикле, то достаточно просто и быстрей
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.06.2011, 15:07   #8
Jetro
Пользователь
 
Регистрация: 15.11.2010
Сообщений: 31
По умолчанию

Один цикл не вариант - во первых не найдет все теги, придется по нескольку раз сканировать текст. Во вторых - цикл динамический, мне на перед не известно сколько тегов еще придумают, по этому я их всех в конфиг добавил, и создается столько циклов, сколько тегов в конфиге.
Jetro вне форума Ответить с цитированием
Старый 24.06.2011, 15:10   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
во первых не найдет все теги
ну это смотря какой цикл, если искать определенный тэг, то не найдет.
а вот если искать открытие тэга, потом считывать что это за тэг, то все можно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.06.2011, 15:37   #10
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Тоесть нужно взять текст с тегами html и заменить их на rtf?
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединить в MemoryStream форматированный текст и изображение Zerofill C++ Builder 0 11.05.2011 23:02
Как копировать и вставить форматированный текст макросом? Sanek_81 Microsoft Office Word 2 19.04.2011 13:29
Форматированный текст в Paradox DimOn4Ik БД в Delphi 7 21.04.2010 20:54
Цветной текст RichEdit KoBRaAndrey Общие вопросы Delphi 17 13.12.2009 17:52
Выделенный текст в RichEdit Andr Компоненты Delphi 1 20.08.2007 20:53