问题标签 [toolsapi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
110 浏览

delphi - 如何在 IDE 中跟踪编辑器修改和行位置更改?

我正在编写一个跟踪特定行的 IDE 插件 - 认为它类似于 IDE 的内置书签功能。当用户编辑源代码时,特定行的位置会发生变化 - 例如,当在其上方某处按下 Enter 时,可能已经是第 100 行的第 101 行变为第 101 行。用户还可以删除行、一次选择和删除多个块、粘贴大块文本等,所有这些都会改变代码。

我想跟踪行插入和删除,以便知道“第 100 行”变成“第 101 行”,然后是“第 102 行”,依此类推。这怎么可能?


到目前为止,我发现的最接近的解决方案是使用INTAEditServicesNotifier.EditorViewModified它可以在每次进行修改时访问整个缓冲区。然后可以将整个缓冲区与前一个缓冲区的存储副本进行比较,以查看有哪些更改,并查看添加或删除了多少换行符以及在何处添加或删除。

每次编辑器修改都会产生巨大的开销,并且必须有更好的方法。

0 投票
1 回答
422 浏览

delphi - 如何在代码编辑器中跟踪代码折叠?

我正在编写一个标记特定行的插件,并将尝试在代码编辑器上为特定行绘制一个突出显示标记。为此,我需要计算特定代码行在屏幕上的位置,即缓冲区中的行。

IOTAEditViewDelphi 代码编辑器可以通过'sBottomRowTopRow属性访问哪些行在屏幕上可见。然而,在较新的 IDE 版本中,代码区域和方法可以折叠——也就是说,多行合并为一行。线条高光绘制的第一步是知道哪些线条可见以及它们的位置,为此我可能需要跟踪编辑器的哪些部分折叠,哪些不折叠。似乎有 OTAPI 方法可以调用代码折叠(省略),但不知道它何时发生。

但是,某些插件(例如 Castalia)确实可以管理此问题。怎么做到呢?

0 投票
1 回答
173 浏览

delphi - 为什么 `as` 运算符可能会抛出讨厌的 EAccessViolation 而不是正常的 EIntfCastError?

我制作了高度实验性且不稳定的 IDE 插件,这会在 IDE 关闭时导致非常讨厌的 A/V(破坏了最近的项目功能,grr!)。我最终将其缩小到特定的析构函数:

A/V 异常发生在read of address 0x00000008.

我为有问题的陈述添加了更多防御措施:

...并弄清楚(1)指针仍然没有nil(2)QueryInterface仍然有效(3)所需的接口不再存在。鉴于一切看起来都很正常,我希望友好EIntfCastError。但是为什么我有 A/V 呢?

0 投票
1 回答
761 浏览

delphi - 如何检测模块窗口何时在 Delphi IDE 中打开?

我正在编写一个 Delphi 插件,我需要检测模块(查看 - 调试窗口 - 模块)窗口何时打开(附加到 IDE 编辑器)。我正在使用 IOTAEditorNotifier 在新的编辑器窗口打开时收到通知,但仅适用于源文件。

这是用于从 IDE 编辑器接收通知的代码。

如何检测在 Delphi IDE 编辑器中打开的模块窗口?

0 投票
2 回答
11681 浏览

delphi - 如何在 Delphi IDE 状态栏上编写和显示内容

我想知道如何编写一个模块来在 Borland Delphi 7 IDE 状态栏上显示时钟或其他东西,因为我知道这是可能的,但我找不到如何!

0 投票
1 回答
445 浏览

delphi - 如何在 Delphi 调用堆栈窗口中隐藏“非用户”堆栈帧?

是否可以在 Delphi 调用堆栈中隐藏/折叠没有源代码并且相应地没有用这些蓝点标记的堆栈帧?

仅供参考,Visual Studio 能够做到这一点:

在托管代码中,默认情况下。调用堆栈窗口隐藏了非用户代码的信息。出现以下符号而不是隐藏信息:

[<外部代码>]

http://msdn.microsoft.com/en-us/library/a3694ts5.aspx

如果解决方案适用于 Delphi XE2,那就太好了。

更新

它可以是一些 3rd-party 专家,甚至是使用 ToolsAPI 的代码

0 投票
0 回答
338 浏览

delphi - 在 Delphi IDE 中持续存在可停靠表单布局的问题

我为 Delphi 编写了一个小的 IDE 扩展。我的表单来自 TDockableToolbarForm。我已经弄清楚如何让 IDE 将表单的位置保存在 .dst 和 .dsk 文件中。

表单的注册如下所示:

我在表单中添加了以下 OnCreate 处理程序:

这导致以下内容被写入 dst/dsk 文件:

这允许表单的布局在 IDE 的一次运行和下一次运行之间保持不变。但是我有两个问题:

  1. 当包第一次注册到 IDE 时,我希望表单默认停靠在左侧(假设用户没有使用“经典未停靠”布局)。现在它只是显示取消停靠的表单。
  2. 当软件包被卸载/重新安装时,表单不使用以前保存的布局设置。它再次显示为未停靠。

我怀疑这两个问题都是由于错过了一步,但我不知道那一步是什么。

对于我发现的第一个问题TControl.ManualDock,在有关对接的讨论中经常提到,但它总是与您可以访问源代码的应用程序有关。我不知道如何从 IDE 中检索必要的参数来调用它。

对于第二个问题,我唯一确定的是,卸载软件包后 dst 文件中的设置仍然存在,所以我认为使用现有设置重新安装软件包会很简单,但这似乎不是案子。

0 投票
1 回答
317 浏览

forms - 如何关闭(在代码中)IDE 已打开的表单,而不关闭其关联的 .Pas 文件

下面的代码是我在 D7 的设计时 .BPL 中所做的简化的。

更新:自从发布此消息以来,我找到了一种方法来做我所追求的,即只需向表单发送 WM_Close 消息,但我仍然有兴趣知道是否有更“官方”的方式来做到这一点,因为使用 WM_Close 似乎有可能使 IDE 出错。

我在这段代码中试图做的所有导致我出现问题的事情是关闭在 IDE 中打开的所有文件,然后打开一个特定的 .Pas 文件,该文件恰好有一个关联的 .Dfm 文件。我不希望 .Dfm 中定义的表单在屏幕上打开,所以我试图关闭它,而不关闭 .Pas 文件 - 我只想要 IDE 表单设计器和这个表单.

最终,我发现了如何在我的 .BPL 代码中通过 OTA + NTA 服务获取表单,并且天真地但因为想要任何其他明显的方式来做到这一点,我尝试通过这个片段调用 .Close 。

但是,窗体不会关闭。我已经从 CPU 窗口追踪到 TCustomForm.Close,显然它没有关闭的原因是它的 Visible 属性已经是 False。这也是在 AForm.Close 返回之前评估 Visible 的内容。

在 AForm.Close 之前评估它的其他各种属性告诉我 - 它的所有者是 Nil 但是 - 它有一个明显有效的窗口句柄 // Arrghh![一分钱下降的声音......见上面的更新]

我敢说这与 IDE 的表单设计器的工作方式有关。

我的问题很简单:我需要在代码中做什么才能关闭表单,就像我只需单击其框架上的 [x] 按钮时所做的那样?

顺便说一句,我已经确认我通过 AForm := [...] 获得的表单实例是屏幕上的实例,方法是在 OI 中更改屏幕上实例的标题。

0 投票
1 回答
443 浏览

delphi - 格式化源代码时如何保留代码折叠

另请参阅此问题:如何在调用代码格式化程序时避免扩展折叠区域?

这不是骗人的,因为我有兴趣使用 ToolsApi 解决问题。

当我按CTRL+D时,代码格式很好(大部分)
但是我所有折叠的代码部分都展开了。
有没有办法让这些部分保持折叠。

如果没有,是否可以在格式化之前保存代码折叠信息,以便稍后恢复?
我正在考虑使用 Open Tools api 编写 IDE-addin。
我使用的是 XE7,但这个问题存在于所有具有源格式的版本中。

可能的情况涉及:

  • 记录和重放代码折叠(挂钩elide调用)。
  • 仅允许格式化对当前块起作用(重新定义CTRL+D操作)。
0 投票
1 回答
509 浏览

c++ - 在 Embarcadero Tools API 中的光标位置插入文本

我正在为 Embarcadero C++ Builder IDE 编写扩展,并希望以编程方式在代码编辑器中的光标位置插入文本。我搜索了工具 API 头文件,但只找到了一个允许我在编辑器开头插入文本的界面。

是否有任何界面或功能可以让我在指定位置插入文本?如果是这样,你能给我一个代码示例吗?

我正在用 C++ 编写扩展,但 Delphi 中的代码示例也可以。