Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 750

Раздел: Delphi » Прочее
/ вопрос открыт /

Привет, как подсветить синтаксис delphi
в RichEdit или Memo

ВВиталикк Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: ВВиталикк (статус: Посетитель)
Вопрос отправлен: 7 июля 2008, 00:12
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Dron

Здравствуйте, ВВиталикк!
Писать это самому - изобретать велосипед. Потратите уйму времени, а для чего? Есть готовые решения.
Решение №1. В JediVCL на странице Jv Edits палитры компонент есть редактор TJvHLEditor. Он автоматически подсвечивает код. Знает полтора десятка языков, в том числе и Pascal. Достаточно функционален и прост в использовании.
Решение №2. В разделе Компоненты - Редакторы есть редактор SynEdit. Его целью как раз и является подсветка кода. Он и помощнее редактора из JVCL (ну это логично - в JVCL ещё несколько сотен компонент, а SynEdit - отдельный компонент).
Посмотрите оба варианта и выберите для себя наиболее подходящий.
Удачи!

Ответ отправил: Dron (статус: Студент)
Время отправки: 7 июля 2008, 09:16

Ответ #2. Отвечает эксперт: min@y™

Когда-то в детстве у меня тоже была такая бредовая идея. Но потом я нашёл SynEdit и проблемы отпали. Прошло время, и я сам написал с десяток новых подсветок синтаксиса. Качай вот отсюда последнюю версию. Не пожалеешь.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 7 июля 2008, 09:22
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 10 июля 2008, 14:58; участников в обсуждении: 4.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 7 июля 2008, 05:39 [#1]:

Во-первых, придется завести словарь синтаксических выражений Delphi.
А для чего это, если не секрет? Создаем свой компилятор?
ВВиталикк

ВВиталикк (статус: Посетитель), 7 июля 2008, 14:53 [#2]:

А есть компоненты чтобы подсвечивали синтаксис именно в memo?
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 7 июля 2008, 18:47 [#3]:

Что и как подсвечивать возложено на программиста, соответственно определять что подсвечивать, а что нет - определять самому. В том числе и определять что относится к синтаксису Delphi, а что нет - тоже.
ВВиталикк

ВВиталикк (статус: Посетитель), 10 июля 2008, 12:11 [#4]:

Спасибо за помощь я нашёл алгоритм подсветки синтаксиса

function TForm1.CheckList(InString: string): boolean;
const TheList: array[1..33] of string = ('begin', 'or', 'end', 'else','end.','property',
'end;', 'then', 'var', 'for', 'do', 'if', 'to', 'string', 'while','const', 'uses', 'unit','asm', 'grinsoft','implementation','public','private','interface','function','procedure','type','array','resourcestring','asm','label','file','case');
var X: integer;
begin
Result := false;
X := 1;

InString := StringReplace(InString, ' ', '',[rfReplaceAll]);
InString := StringReplace(InString, #$A, '',[rfReplaceAll]);
InString := StringReplace(InString, #$D, '',[rfReplaceAll]);
while X < High(TheList) + 1 do
if TheList[X] = lowercase(InString) then
begin
Result := true;
X := High(TheList) + 1;
end
else inc(X);
end;
function SearchFor(WorkSpace, Search: string; Start: integer): integer;
var Temp: string;
begin
Temp := copy(WorkSpace, Start, length(WorkSpace));
Result := pos(Search, Temp);
end;
procedure TForm1.HighLight;
var WStart, WEnd, WEnd2: integer;
WorkSpace, SWord: string;
begin
WStart := 1;
WEnd := 1;
with Memo1 do
begin
WorkSpace := Text + ' ' + #$D#$A;
while WEnd > 0 do
begin
WEnd := SearchFor(WorkSpace, ' ', WStart);
WEnd2 := SearchFor(WorkSpace, #$A, WStart);
if WEnd2 < WEnd then WEnd := WEnd2;
SWord := copy(WorkSpace, WStart, WEnd - 1);
if (SWord <> ' ') and (SWord <>'') then
if CheckList(SWord) then
begin
SelStart := WStart - 1;
SelLength := length(SWord);
SelAttributes.Style := [fsBOLD];
SelStart := WStart + length(SWord) + 1;
SelAttributes.Style := [];
end;
WStart := WStart + WEnd;
end;
SelStart := length(Text);
SetFocus;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var WEnd, WStart, BCount: integer;
Mark: string;
begin
HighLight;
end;
Dron

Dron (статус: Студент), 10 июля 2008, 13:23 [#5]:

А на больших файлах пробовали? Не тормозит? Ну я имею ввиду, если подсветку делать в реальном времени, а не по нажатию на кнопку.

P.S. Зарезервированные слова у вас не все в массиве. Их больше. Да и помимо этого подсветка обычно делается для чисел, строк, комментариев и разных знаков.
С уважением.
Вадим К

Вадим К (статус: Академик), 10 июля 2008, 14:58 [#6]:

Ой тормозить будет, ой будет...
Надо учиться писать парсер или на крайний случай - регулярки.

Да, там по тексту программы юзается Memo1, что наводит на мысль, что это компонент TMemo. Но те методы, которые там используются, в мемо отсутствуют. Это на самом деле RichEdit.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:51
Выполнено за 0.03 сек.