Модераторы: Vitalik

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подсветка парных скобок, Есть ли такая фича? Как в Delphi 8 
:(
    Опции темы
Kordub
  Дата 21.2.2005, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 21.2.2005

Репутация: нет
Всего: нет



В общем, поюзал Delphi 8 и обнаружил там классную новую подсветку - когда курсор расположен возле одной из парных скобок, обе скобки выделены голубым бэкграундом. Сильно упрощает чтение выражений со скобками. Реализовано ли это у вас а если нет, то можно ли сделать?
PM MAIL   Вверх
Vitalik
Дата 22.2.2005, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



Сделать можно. Вот пример кода:
Код
var
 // позиция скобок при предыдущем выделении цветом
 PrevPos1, PrevPos2: TBufferCoord;

const
 BracketSet = ['{', '[', '(', '}', ']', ')', '<', '>'];
 OpenChars: array[0..3] of Char = ('{', '[', '(', '<');
 CloseChars: array[0..3] of Char = ('}', ']', ')', '>');
 BgColorHighlight = clAqua; // фоновый цвет выделения
 FgColorHighlight = $FFFFFF - BgColorHighlight; // цвет шрифта выделения
 needHighlightBrackets = True; // Флаг - нужно ли подсвечивать скобки

function GetOppositeBracket(C: Char): Char;
// Поиск соответствующей скобки
var
 i: integer;
begin
 Result := #0;
 for i := 0 to High(OpenChars) do
   if C = OpenChars[i] then begin
     Result := CloseChars[i];
     Exit;
   end;
 for i := 0 to High(CloseChars) do
   if C = CloseChars[i] then begin
     Result := OpenChars[i];
     Exit;
   end;
end;

procedure TForm1.SynEditPaintTransient(Sender: TObject; Canvas: TCanvas;
 TransientType: TTransientType);
// Процедура для рисования на канве редактора
var
 Pos1, Pos2: TBufferCoord; // позиции парных скобок
 P1, P2: TPoint; // координаты скобок на канве Canvas
 Token: string;
 Bracket1, Bracket2: Char; // символы скобок
 Attri: TSynHighlighterAttributes; // атрибуты скобки (из подсветки)
 Rect1, Rect2: TRect; // прямоугольник скобки на канве Canvas
begin
 if (not needHighlightBrackets) or (SynEdit.Highlighter = nil) then
   Exit;
 Pos1 := SynEdit.CaretXY;
 SynEdit.GetHighlighterAttriAtRowCol(Pos1, Token, Attri);
 Pos2 := SynEdit.GetMatchingBracketEx(Pos1); // поиск парной скобки

 if (Pos1.char > 1) and (Pos2.char = 0) then begin
   // если не найдена парная скобка
   Dec(Pos1.char); // проверить для предыдущего символа
   SynEdit.GetHighlighterAttriAtRowCol(Pos1, Token, Attri);
   Pos2 := SynEdit.GetMatchingBracketEx(Pos1);
 end;

 if (PrevPos1.char <> Pos1.char) or (PrevPos1.line <> Pos1.line) or
    (PrevPos2.char <> Pos2.char) or (PrevPos2.line <> Pos2.line) then
 begin // если позиция подсвечиваемой скобки изменилась, то перерисовать
   SynEdit.InvalidateLine(PrevPos1.line);
   PrevPos1 := Pos1;
   SynEdit.InvalidateLine(PrevPos2.line);
   PrevPos2 := Pos2;
 end;
 
 if ((Pos2.char = 0) and (Pos2.line = 0)) or SynEdit.SelAvail or
   (Length(Token) <> 1) then
     Exit;

 Bracket1 := Token[1];
 if Bracket1 in BracketSet then begin
   Bracket2 := GetOppositeBracket(Bracket1); // парная скобка
   // получение для скобок экранных координат на канве
   P1 := SynEdit.RowColumnToPixels(SynEdit.BufferToDisplayPos(Pos1));
   P2 := SynEdit.RowColumnToPixels(SynEdit.BufferToDisplayPos(Pos2));
   // установка свойств шрифта для рисования скобки
   with Canvas do begin
     Font.Assign(SynEdit.Font);
     Font.Style := Attri.Style;
     Font.Color := FgColorHighlight;
     Brush.Color := BgColorHighlight;
   end;

   // рисование подсвеченной скобки
   Rect1.Top := P1.Y;
   Rect1.Left := P1.X;
   Rect1.Bottom := Rect1.Top + Canvas.TextHeight(Bracket1);
   Rect1.Right := Rect1.Left + Canvas.TextWidth(Bracket1);
   Canvas.FillRect(Rect1);
   Canvas.TextOut(P1.X, P1.Y, Bracket1); // была опечатка

   // рисование парной подсвеченной скобки
   Rect2.Top := P2.Y;
   Rect2.Left := P2.X;
   Rect2.Bottom := Rect2.Top + Canvas.TextHeight(Bracket2);
   Rect2.Right := Rect2.Left + Canvas.TextWidth(Bracket2);
   Canvas.FillRect(Rect2);
   Canvas.TextOut(P2.X, P2.Y, Bracket2); // была опечатка
 end;
end;

Если есть вопросы по коду - задавай! smile

P.S. Была небольшая опечатка в коде, только что исправил.

Это сообщение отредактировал(а) Vitalik - 23.2.2005, 00:12
PM MAIL WWW ICQ YIM   Вверх
Kordub
Дата 2.3.2005, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 21.2.2005

Репутация: нет
Всего: нет



Не работает, так как не может найти парную скобку. Не работает почему-то GetMatchingBracketEx - все время возвращает нулевую позицию. Pos2 = (0,0) и обработчик события завершается по условию
Код
 if ((Pos2.char = 0) and (Pos2.line = 0)) or SynEdit1.SelAvail or
   (Length(Token) <> 1) then
     Exit;


PM MAIL   Вверх
Vitalik
Дата 3.3.2005, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



Странно...

А у тебя какая подсветка для SynEdit'а выбрана?
PM MAIL WWW ICQ YIM   Вверх
Kordub
Дата 4.3.2005, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 21.2.2005

Репутация: нет
Всего: нет



SynUniSyn
PM MAIL   Вверх
Vitalik
Дата 4.3.2005, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



В правилах этой подсветки есть список ключевых слов, в которых присутствуют скобки? Если нет - создай такое правило --Resize_Images_Alt_Text--

PM MAIL WWW ICQ YIM   Вверх
Quadr0
Дата 10.5.2005, 21:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 14.7.2011, 20:13
  Вверх
Vitalik
Дата 11.5.2005, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



Quadr0, добро пожаловать к нам на огонёк! (я про форум)
Очень рад новому участнику! smile

Цитата(Quadr0 @ 10.5.2005, 21:27)
procedure TMainForm.FindBracketExecute(Sender: TObject);
...

Эта процедура только найдёт парную скобку, а Kordub просил сделать подсветку парной скобки при попадании на неё курсора smile
Но всё равно спасибо за попытку помочь!
PM MAIL WWW ICQ YIM   Вверх
Quadr0
Дата 11.5.2005, 20:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 14.7.2011, 20:15
  Вверх
Vitalik
Дата 12.5.2005, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



Цитата(Quadr0 @ 11.5.2005, 20:42)
Тогда ему прямая дорога в сэмплы SynEdut 2.0b. Там лежит дэмка PaintTransient которая этим как раз и занимается.

А чем не устраивает приведённый мной код? smile
А за демку - спасибо, не замечал её до селе... smile
PM MAIL WWW ICQ YIM   Вверх
Coriolis
Дата 16.9.2005, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 22.8.2005

Репутация: 1
Всего: 1



Нефигасебе здоровый код! Чтобы реализовать эту удобственность...
В смысле это вообще в синэдите не предусмотрено... А ведь такая удобная весчь!
Странно.
PM MAIL   Вверх
Coriolis
Дата 16.9.2005, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 22.8.2005

Репутация: 1
Всего: 1



Добавлю, что код Vitalik работает, а из демки - нет.
PM MAIL   Вверх
ActioN
Дата 16.9.2005, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 12.4.2005

Репутация: нет
Всего: нет



Quadr0, Vitalik, а у вас случайно нету готового рабочего кода на C++ Builder'e для реализации этой функции?
PM MAIL WWW   Вверх
miksayer
Дата 16.9.2005, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 21.11.2004

Репутация: нет
Всего: 1



угу, у меня тот же вопрос. Не могу перевести
PM MAIL   Вверх
Coriolis
Дата 28.10.2005, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 22.8.2005

Репутация: 1
Всего: 1



Вот, вернулся к проекту, возникла трябла.
В ключевых словах у меня прописаны операторы.
Существуют и переменные с именем оператора.
Поэтому возникает ситуация: переменная подсвечивается как оператор.
Чтобы избежать этого я начал извращаться: в ключевых словах к операторам добавляю символы, например
Операторы:
B
S
M
B:
M:
S:

Вот, и ещё создал набор KeyWords, с названием NOToperators, и цветом как обычные символы:
B=
B,
B)
M=
M,
M)
S=
S,
S)
т.е. операторы не могут встречаться в тексте рядом с такими символами.
Но вот проблема: код для подсветки парных скобок, который привёл Vitalic, не видет такой скобки. Не могу понять - почему.
пример:
s a=$$abc^abc(1,2,s)
Первую скобку видит, а последнюю - нет. Игнорирует.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | SynUniHighlighter и SynEdit | Следующая тема »


 




[ Время генерации скрипта: 0.1426 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.