FAQ VCL
Компоненты\SynEdit\SynEdit

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как одновременно выделить несколько слов?

// Способ первый
// Самостоятельно отрисовываем на канве  
uses
  {...,} SynEditTypes;
  
procedure TForm1.SynEdit1PaintTransient(Sender: TObject; Canvas: TCanvas;
  TransientType: TTransientType);
var
  Key, s, DrawText: string;
  i, k: Integer;
  dp: TDisplayCoord;
  p: TPoint;
begin
  Key := 'Begin';
  for i := SynEdit1.TopLine to SynEdit1.TopLine + SynEdit1.LinesInWindow do
  begin
    s := SynEdit1.Lines[i-1];

    k := Pos(AnsiLowerCase(Key), AnsiLowerCase(s));
    while k > 0 do
    begin
      dp := SynEdit1.BufferToDisplayPos(BufferCoord(k, i));
      DrawText := Copy(s, k, Length(Key));
      p := SynEdit1.RowColumnToPixels(dp);

      Canvas.Brush.Color:= clYellow;
      Canvas.Font.Color:= clRed;
      Canvas.TextOut(p.X, p.Y, DrawText);

      k := Pos(Key, s, k + Length(Key));
    end;
  end;
end;

// Способ второй
uses
  {...,} SynEditHighlighter, SynEditSearch, SynEditTypes;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with SynEdit1 do
  begin
    if not Assigned(SearchEngine) then
    begin
      SearchEngine := TSynEditSearch.Create(SynEdit1);
      //SearchEngine.Options := [ssoReplace, ssoReplaceAll];
    end;
    SearchEngine.Pattern := '';
    Repaint; // Удаляем старые метки
    SearchEngine.Pattern := InputBox(' input ', ' search term ', '');
    Repaint; // Рисуем новые метки
  end;
end;

procedure TForm1.SynEdit1Change(Sender: TObject);
begin
  SynEdit1.Repaint; // Перерисовываем метки
end;

procedure TForm1.SynEdit1Paint(Sender: TObject; ACanvas: TCanvas);
var
  i, j: Integer;
  p: TPoint;
  Token: string;
  Attr: TSynHighlighterAttributes;
begin
  with SynEdit1 do
  begin
    if not Assigned(SearchEngine) then
      Exit;

    if SearchEngine.Pattern = '' then
      Exit;

    ACanvas.Brush.Color := clYellow;
    ACanvas.Brush.Style := bsSolid;
    // Поисковые запросы выделяются только в видимой области,
    // что экономит много времени при работе с большими файлами.
    for i := TopLine - 1 to TopLine + LinesInWindow do
    begin
      SearchEngine.FindAll(Lines[i]);
      for j := 0 to SearchEngine.ResultCount-1 do
      begin
        p := RowColumnToPixels(BufferToDisplayPos(BufferCoord(SearchEngine.Results[j], i+1)));
        GetHighlighterAttriAtRowCol(BufferCoord(SearchEngine.Results[j], i+1), Token, Attr);
        if Assigned(Attr) then
          ACanvas.Font.Style := Attr.Style
        else
          ACanvas.Font := Font;
        ACanvas.TextOut(p.X, p.Y, SearchEngine.Pattern);
      end;
    end;
  end;
end;

// Способ третий
// Подсветка нескольких слов, путем
// самостоятельной отрисовки на канве  
type
  TForm1 = class(TForm)
    SynEdit1: TSynEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure SynEdit1Paint(Sender: TObject; ACanvas: TCanvas);
  private
    MyHighlightList: TStrings;
    procedure HighlightNow;
  public
  end;

{...}

implementation

{...}

uses
  SynEditSearch;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyHighlightList := TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  MyHighlightList.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyHighlightList.Add('begin');
  MyHighlightList.Add('end');
  HighlightNow;
end;

procedure TForm1.HighlightNow;
var
  i, j: Int64;
  p: TPoint;
  MyBufferCoord: TBufferCoord;
  OldWord: string;
begin
  with SynEdit1 do
  begin
    SearchEngine := TSynEditSearch.Create(Self);
    for j := 0 to MyHighlightList.Count-1 do
    begin
      SearchEngine.Pattern := MyHighlightList.Strings[j];
      SearchEngine.FindAll(Text);
      for i := 0 to SearchEngine.ResultCount-1 do
      begin
        Canvas.Brush.Color := clYellow;
        // Canvas.Font := Font;
        Canvas.Font.Color := clRed;
        p := RowColumnToPixels(BufferToDisplayPos(CharIndexToRowCol(SearchEngine.Results[i] - 1)));
        MyBufferCoord := CharIndexToRowCol(SearchEngine.Results[i] - 1);
        OldWord := GetWordAtRowCol(MyBufferCoord);
        Canvas.TextOut(p.X, p.Y, OldWord);
      end;
    end;
  end;
end;

procedure TForm1.SynEdit1Paint(Sender: TObject; ACanvas: TCanvas);
begin
  if MyHighlightList.Count > 0 then
    HighlightNow;
end;


Как реализовать кастомную нумерацию строк?

procedure TForm1.SynEdit1GutterGetText(Sender: TObject; aLine: Integer;
  var aText: string);
begin
  if aLine = TSynEdit(Sender).CaretY then
    Exit;

  if aLine mod 10 <> 0 then
    if aLine mod 5 <> 0 then
      aText := '·'
    else
      aText := '-';
end;

// Или чуть более сложный вариант
interface

type
  TSynEdit = class(SynEdit.TSynEdit)
  protected
    procedure SetCaretXY(const Value: TBufferCoord); override;
    procedure SetCaretXYEx(CallEnsureCursorPos: Boolean; Value: TBufferCoord); override;
  end;

implementation

procedure TForm1.SynEdit1GutterGetText(Sender: TObject; aLine: Integer;
  var aText: string);
begin
  if aLine = TSynEdit(Sender).CaretY then
    Exit;
  if aLine mod 10 <> 0 then
    if aLine mod 5 <> 0 then
      aText := '·'
    else
      aText := '-';
end;

{ TSynEdit }

procedure TSynEdit.SetCaretXY(const Value: TBufferCoord);
begin
  inherited;
  InvalidateGutter;
end;

procedure TSynEdit.SetCaretXYEx(CallEnsureCursorPos: Boolean;
  Value: TBufferCoord);
begin
  inherited;
  InvalidateGutter;
end;


Как отображать в редакторе спецсимволы?

procedure TForm1.Button1Click(Sender: TObject);
begin
  SynEdit1.Options := SynEdit1.Options + [eoShowSpecialChars];
end;


Как открыть диалог настройки редактора?

uses
  {...,} SynEditOptionsDialog;

procedure TForm1.Button1Click(Sender: TObject);
var
  Container: TSynEditorOptionsContainer;
begin
  Container := TSynEditorOptionsContainer.Create(SynEdit1);
  try
    Container.Assign(SynEdit1);
    SynEditOptionsDialog1.Execute(Container);
    Container.AssignTo(SynEdit1);
  finally
    Container.Free;
  end;
end;


Как использовать Gutter.ShowModification?

uses
  {...,} SynEditTextBuffer;

procedure TForm1.FormCreate(Sender: TObject);
begin
  with SynEdit1 do
  begin
    Gutter.ModificationColorModified := $0000A5FF;
    Gutter.ModificationColorSaved := $0044FF00;
    TSynEditStringList(Lines).ResetModificationIndicator;
    Gutter.ShowModification := True;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with SynEdit1 do
  begin // Сохранение изменений
    TSynEditStringList(Lines).MarkModifiedLinesAsSaved;
    Repaint;
  end;
end;


Как скрыть/показать нумерацию строк?

procedure TForm1.Button1Click(Sender: TObject);
begin
  SynEdit1.Gutter.ShowLineNumbers := False;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  SynEdit1.Gutter.ShowLineNumbers := True;
end;


Как установить закладку?

procedure TForm1.Button1Click(Sender: TObject);
begin
  SynEdit1.SetBookMark(1, SynEdit1.CaretX, SynEdit1.CaretY);
end;


Как проверить установлена ли закладка?

procedure TForm1.Button1Click(Sender: TObject);
begin
  if SynEdit1.IsBookmark(1) then
    ShowMessage('Закладка с номером 1 установлена');
end;


Как перейти к нужной закладке?

procedure TForm1.Button1Click(Sender: TObject);
begin
  SynEdit1.GotoBookMark(1);
  SynEdit1.SetFocus;
end;


Как удалить закладку?

procedure TForm1.Button1Click(Sender: TObject);
begin
  SynEdit1.ClearBookMark(1);
end;

При использовании материала - ссылка на сайт обязательна