| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > RichEdit. Форматирован ли текст. |
| Автор: Snowy 1.3.2006, 18:57 |
| Есть RichEdit. Пользователь набил в нем текст. Как узнать, использовал ли он форматирование или весь текст набит одним форматом. Мне нужен просто текст, если форматирование не использовалось и RTF, если использовалось. Не могу отличить... |
| Автор: Snowy 1.3.2006, 19:23 |
| Нет. Это я и так могу узнать. Мне нужно, к примеру: если в тексте пользователь хотя бы одну буковку сделал наклонной или другого цвета, то текст считается, использующим форматирование. Если на протяжении всего текста, его оформление остается постоянным, то такой тест считать неформатированным. Смысл этого: Если пользователь просто пишет текст, считать, что его интересует только текст. Если он использует элементы оформления (жирный, наклонный, цвет, шрифт, размер), то считать, что ему нужен и текст и оформление. Исходя из этого я должен брать либо RTF, либо PlainText. Приоритетный PlainText. Но, если вдруг пользователю захочется... Тогда нужно брать RTF. У пользователя спрашивать нельзя - программа должна сама понимать, что если пользователь меняет оформление, значит оно ему нужно. |
| Автор: Snowy 1.3.2006, 20:11 |
| Пока придумал только такой вариант: Смотреть RTF текст и искать в нем теги форматирования (\b\ и т.п.). Еще есть мысль пробежаться курсором по всем позициям и сравнивать текущий аттрибут с аттрибутом первой позиции. Но сравнить аттрибуты не так просто. Вероятно все же буду просматривать на наличие тегов. Если никто более умного не подскажет... |
| Автор: DemoCode 1.3.2006, 20:38 |
| Могу подсказать более глупого Создаёшь второй невидимый richedit со свойством plaintext:=true. Когда надо проверить. Текст из первого (твоего) richedit'а копируешь во второй. И далее, если длина строки первого едита равна длине строки второго, то форматирования не использовалось, иначе оно использовалось. |
| Автор: Демо 1.3.2006, 20:52 |
| Каким образом пользователь форматирует текст? |
| Автор: Quadr0 1.3.2006, 21:06 |
| ... |
| Автор: Snowy 2.3.2006, 00:02 | ||
Практически 2 варианта: ввод текста с клавиатуры и оформление кнопочками и хоткеями. Второй - вставка из буфера обмена. Это ты зачем так сказал? Вот описание на русском: http://grandad.by.ru/rtf.html А также можно найти полное описание на сайте M$. Причем версий вплоть до Office2003. Там бэкслаш символы. Они превращаются \\. Думаю можно попробовать упростить этот процесс при помощи сериализации объекта TTextAttributes. Все же мне кажется, что быстрее и разумней будет искать по формату. Завтра поэксперементирую. (точнее уже сегодня). Добавлено @ 00:03 А вот и http://www.microsoft.com/downloads/details.aspx?familyid=AC57DE32-17F0-4B46-9E4E-467EF9BC5540&displaylang=en |
| Автор: Snowy 2.3.2006, 00:27 |
| Попробовал. Перестает работать сразу после того, как появляется форматированный текст. После этого всегда говорит, что форматирован. Хотя можно пролечить, если пойти по моей схеме - отталкиваться не от эталона, а от первой позиции. Но тогда не покажет, если весь текст форматирован. В принципе это уже не так важно. Но вариант с тэгами тут лучше. С другой стороны, можно всегда сбрасывать на дефолтовое значение. Но остается проблема со вставкой из буфера - там может быть обычный текст, просто фонт не ариал, а таймс, например... Все же теги надежней. Ладно, будем думать и копать... |
| Автор: Quadr0 2.3.2006, 00:47 |
| ... |
| Автор: DemoCode 2.3.2006, 17:15 | ||
Имеем два ричедита. С первым работает пользователь Второй - невидимый. Когда натсупает момент проверить использовано ли форматирование. Копируем содержимое первого ричедита во второй. Во втором его конвертируем в plain text. Сохраняям оба. Сравниваем. Если размер первого больше, второго, значит форматирование использовано, иначе нет. |
| Автор: Snowy 2.3.2006, 17:24 |
| Здрасте, приехали. Я тебе без сравнивания скажу, что RTF будет длинее, чем plain text. Независимо от форматирования. |
| Автор: DemoCode 2.3.2006, 17:35 | ||
Но можно из RTF'a перед сравнением вырезать то, что он пихает туда по-умолчанию. Добавлено @ 17:42 Проверил так, работает только с латинницей. |
| Автор: Snowy 2.3.2006, 17:59 |
| В таком случае получается еще более сложный вариант, чем определение наличия тегов. Хотя... В эту сторону тоже можно подумать. Кирилицу легко можно законвертить в RTF. Но! Проблема появится, когда строк будет несколько, а не одна - в RTF это новые параграфы. |
| Автор: Yanis 4.3.2006, 10:07 |
| 2 Snowy Посмотри, пожалуйста мой вариант. Он основывается на сверке первого символа с остальными. Что скажешь? |
| Автор: Snowy 6.3.2006, 10:31 |
| Yanis, смотрел. Реагирует даже на смену руской/английской раскладки. Это уж слишком. |
| Автор: Quadr0 6.3.2006, 13:52 |
| ... |
| Автор: RA 6.3.2006, 20:35 |
| Совсем не обязательно делать это автоматических, пусть юзер сам выбирает какой тип хранения ему нужен. Что сложно лишний чекбокс прикрутить куданить Я конечно понимаю, что автоматичность это удобно, а если слишком большой текст то в ручном режыме на много быстрее. |
| Автор: Yanis 7.3.2006, 10:19 | ||||
Думаю эту проблему можно решить если вместо
|
| Автор: Snowy 7.3.2006, 10:48 | ||||
Потому что остается копирование из буфера обмена. Текст, скопированный из вордпада уже не считается форматированным только потому, что шрифт другой.
Проверь вставку из ворда.
Наличие разукраски и будет этим флагом. Зачем мне лепить чекбокс, который в интерфейс у меня просто не вписывается, когда можно сделать автодетект. У меня везде в проекте автодетект, а тут я буду чекбоксы лепить. Некрасиво. Ладно. Значит кроме этих двух идей других нет... Тогда еще идея: Пишем в вордпаде текст. Разные его части делаем разным размером, часть жирную, часть наклонную... Выделяем весь текст. Смотрим на панель - кнопка жирности и наклона пригашены, в поле размера шрифта пусто. Это говорит о том, что в тексте есть разное оформление по размеру, жирности и наклону. Только вот как такого эффекта добиться в своей программе? |
| Автор: Quadr0 7.3.2006, 22:31 |
| ... |
| Автор: Snowy 9.3.2006, 16:41 | ||||||
Я имею ввиду, что текст, скорированный из вордпада всегда считается форматированным, низависимо ни от чего.
RxRichEdit также построен на том же самом контроле, просто расширен функционал кода. Реально у нас вовсе не 1.0. Просто юзать выше стандартно не можем, т.к. нет реализации. Но на уровне WinAPI можно туда и картинки и таблицы вставлять.
Ну хоть какой-то результат есть в наличии. Наконец-то дошли руки. Вот, доработал немножко:
Если артифакты не попадутся, то пожалуй остановлюсь на этом варианте. Раз уж он работает, то незачем тэги ковырять. Бонус в этом топике уходит Quadr0 |
| Автор: Yanis 10.3.2006, 15:02 | ||
Сдаётся мне, что мой варинт работает быстрее. |
| Автор: Snowy 10.3.2006, 15:11 |
| Логично. Но не настолько, чтобы это было заметно. А если в него добавить исключения, то больше заморочек. А суть все та же. |
| Автор: Quadr0 11.3.2006, 20:06 |
| ... |
| Автор: Snowy 11.3.2006, 20:20 | ||
Приоритет должен быть у plain text, а не у RTF. Код, который я нарисовал, делает точно так, как мне нужно. Уже его воткнул в проект. Работает без нареканий. |