IDE 编辑器控件有一个方法,IsLineElided
. Elision[*] 是 IDE 的内部术语,表示当它是折叠区域、方法或其他结构的一部分时隐藏的行。在 UI 中,这称为“折叠”,就像在“代码折叠”中一样,但内部术语与呈现给用户的 UI 术语不同是很常见的。
此方法不可公开访问;它是内部 TEditControl 类的方法。要使用它,您需要调用 IDE 方法。与许多 IDE hack 不同,您不需要挂钩它,因为您不需要更改其行为 - 只需调用它即可。
- 乱七八糟的名字:
@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 ...
但是,将它们放在一起查看哪些区域被折叠 - 或者更确切地说,由于任何折叠区域的顶线仍然被绘制,找到一条或多条线被省略的线 - 需要更多的逻辑。最好的方法是在视图中遍历屏幕上的线条,IOTAEditView.TopRow
并且BottomRow
. 如果您正在查看的那一行是折叠的,而您正在查看的那一行不是,那么您正在查看的那一行就是折叠区域的代表线(带有 +/ 的线) - 排水沟中的符号。)
请注意,如果您在代码编辑器上绘制,逻辑行号(打印在代码槽中的行号)和标称行号(视图中屏幕上可见的行)之间的差异对您来说很重要,并且代码省略是控制的这个。代码折叠时,逻辑行号和标称行号不匹配:编辑视图总是按顺序绘制标称行号,但如果中间有折叠区域,则逻辑行号会有间隙。
进一步阅读:一篇关于与代码编辑器集成的大型文章,其中一部分讨论了代码折叠和处理行号。它是关于 Delphi 插件/向导与 Parnassus 博客上的代码编辑器集成的两个主题之一。尽管它涵盖的内容远不止折叠代码,但如果您正在编写需要处理此类内容的 IDE 插件,那么那里有很多有用的材料。(免责声明:我的博客。)
[*]顺便说一句,省略是一个自动反义词:一个有两种相反含义的词(常见的例子是“劈开”。)省略的一个含义是省略或删除,另一个含义是连接或合并。