【问题标题】:How instruct to the Delphi IDE refresh the modified syntax highlight colors using OTA (Open Tools API)?如何指示 Delphi IDE 使用 OTA(Open Tools API)刷新修改后的语法高亮颜色?
【发布时间】:2012-04-12 11:04:19
【问题描述】:

我正在编写一个插件以将Delphi IDE Theme Editor 与 Rad Studio IDE 集成(该工具的当前版本作为外部应用程序运行)到目前为止一切正常(见下图),除了我不知道如何在 Delphi IDE 中刷新选定的语法高亮颜色

让我解释一下,在更改语法高亮颜色的标准选项(编辑器选项->颜色)中,您可以自定义任何元素并分配新的前景色和背景色,然后如果您按下 。 OK . 按钮 IDE 应用更改并且 IDE 编辑器窗口使用新设置进行更新。

目前我可以修改和存储新值,但我无法指示 Delphi IDE 应用新配置,只有重新启动 IDE 才能看到更改。

我搜索了 ToolsAPI 单元,发现了 IOTAEditOptionsIOTAHighlighterIOTAHighlightServices 接口,但似乎没有一个包含刷新(重新加载)修改设置的选项。

我也尝试过 unmangle(使用 tdump)并直接调用 coreide1XX.bpl 文件的函数,但这也不起作用。

00420B94 17411 1F39 Editcolorpage::TEditorColor::
00422188 17400 1F3A __fastcall Editcolorpage::TEditorColor::ColorClick(System::TObject *)
0042174C 17407 1F3B __fastcall Editcolorpage::TEditorColor::ColorSpeedSettingClick(System::TObject *)
004224BC 17396 1F3C __fastcall Editcolorpage::TEditorColor::DefaultClick(System::TObject *)
00422414 17397 1F3D __fastcall Editcolorpage::TEditorColor::EditorColorBroadcast(System::TObject *, Winapi::Messages::TMessage&)
00421584 17409 1F3E __fastcall Editcolorpage::TEditorColor::EditorColorCreate(System::TObject *)
00421730 17408 1F3F __fastcall Editcolorpage::TEditorColor::EditorColorDestroy(System::TObject *)
004217B0 17406 1F40 __fastcall Editcolorpage::TEditorColor::ElementListClick(System::TObject *)
004222E8 17399 1F41 __fastcall Editcolorpage::TEditorColor::FontClick(System::TObject *)
004225DC 17395 1F42 __fastcall Editcolorpage::TEditorColor::HelpClick(System::TObject *)
00421AE8 17404 1F43 __fastcall Editcolorpage::TEditorColor::InitLineFlags(const System::DelphiInterface<Toolsapi::IOTAHighlighterPreview>)
004219B8 17405 1F44 __fastcall Editcolorpage::TEditorColor::InitSamplePane()
00421BC8 17403 1F45 __fastcall Editcolorpage::TEditorColor::InitSyntaxEditView(const System::DelphiInterface<Toolsapi::IOTAHighlighterPreview>)
0042262C 17393 1F46 __fastcall Editcolorpage::TEditorColor::LoadHighlightPreviews()
004225F4 17394 1F47 __fastcall Editcolorpage::TEditorColor::MarkDirty()
004220E4 17401 1F48 __fastcall Editcolorpage::TEditorColor::SampleClick(System::TObject *)
00422080 17402 1F49 __fastcall Editcolorpage::TEditorColor::SetColorSpeedSetting(Vedopts::TColorSpeedSetting)
0042238C 17398 1F4A __fastcall Editcolorpage::TEditorColor::UpdateSamplePane()
00422814 17392 1F4B __fastcall Editcolorpage::TEditorColor::tbsetPreviewsChange(System::TObject *, int, bool&)
004AA8D4 17390 1F4C __fastcall Editcolorpage::initialization()
00423C38 17413 1F4D __fastcall Editdisplaypage::Finalization()

How I can instruct to the Delphi IDE refresh the modified syntax highlight colors using OTA (Open Tools API)?

如果您需要更多信息或问题不清楚,请告诉我。

【问题讨论】:

  • 这是一个很长的镜头,但也许为每个活跃的模块编辑器调用IOTAEditView.Paint
  • 我认为这不会起作用@NGLN,因为据我了解,IDE 仅在初始化时加载颜色设置。我也不相信 OTAPI 中有任何接口可以让您重新初始化这些属性。
  • 更正:当您关闭“环境选项”对话框时,这些设置似乎被重新初始化。作弊可能是让您的插件调出环境选项对话框,并指示用户手动关闭它。不是很优雅,但应该很有效。
  • 如何“修改和存储新值”?
  • @TOndrej,这些值存储在内部缓冲区中,当用户按下OK 按钮时,这些值会刷新到 Windows 注册表 (HKCU\Software\Embarcadero\BDS\9.0\Editor\Highlight) .

标签: delphi delphi-xe delphi-xe2 toolsapi


【解决方案1】:

我想说你最好的办法是窥探coreide*.@Envoptions@TEnvironmentOptions@EditorSourceOptionsBeforeSavecoreide*.@Envoptions@TEnvironmentOptions@EditorSourceOptionsAfterSave

当点击 Ok 按钮时,它们会被调用。我不太擅长阅读程序集,但从外观上看,环境选项是在 IDE 初始化期间从寄存器加载的,所做的任何更改都会根据需要写回,但 IDE 取决于 TEnvironmentOptions 的内存实例所有环境选项的权威表示。

coreide*.@Envoptions@TEnvironmentOptions@GetEdColors 似乎是从环境选项中检索颜色以供 TEditorColor 编辑的位置

很遗憾,这些类都没有暴露给 OTA 或 NTA。

【讨论】:

  • 谢谢,最近几个月我找到了其中的一些方法。我希望不要使用低级黑客。但这似乎是唯一的选择。
【解决方案2】:

一个应该有预期效果的小技巧是让你的插件弹出环境选项对话框,并让操作员手动关闭它。这会导致 IDE 根据提交的设置重新初始化其配置。

为此,获取项目的句柄(IOTAProject 对象)并调用...

AProject.ProjectOptions.EditOptions;

其中AProject 定义为AProject: IOTAProject

我知道这不是最优雅的解决方案,但如果它有预期的效果,至少它有点实用。

【讨论】:

  • Simon,好建议,但如果 IDE 未检测到颜色设置的“原始”控件中的更改,则不会刷新 IDE。 (请记住,我使用自己的控件来设置语法高亮颜色)
  • @Simon,ProjectOptions.EditOptions 打开一个 TDelphiProjectOptionsDialog,但 Environment Options 对话框是一个 TDefaultEnvironmentDialog...我不认为它是同一个野兽。
  • 这取决于您如何保存设置。如果它们在 IDE 保存自己的设置的注册表中,那么更改应该生效(这是我的经验,无论如何)
  • +1 我认为这是一种方法,以某种方式弹出“选项”对话框并让用户单击“确定”以便应用设置或以某种方式调用“应用设置” " 内存中的方法(这有点硬核...)
  • @LaKraven,不,编辑器颜色是在启动 Delphi 时从注册表中读取的,之后不再(不是在打开选项对话框时)。试试这个:启动 Delphi 后,去更改注册表中的默认文本颜色,然后回到 Delphi 弹出选项打开并查看新值没有重新读取。
猜你喜欢
  • 2010-11-07
  • 2012-03-31
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
相关资源
最近更新 更多