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 つの意味は省略または除去であり、別の意味は結合または結合です。