| 
| 
 | Вопрос # 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.
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |