5

以下のような HTML (synHTML) と JavaScript (synJScript) で構成される SynMultiSyn ハイライター (synHTMLcomplex) があります。

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) であるかを知る方法 (プロパティまたはメソッド) はありますか?

誰でも助けてくれますか?

4

1 に答える 1

0

それは可能ですが、達成するのはそれほど簡単ではありません。

以下の関数は、Jan Fiala ( PSPad エディターの作成者) によって使用された関数の適応です。私にとってはうまくいっています。どうもありがとうジャン!

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 に、Lines を Editor.Lines に置き換えるか、エディターを関数パラメーターとして送信し、begin の後に次のようなものを追加する必要があります: with Editor do begin ..."

ヤン・フィアラ

于 2013-09-21T21:27:32.790 に答える