【问题标题】:SynMultiSyn Highlighter Caret PositionSynMultiSyn 荧光笔插入符号位置
【发布时间】:2013-09-23 22:48:20
【问题描述】:

我有 SynMultiSyn 荧光笔 (synHTMLcomplex) 由 HTML (synHTML) 和 JavaScript (synJScript) 组成 如下:

synHTML       : TSynHTMLSyn;
synJScript    : TSynJScriptSyn;
synHTMLcomplex: TSynMultiSyn;

// HTML complex
with SynHTMLcomplex do begin
  DefaultLanguageName:= 'HTML complex';
  DefaultFilter      := 'HTML complex (*.html; *.htm)|*.html; *.htm';
  DefaultHighlighter := synHTML;
  with Schemes do begin
    Add.Index:= 0;
    with Items[0] do begin
      Highlighter:= synJScript;
      SchemeName := 'JavaScript';
      StartExpr  := '<script';
      EndExpr    := '</script>';
      with MarkerAttri do
        Background:= clNone;
    end;
  end;
end;

在 SynEdit 的实例中,是否有任何方法(属性或方法)可以知道光标 (CaretY) 是哪个荧光笔(synHTML 或 synJScript)?

有人可以帮忙吗?

【问题讨论】:

  • 我以前使用过这个组件,但很久以前,我现在不在我的 IDE 中,但我确定答案是肯定的,只是不确定具体如何。跨度>

标签: delphi synedit


【解决方案1】:

这是可能的,但不是很容易实现。

下面的函数改编自 Jan Fiala(PSPad editor 的作者)使用的函数。 对我来说,它工作正常。非常感谢 Jan!

function TfrmEditor.GetCurrentHighLighter: TSynCustomHighlighter;
var
  i       : integer;
  seEditor: TSynEdit;

begin
  if (sActiveEditor = 'synEditor') then seEditor:= synEditor
                                   else seEditor:= synEditor2;

  with seEditor do
    if Highlighter is TSynMultiSyn then
    begin
      i:= (Integer(TSynEditStringList(Lines).Ranges[CaretY - 1]) and $F) - 1;

      if (i < 0) then
        result:= TSynMultiSyn(Highlighter).DefaultHighLighter
      else
        result:= TSynMultiSyn(Highlighter).Schemes[i].Highlighter
    end
    else
      result:= Highlighter;
end;

Jan的原函数如下,尽快解释。

" - 这是我返回当前荧光笔的函数:

function TPSSynEdit.GetCurrentHighLighter: TSynCustomHighlighter;
var
  i: Integer;
begin
  if Highlighter is TSynMultiSyn then
  begin
    i := (Integer(TSynEditStringList(Lines).Ranges[CaretY - 1]) and $F) - 2;
    if (i > TSynMultiSyn(HighLighter).Schemes.Count - 1) or (i < 0) then
      Result := TSynMultiSyn(Highlighter).DefaultHighLighter
    else
      Result := TSynMultiSyn(Highlighter).Schemes[i].Highlighter
  end
  else
    Result := Highlighter;
end;

我在 TSynedit 的后代中有这个功能。您需要更换荧光笔,例如使用 Editor.Highlighter 和带有 Editor.Lines 的 Lines 或将编辑器作为函数参数发送并在开始后添加如下内容: 用编辑器做 开始 ……”

简菲亚拉

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多