|
Вопрос # 1 750/ вопрос открыт / |
|
Привет, как подсветить синтаксис 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 (статус: Студент), 10 июля 2008, 13:23 [#5]:
А на больших файлах пробовали? Не тормозит? Ну я имею ввиду, если подсветку делать в реальном времени, а не по нажатию на кнопку.
P.S. Зарезервированные слова у вас не все в массиве. Их больше. Да и помимо этого подсветка обычно делается для чисел, строк, комментариев и разных знаков.
С уважением.
|
|
Вадим К (статус: Академик), 10 июля 2008, 14:58 [#6]:
Ой тормозить будет, ой будет...
Надо учиться писать парсер или на крайний случай - регулярки.
Да, там по тексту программы юзается Memo1, что наводит на мысль, что это компонент TMemo. Но те методы, которые там используются, в мемо отсутствуют. Это на самом деле RichEdit.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|