如何使用OTA(Open Tools API)指导Delphi IDE刷新修改后的语法突出显示颜色?

12
我正在编写一个插件,将 Delphi IDE Theme Editor 与 Rad Studio IDE 集成(该工具的当前版本作为外部应用程序运行),目前一切正常(请参见下面的图片),除了我无法弄清楚如何刷新 Delphi IDE 中所选的语法高亮颜色。

enter image description here

让我解释一下,在标准选项中更改语法高亮颜色(编辑器选项 -> 颜色),您可以自定义任何元素并分配新的前景和背景颜色,然后如果按下 . OK . 按钮,IDE 将应用更改,并使用新设置更新 IDE 编辑器窗口。
目前,我可以修改和存储新值,但我无法指示 Delphi IDE 应用新配置,只有在重新启动 IDE 时才能看到更改内容。
我搜索了 ToolsAPI 单元,并找到了 IOTAEditOptions、IOTAHighlighter 和 IOTAHighlightServices 接口,但似乎都没有包括刷新(重新加载)已修改设置的选项。
此外,我尝试了反混淆(使用 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()

我可以通过OTA(Open Tools API)指示Delphi IDE刷新修改后的语法高亮颜色吗?
如果需要更多信息或问题不清楚,请告诉我。

这可能是一个冒险的尝试,但也许可以为每个活动模块编辑器调用 IOTAEditView.Paint 方法? - NGLN
我认为这不会起作用@NGLN,因为据我所知,IDE仅在初始化时加载颜色设置。我还不相信OTAPI中有任何接口允许您重新初始化这些属性。 - LaKraven
更正:当您关闭“环境选项”对话框时,这些设置似乎会被重新初始化。一个小技巧是让您的插件弹出“环境选项”对话框,并指示用户手动关闭它。虽然不是非常优雅,但应该是有效的。 - LaKraven
1
你如何“修改并存储新值”? - Ondrej Kelle
@RRUZ 你如何修改IDE内部缓冲区中的值?或者你是指你自己的内部缓冲区? - Ondrej Kelle
显示剩余5条评论
2个回答

2
一个简单的技巧可以达到期望的效果,即让插件弹出“环境选项”对话框,并让操作员手动关闭它。这将导致IDE根据提交的设置重新初始化其配置。
要实现此目的,请获取项目的句柄(IOTAProject对象),并调用... AProject.ProjectOptions.EditOptions; 其中AProject定义为AProject: IOTAProject
我知道这不是最优雅的解决方案,但如果它能产生期望的效果,至少它还算实用。

Simon,你的建议很好,但是如果IDE没有检测到颜色设置中“原始”控件的更改,它就不会刷新IDE。(请记住,我正在使用自己的控件来设置语法高亮颜色) - RRUZ
@Simon,ProjectOptions.EditOptions打开了一个TDelphiProjectOptionsDialog,但是环境选项对话框是一个TDefaultEnvironmentDialog... 我认为它们不是同一种东西。 - Francesca
这取决于你如何保存设置。如果它们在注册表中,那么IDE保存自己的设置,那么更改应该会生效(至少我的经验是这样的)。 - LaKraven
+1 我认为这是一种方法,可以弹出“选项”对话框,让用户单击“确定”,以便应用设置,或者在内存中调用“应用设置”方法(这有点高级...) - user497849
1
@LaKraven,不是的,编辑器颜色在启动Delphi时从注册表中读取,之后就不再读取(不是在打开选项对话框时)。试试这个:启动Delphi后,去更改注册表中的默认文本颜色,然后回到Delphi弹出选项并查看新值没有被重新读取。 - Francesca

2
我建议您最好查看coreide*.@Envoptions@TEnvironmentOptions@EditorSourceOptionsBeforeSavecoreide*.@Envoptions@TEnvironmentOptions@EditorSourceOptionsAfterSave。当单击“确定”按钮时,这些选项会被调用。我不太擅长阅读汇编代码,但从外观上看,在IDE初始化期间从注册表中加载环境选项,并根据需要将所做的任何更改写回,但IDE依赖于TEnvironmentOptions的内存实例,以成为所有环境选项的权威表示。 coreide*.@Envoptions@TEnvironmentOptions@GetEdColors似乎是从环境选项中检索颜色以供TEditorColor编辑的地方。
不幸的是,这些类都没有暴露给OTA或NTA。

1
谢谢,我在过去几个月中找到了一些这些方法。我希望不必使用低级别的黑客技巧,但似乎这是唯一的选择。 - RRUZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接