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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SynUniHighlighter + SynMix: SynTokenMatch?? 
:(
    Опции темы
MechMac
Дата 22.10.2006, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Hello!

First of all: I`m from Germany, my English is bad and i don`t speak any word russian.  smile 

I use the modified version of SynEdit V2.03 (SynMix) with CodeFolding. For SynMix i have to use the SynUniHighlighter instead of the internal Highlighters. This all works good, but how can i use TokenMatching:  IF..ENDIF or DO..ENDDO or (..).
I have a component "SynTokenMatch", but it doesn`t work together with the SynUniHighlighter. The Demo-exe, which can be downloaded on the SynMix page is using TokenMatching, too.

Is there a easy way to implemet such a function, or can i use a modified version of SynTokenMatch, or something else?

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


Новичок



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

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



Can be this???   smile 

Код


uses ... SynEditTypes...;
...
...
...

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;
implementation

{$R *.dfm}
//-------------------------------------


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; 
  Token: string;
  Bracket1, Bracket2: Char;
  Attri: TSynHighlighterAttributes; 
  Rect1, Rect2: TRect;
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;
//----------------------------------------------------


procedure TForm1.FormCreate(Sender: TObject);
var
  SynKeyList: TSynKeyList;
  SynRange: TSynRange;
begin
 SynUni := TSynUniSyn.Create(Self);

  //---------------Brackets---------------
  SynKeyList := TSynKeyList.Create('');
  SynKeyList.Name := 'Brackets';
  SynKeyList.KeyList.Add('{');
  SynKeyList.KeyList.Add('}');
  SynKeyList.KeyList.Add('<');
  SynKeyList.KeyList.Add('>');
  SynKeyList.KeyList.Add('(');
  SynKeyList.KeyList.Add(')');
  SynKeyList.KeyList.Add('[');
  SynKeyList.KeyList.Add(']');

  SynKeyList.Attributes.Foreground := clBlack;
  SynKeyList.Attributes.Background := clWhite;
  SynUni.MainRules.AddKeyList(SynKeyList);



  SynEdit.Highlighter := SynUni;
end;





Это сообщение отредактировал(а) _was_ - 23.10.2006, 01:17
PM MAIL   Вверх
MechMac
Дата 23.10.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Thanx, it works great!!  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Rules and hints for the forum "SynUniHighlighter"
Vit
Vitalik

Hello, dear user!

This is official forum for SynUniHighlighter component and unofficial forum for SynEdit, Codefolding and all related projects.


Some rules for the forum:

1. Do not create new topic if exactly the same already exists.

2. Don't ask several questions in the same topic. One topic - one question.

3. If discussion changes to far from original topic context, then create a separate thread for new discussion subject.


If you already registered then click here to log in.


If you havent't registered yet then click here and register. You need to type username, password (twice), email (twice) and security code.

Next you need go here and choose English language instead of Russian and press Enter.


Some hints for enghlish-speaking users:

- create new topic;     - create new vote;     - answer to the topic.


With regards, Vit, Vitalik.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | SynUniHighlighter and SynEdit (English Language) | Следующая тема »


 




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


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

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