Can be this???
| Код |
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;
|
|