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

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

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

:: MVP ::

:: RSS ::

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

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

uses
  SynEditKeyCmds;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Удаление символа слева от каретки (backspace key)
  SynEdit1.CommandProcessor(ecDeleteLastChar, #0, nil);
  // Удаление символа справа от каретки (delete key)
  SynEdit1.CommandProcessor(ecDeleteChar, #0, nil);
  SynEdit1.SetFocus;
end;


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

uses
  SynEditKeyCmds;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Удаление от позиции каретки до конца слова (включая пробелы)
  SynEdit1.CommandProcessor(ecDeleteWord, #0, nil);
  // Удаление от позиции каретки до начала слова (включая пробелы)
  SynEdit1.CommandProcessor(ecDeleteLastWord, #0, nil);
  SynEdit1.SetFocus;
end;


Как удалить строку (часть строки)?

uses
  SynEditKeyCmds;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Удаление от позиции каретки до начала строки
  SynEdit1.CommandProcessor(ecDeleteBOL, #0, nil);
  // Удаление от позиции каретки до конца строки
  SynEdit1.CommandProcessor(ecDeleteEOL, #0, nil);
  // Удаление всей строки
  SynEdit1.CommandProcessor(ecDeleteLine, #0, nil);
  SynEdit1.SetFocus;
end;


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

// Способ первый
type
  TSynEditHelper = class helper for TSynEdit
  public
    function GetWordPrefix(XY: TBufferCoord): UnicodeString;
  end;

function TSynEditHelper.GetWordPrefix(XY: TBufferCoord): UnicodeString;
var
  Line: UnicodeString;
  Start, Stop: Integer;
begin
  Result := '';
  if (XY.Line >= 1) and (XY.Line <= Lines.Count) then
  begin
    Line := Lines[XY.Line-1];
    if (Length(Line) > 0) and ((XY.Char >= Low(Line)) and (XY.Char <= High(Line)+1)) and IsIdentChar(Line[XY.Char-1]) then
    begin
      Start := XY.Char;
      while (Start > Low(Line)) and IsIdentChar(Line[Start-1]) do
        Dec(Start);

      Stop := XY.Char;

      Result := Copy(Line, Start, Stop - Start);
    end;
  end;
end;  

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(SynEdit1.GetWordPrefix(SynEdit1.CaretXY));
end;

// Способ второй
type
  TSynEditHelper = class helper for TSynEdit
  public
    function GetWordPrefix(XY: TBufferCoord): UnicodeString;
  end;

function TSynEditHelper.GetWordPrefix(XY: TBufferCoord): UnicodeString;
var
  i: Integer;
  s: UnicodeString;
begin
  Result := '';

  s := LineText;
  i := CaretX-1;
  if i <= Length(s) then
  begin
    while (i > 0) and (s[i] > #32) and not Self.IsWordBreakChar(s[i]) do
      Dec(i);

    Result := Copy(s, i+1, CaretX-i-1);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(SynEdit1.GetWordPrefix(SynEdit1.CaretXY));
end;


Как получить суффикс слова (значение от каретки до конца слова)?

// Способ первый
type
  TSynEditHelper = class helper for TSynEdit
  public
    function GetWordSuffix(XY: TBufferCoord): UnicodeString;
  end;

function TSynEditHelper.GetWordSuffix(XY: TBufferCoord): UnicodeString;
var
  Line: UnicodeString;
  Start, Stop: Integer;
begin
  Result := '';
  if (XY.Line >= 1) and (XY.Line <= Lines.Count) then
  begin
    Line := Lines[XY.Line-1];
    if (Length(Line) > 0) and ((XY.Char >= Low(Line)) and (XY.Char <= High(Line))) and IsIdentChar(Line[XY.Char]) then
    begin
      Start := XY.Char;

      Stop := XY.Char + 1;
      while (Stop <= High(Line)) and IsIdentChar(Line[Stop]) do
        Inc(Stop);

      Result := Copy(Line, Start, Stop - Start);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(SynEdit1.GetWordSuffix(SynEdit1.CaretXY));
end;

// Способ второй
type
  TSynEditHelper = class helper for TSynEdit
  public
    function GetWordSuffix(XY: TBufferCoord): UnicodeString;
  end;

function TSynEditHelper.GetWordSuffix(XY: TBufferCoord): UnicodeString;
var
  s: UnicodeString;
  i: Integer;
begin
  Result := '';

  s := LineText;
  i := CaretX;
  if i <= Length(s) then
  begin
    while (i <= Length(s)) and (s[i] > #32) and not Self.IsWordBreakChar(s[i]) do
      Inc(i);

    Result := Copy(s, CaretX, i+1);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(SynEdit1.GetWordSuffix(SynEdit1.CaretXY));
end;


Как назначить горячие клавиши некоторым функциям редактора?

procedure TForm1.FormCreate(Sender: TObject);
begin
  SynEdit1.AddKey(ecUpperCase, Word('U'), [ssCtrl, ssAlt], 0, []);
  SynEdit1.AddKey(ecLowerCase, Word('L'), [ssCtrl, ssAlt], 0, []);
  SynEdit1.AddKey(ecTitleCase, Word('T'), [ssCtrl, ssAlt], 0, []);
end;


Как вручную открыть помошник кода?

type
  TSynEditHelper = class helper for TSynEdit
  public
    function GetWordPrefix(XY: TBufferCoord): UnicodeString;
  end;
  
  TForm1 = class(TForm)
    SynEdit1: TSynEdit;
    SynCompletionProposal1: TSynCompletionProposal;
    {...}
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  APos: TPoint;
begin
  APos := SynEdit1.ClientToScreen(SynEdit1.RowColumnToPixels(SynEdit1.DisplayXY));
  SynCompletionProposal1.Form.CurrentEditor := SynEdit1;
  SynCompletionProposal1.Execute(SynEdit1.GetWordPrefix(SynEdit1.CaretXY), APos.X, APos.Y + SynEdit1.LineHeight);
end;

function TSynEditHelper.GetWordPrefix(XY: TBufferCoord): UnicodeString;
var
  i: Integer;
  s: UnicodeString;
begin
  Result := '';

  s := LineText;
  i := CaretX-1;
  if i <= Length(s) then
  begin
    while (i > 0) and (s[i] > #32) and not Self.IsWordBreakChar(s[i]) do
      Dec(i);

    Result := Copy(s, i+1, CaretX-i-1);
  end;
end;


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

procedure TForm1.FormCreate(Sender: TObject);
begin
  SynCompletionProposal1.Columns.Add;
  with SynCompletionProposal1.ItemList do
  begin
    Add('constructor \column{}\style{+B}Create\style{-B}(AOwner: TCustomSynEdit)');
    Add('destructor \column{}\style{+B}\style{+I}Destroy\style{-I}\style{-B}');
    Add('\color{$FF0000}function \column{}\style{+B}Add\style{-B}(Item: TSynEditMark): \color{clRed}Integer');
    Add('procedure \column{}\style{+U}ClearLine\style{-U}(line: integer)');
    Add('procedure \column{}\style{+S}Delete(Index: Integer)\style{-S}');
  end;
  SynCompletionProposal1.Options := SynCompletionProposal1.Options + [scoUsePrettyText];
end;


Как вручную вызвать функцию автозавершения кода по нажатию клавиши Tab?

type
  TForm1 = class(TForm)
    SynEdit1: TSynEdit;
    SynAutoComplete1: TSynAutoComplete;
    ApplicationEvents1: TApplicationEvents;
    {...}
  end;

{...}

implementation

{...}

procedure TForm1.FormCreate(Sender: TObject);
begin
  SynAutoComplete1.LoadFromFile('AutoComplete.cfg');
  // Содержимое AutoComplete.cfg примерно следующее:
  // [for | оператор цикла for]
  // for | :=  to  do
  // begin
  // end;
end;

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  case Msg.message of
    WM_KEYDOWN:
      if (ActiveControl = SynEdit1) and (Msg.wParam = VK_TAB) then
      begin
        SynAutoComplete1.Execute(SynEdit1);
        Handled := True;
      end;
  end;
end;


Как узнать для какого языка включена подсветка в данный момент?

uses
  {...,} SynHighlighterMulti;

procedure TForm1.Button1Click(Sender: TObject);

  function GetLangName(AHighlighter: TSynCustomHighlighter): string;
  begin
    if AHighlighter <> nil then
    begin
      if AHighlighter is TSynMultiSyn then
        Result := (AHighlighter as TSynMultiSyn).DefaultLanguageName // LanguageName, GetLanguageName
      else
        Result := AHighlighter.LanguageName; // GetLanguageName
    end
    else
      Result := '';
  end;

begin
  ShowMessage(GetLangName(SynEdit1.Highlighter));
end;

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