Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
Технофашист
229 / 217 / 11
Регистрация: 11.03.2009
Сообщений: 887

Подсветка синтаксиса при помощи TRichEdit

19.04.2012, 11:50. Показов 3814. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужна подсветка синтаксиса как в нормальных отладчиках. Т.е. пишешь код или вставил ctrl+v - текст сразу отформатировался.
Реально ли это реализовать средствами TRichEdit? Я пробовал пару лет назад, но жутко тормозило. Может конечно делал коряво. Или тут только лезть на WinAPI?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.04.2012, 11:50
Ответы с готовыми решениями:

Подсветка синтаксиса
Как реализовать подсветку синтаксиса? Желательно как в Ноутпад++. То есть вводишь слово и как только ввел - оно сразу выделилось и...

Подсветка синтаксиса
Здрасти! Есть такая проблема. Хочу сделать подсветку синтаксиса (да, да, я изобретаю велосипед, но ради практики и обучения). Как...

Подсветка синтаксиса в RichEdit
Доброго времени суток! Как можно в RichEdit реализовать подсветку синтаксиса HTML например? Заранее спасибо!!!

13
74 / 63 / 0
Регистрация: 24.03.2012
Сообщений: 333
19.04.2012, 12:01
Для такого есть SynEdit, например
1
Технофашист
229 / 217 / 11
Регистрация: 11.03.2009
Сообщений: 887
20.04.2012, 00:27  [ТС]
Скачал я его, вроде установил как сказано здесь
SynEdit для XE2
но чего то вообще не понимаю, что дальше делать? в компонентах он не появился, я вообще туплю (( целый день уже мучаюсь
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
20.04.2012, 06:01
Особой разницы между методами RichEdit и WinAPI не замечал (ибо в конечном счете используются апи функции). При корректном алгоритме (без посимвольных сравнений 100500 строк) задержек быть не должно.
1
Технофашист
229 / 217 / 11
Регистрация: 11.03.2009
Сообщений: 887
20.04.2012, 09:59  [ТС]
Дело не в задержках, алгоритм на RichEdit я довольно шустрый сделал. Проблема в том, что не пойму что делать с функцией отмены действия, ибо в буфер запоминаются и действия по форматированию текста. Искал, но так и не нашел в RichEdit возможности отключения буфера на время (чтобы просто "заморозить", но не стирать его совсем). Т.е. отключил запись в буфер отмены - сделал форматирование - опять включил.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.04.2012, 21:46
Вот накатал по быстрячку невникая, вроде норм...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TSearchTypes Stype;
 Stype=Stype<< stMatchCase;
 String Text=L"Слово2";
 
 int start=0,stop=0;
 
 for(;start>=0;)
 {
 start = RichEdit1->FindText(Text,start+stop,RichEdit1->Text.Length(),Stype);
 stop  = Text.Length();
 
 RichEdit1->SelStart=start;
 RichEdit1->SelLength=stop;
 
 RichEdit1->SelAttributes->Style=
   RichEdit1->SelAttributes->Style<<fsBold;
 RichEdit1->SelAttributes->Color=clRed;
 }
}
Миниатюры
Подсветка синтаксиса при помощи TRichEdit  
1
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
20.04.2012, 22:46
Цитата Сообщение от darkAngel Посмотреть сообщение
Искал, но так и не нашел в RichEdit возможности отключения буфера на время (чтобы просто "заморозить", но не стирать его совсем).
Имеено этим вопросом не занимался, но эта возможность фигурирует в документации по RichEdit 3. Если не искать, то первое, что приходит на ум, второй невидимый RichEdit, в котором идет обработка текста, а далее вставка в первый. Но это не окончательный вариант. Дело в том, что если можно копировать текст с заданным форматированием, то его можно и создавать без использования дополнительных компонентов.
1
Технофашист
229 / 217 / 11
Регистрация: 11.03.2009
Сообщений: 887
21.04.2012, 00:25  [ТС]
Avazart, проблема не в алгоритме, а в скорости его работы и невозможности корректной отмены действий.

DefineTrueFalse, про копирование форматированного текста интересная мысль... только как. Насколько я помню, RichEdit подчиняется стандарту rtf-файлов, т.е. содержит невидимые теги форматирования. Но эти теги не доступны через поле Text компонента.....
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 00:48
Но эти теги не доступны через поле Text компонента.....
Разве что сохранять в файл
Текст "Слово2" красным жирным шрифтом если сохранить в файл и открыть блокнотом
Code
1
2
3
4
5
6
{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fnil\fcharset204 Tahoma;}}
{\colortbl ;\red255\green0\blue0;}
\viewkind4\uc1\pard\cf1\b\f0\fs16\'d1\'eb\'ee\'e2\'ee2\cf0\b0\par
\par
\cf1\b\par
}
Добавлено через 9 минут
но эта возможность фигурирует в документации по RichEdit 3.
Вот что нашел
http://support.microsoft.com/kb/199852/ru
http://www.rsdn.ru/forum/com/67137.all.aspx
Но на RichEdit3.0 ли написан TRichEdit?
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
21.04.2012, 03:21
Цитата Сообщение от Avazart Посмотреть сообщение
Но на RichEdit3.0 ли написан TRichEdit?
Версия библиотеки, на котором был разработан компонент различается взависимости от IDE. Проверить поддерживает ли ваш компонент какое-либо действие можно прописав сообщение этого действия - если оно есть, то 99%, что все будет работать нормально. Иногда об этом можно узнать покопавшись в коде или прочитать документацию, скорее всего 2.0 но это уже другой вопрос. В 3.0 это EN_STOPNOUNDO.

Если идет речь о создании некого плагина, чтобы RichEdit был весь радужный и в цветочек - гиблая затея. В любом случае нужно будет создавать собственный компонент, и тут уже встает вопрос что брать за родитель. В случае, если брать готовый RichEdit, то ваши возможности все равно будут ограничены встроенными функциями. Чуток создать расширение функциональности можно, если использовать метод Perform, и если есть обратная совместимость, то пара-тройка плюшек гарантированы. Однако для полноценной реализации - нужно капитальное создание через API. Хочу заострить внимание именно на этом. При создании указывается класс, создаваемого окна и если разработчики мелкомягких посчитали, что идет "новая ветвь" компонента, то это название будет отличаться. Но чтобы не устраивать тотальный обвал совместимости со старыми приложениями, конечно оставляют некоторые стабильные версии классов. Но это теория. Итак, чем же так хороши API функции? Если на машине есть возможность использовать компонент последний версии, то не важно, есть такая возможность в IDE или нет - все равно создаст (обратное правило тоже действует). Далее привожу пример компонента версии 4.1.

C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef MSFTEDIT_CLASS
#define MSFTEDIT_CLASS  L"RICHEDIT50W"
#endif
// собственно условие не обязательно, просто на случай если уже есть определение (в RAD XE есть).
// ....
void __fastcall TForm1::Button1Click(TObject * Sender)
{
  HANDLE RichLibrary = LoadLibrary(L"Msftedit.dll");
  // загрузка библиотеки с соотвестувующей версией создаваемого объекта.
  HWND RichEdit = CreateWindowEx(WS_EX_STATICEDGE, MSFTEDIT_CLASS, L"Hello world", ES_MULTILINE|WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP,10,10,200,200,Handle,NULL,HInstance,NULL);
  // все, этой строчкой создается RichEdit4.1, который в последствии можно использовать
Таким образом можно легко создать свой компонент, на основе стандартного, но более "продвинутой" версии. Большинство самопальных компонентов для подстветки синтаксиса создаются именно так. За иссключением больших полноценных разработок и мегакушающих работу ЦП расскрасок. Но первые, в свободном доступе редко встречаются в сети. Но что-то я ушел от темы.

Как я уже выше говорил, я не посвещал время на вопрос о вставке уже форматированного текста, но помню, что для обратной процедуры было что-то вроде:
C++
1
RichEdit->Perform(EM_PASTESPECIAL, CF_TEXT, 0);
Думаю, что и копать стоит отсюда. Прямая вставка текста вроде "\bHello world\b" (тем более что в процессе вставки там должна быть другая структура с использованием специальных символов) работать не будет. Нужно сообщить о характере добавляемого текста. Вообщем открываем MSDN и штудируем сообщения.
3
Технофашист
229 / 217 / 11
Регистрация: 11.03.2009
Сообщений: 887
21.04.2012, 12:19  [ТС]
Ладно, всем спасибо. Легкого пути нет, как я понял, а на трудный нет времени.

Хотя буду признателен, если кто-нибудь поможет советом как быть с буфером отмены операций. Пробовал формировать текст в другом компоненте и отправлять его в буфер обмена, а после вставлять в RichEdit - вставляется всё хорошо, но отмена операции всёравно глючит - отмененное слово просто влево сдвигается и перекрывает другой текст.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 12:51
А если пойти другим путем: запретить стандартный буфер отмены, и создать собственный?
0
Технофашист
229 / 217 / 11
Регистрация: 11.03.2009
Сообщений: 887
21.04.2012, 13:45  [ТС]
Думал об этом, но думаю это не простая затея.
Если повесить на метод OnChange (срабатывает при любом изменение данных в RichEdit) помимо отрисовки еще и сохранение, думаю производительность упадет еще больше - мерцания обеспечены.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 17:39
Вообще что за требования таки к приложению по производительности?
Да и зачем большой буфеп отмены, создал например буфер к примеру из vector<String> на ограниченый на 10 запоминаемых действий и все нефиг ошибаться пользователю.Изменения фиксировать в OnChange, проверяя Modified.
Да и отрисовка не должна грузить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.04.2012, 17:39
Помогаю со студенческими работами здесь

Динамическая подсветка синтаксиса
Есть ли в XE8 и выше студиях динамическая подсветка синтаксиса, к примеру как в VS2015, когда вводишь неправильную инструкцию, подсвечивает...

Подсветка синтаксиса в RichEdit
Доброго времени суток. Пишу текстовый редактор с подсветкой синтаксиса хтмл. подскажите как этот код переделать под множество ключевых...

Подсветка синтаксиса в TMemo
Здравствуйте! У меня на форме стоит компонент TMemo, так вот, как мне сделать так что-бы если в нем ввели например слово hello, то оно было...

Не работает подсветка синтаксиса
Привет, как можно включить проверку синтаксиса в редакторе (такую как в Delphi) ? студия XE

Подсветка синтаксиса RichEdit
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #pragma hdrstop #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru