3

特定の行をマークするプラグインを作成しており、コード エディターで特定の行のハイライト マーカーをペイントしようとしています。これを行うには、特定のコード行、つまりバッファー内の行の画面上の位置を計算する必要があります。

Delphi コード エディタは、 およびプロパティIOTAEditViewを介して、画面上に表示される行にアクセスできます。ただし、新しい IDE バージョンでは、コード領域とメソッドを折りたたむことができます。つまり、複数の行を 1 つに折りたたむことができます。行ハイライト ペインティングの最初のステップは、どの行が表示され、どこにあるかを知ることです。これを行うには、エディターのどの部分が折りたたまれていて、どの部分が折りたたまれていないかを追跡する必要がある場合があります。コードの折りたたみ (省略) を呼び出す OTAPI メソッドがあるようですが、それがいつ発生するかはわかりません。BottomRowTopRow

ただし、Castalia などの一部のプラグインはこれを管理します。どうすればそれができますか?

4

1 に答える 1

4

IDE エディター コントロールには、メソッドがありIsLineElidedます。Elision[*] は、折りたたまれた領域、メソッド、またはその他の構造の一部である場合に非表示になる行を表す IDE の内部用語です。UI では、これは「コードの折り畳み」のように「折り畳み」と呼ばれますが、ユーザーに提示される UI 用語とは異なる何かの内部用語が非常に一般的です。

このメソッドは公開されていません。これは内部 TEditControl クラスのメソッドです。これを使用するには、IDE メソッドを呼び出す必要があります。多くの IDE ハックとは異なり、その動作を変更する必要がないため、フックする必要はありません。呼び出すだけです。

  • マングル名:@Editorcontrol@TCustomEditControl@LineIsElided$qqri
  • メソッドのプロトタイプを使用:TLineIsElidedProc = function(Self: TObject; LineNum: Integer): Boolean;
  • coreide*.bpl ファイルにあります。

例えば、

PFLineIsElided := GetProcAddress(CoreIDEHandle, StrIDELineIsElidedName);

ロードされたモジュールを読み取ることで、コア IDE BPL ハンドルを取得できます。最初のパラメーターはエディター ウィンドウにする必要があります。ToolsAPI 編集ビューではなく、内部エディターです。この記事では、エディター コントロールと IOTAEditView の関係を示します。

次のように、プラグインから行が省略されているかどうか (つまり、隠されているかどうか) を尋ねることができるようになりました。

if PFLineIsElided(FCodeEditor, 123) then ...

ただし、それをまとめて、どの領域が折り畳まれているかを確認するには、つまり、折り畳まれた領域の一番上の行がまだ描画されているため、1 つまたは複数の行が省略されている行を見つけるには、もう少しロジックが必要です。最良の方法は、ビュー内の画面上の行を反復処理することIOTAEditView.TopRowですBottomRow。見ている線の次の線が折れていて、今見ている線が折れていない場合、見ている線が折れた部分の代表線(+/ - ガターのシンボル。)

コード エディターでペイントする場合は、論理的な行番号 (コード ガターに出力される行番号) と公称行番号 (ビューで画面上に表示される行) の違いが重要になることに注意してください。これ。コードが折り畳まれると、論理行番号と公称行番号は一致しません。編集ビューは常に公称行番号を順番に描画しますが、途中で折り畳まれた領域がある場合、論理行番号にギャップが生じます。

参考資料:コード エディターとの統合に関する大きな記事。その1 つのセクションでは、コードの折りたたみと行番号の処理について説明しています。これは、Parnassus ブログのコード エディタと統合する Delphi プラグイン/ウィザードのトピックに関する 2 つのトピックのうちの 1 つです。折りたたまれたコードよりもはるかに多くのことをカバーしていますが、この種のものを処理する必要がある IDE プラグインを作成している場合、役立つ資料がたくさんあります。(免責事項:私のブログ。)

[*] 余談ですが、省略は自己反意語です: 反対の 2 つの意味を持つ単語です (一般的な例は「切断」です)。省略の 1 つの意味は省略または除去であり、別の意味は結合または結合です。

于 2014-12-27T16:27:29.837 に答える