我们知道Dcu文件的规范是一个秘密,它将在每个版本中更改.有没有可能的方法来探索Delphi IDE中的dcu文件中的符号?(而不是使用反编译库,如DCU32INT项目.)
我想在编辑视图中插入一个区域,然后折叠该区域.
// fEditView: IOTAEditView;
var
writer: IOTAEditWriter;
begin
writer := fEditView.Buffer.CreateUndoableWriter;
//...
writer.Insert('{$REGION ''Documentation''}'#13#10'{$ENDREGION}');
writer := nil; // Flush the buffer
fEditView.Position.GotoLine(lineNo); // go to the line number of the region
fEditView.Paint;
end;
Run Code Online (Sandbox Code Playgroud)
此代码段将在代码编辑器中插入一个区域.但IDE需要一些操作才能在代码编辑器中生成这样的区域.
有没有办法强制IDE执行此操作然后我可以使用
(fEditView as IOTAElideActions).ElideNearestBlock;
Run Code Online (Sandbox Code Playgroud)
折叠吗?
我正在编写一个插件来集成Delphi IDE Theme EditorRad Studio IDE(此工具的当前版本作为外部应用程序运行)到目前为止一切正常(见下图),除了我无法弄清楚的事实如何在Delphi IDE中刷新所选语法高亮颜色

让我解释一下,在标准选项中更改语法高亮颜色(编辑器选项 - >颜色),您可以自定义任何元素并分配新的前景色和背景色,然后如果按下. OK .按钮,IDE将应用更改和IDE编辑器使用新设置更新窗口.
目前我可以修改和存储新值,但我无法指示Delphi IDE应用新配置,只有重新启动IDE才能看到更改.
我搜索ToolsAPI单元,我发现IOTAEditOptions,IOTAHighlighter和IOTAHighlightServices接口,但是没有它似乎包括一个选项,以刷新(重装)经修改的设置.
我也试过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 …Run Code Online (Sandbox Code Playgroud) 我要做的是创建一种查看(不编辑)项目中包含的HTML页面的功能.欢迎页面已经嵌入了Web浏览器,因此它似乎是一个很好的候选者.
Curios为什么?这是一个背景信息的问题.
发生异常时,调试器会给我以下消息:
我可以通过检查来选择忽略异常ignore this exception type.
但是这样做会忽略所有未来项目中的这个异常,这比无用的更糟糕,因为我不想忽略每个项目中的异常; 我只是想在这次运行中忽略它们.
使用ToolsAPI,有一种方法可以:
A - 忽略此运行的异常,或者
B - 忽略仅针对此项目的异常,或
C - 在重新启动Delphi时恢复忽略异常设置?
如果我可以做A,B或C我的问题就解决了.
我知道ignore exception数据存储在:
HKEY_CURRENT_USER\Software\Embarcadero\BDS\17.0\Debugging\Embarcadero Debuggers\Language Exception Classes
我首选的选择是使用ToolsAPI来修复消息框并添加一个ignore this exception for this session only复选框.
但是,如果这不可用,我可以搞乱注册表.
如果我回到注册表,我想强制Delphi重新加载设置,所以我不必重新启动IDE.
为了记录我正在使用西雅图,但我更喜欢这个从2007年开始工作.
我检查了ToolsAPI,但IOTAFileFilterWithCheckEncode看起来不相关,我认为IOTABreakpoint80只适用于用户设置的断点.
我还没有源代码,因为我不确定我想要什么才能使用ToolsAPI,如果不是,我只会回退到使用记录上述注册表项的外部应用程序,启动Delphi并恢复注册表项.我希望有一种更清洁的方式.
我有一个我在Delphi XE中构建的组件,我希望以下列方式使用它:
用户创建一个新的空白项目.
用户在表单上删除我的组件.
我的组件中会执行一些特殊的Designtime代码,这将更改项目选项以取消选中项目选项中的"启用运行时主题"复选框.我不确定这是否可能,所以我问是否可能.
如果#3不可能,那么我需要用这个组件解决我的"可用性"问题; 我遇到的问题是,如果用户不通过取消选中启用运行时主题来禁用静态链接的清单文件,那么链接到EXE的静态生成的清单似乎会覆盖我想要在EXE之外的外部清单文件,磁盘.我还需要在运行时修改这些清单,因此需要外部清单.当然,我可以在需要时使用这些清单启用运行时主题功能.第二个问题是关于外部和内部清单的优先级; 当您选中"启用运行时主题"时,外部清单能否以某种方式优先于链接到Delphi应用程序的内部清单资源?
除#3以外的可接受的解决方案:
A.不知何故导致Delphi无法生成清单.B.不知何故,在运行时,Windows会识别外部.manifest文件并确定其优先级,即使找到内部文件也是如此.
C.最不好的解决方案; 在运行时,在我的组件中的CoCreateInstance失败之后,我可以枚举资源,报告外部清单存在并且弄乱我们,并依赖于使用我的组件的开发人员读取我的组件吐出的运行时错误消息,告诉他们禁用运行时主题复选框并重建他们的应用程序 提取和读取清单已在此处的另一个stackoverflow问题中介绍,其中C++代码可以轻松转换为Delphi.
更新接受的答案完全符合我的要求,但被认为是黑客攻击,大卫关于激活上下文的答案更加明智,是推荐的方法.
Update2内置清单通常在更高版本的Delphi(XE5及更高版本)中通过项目设置明确指定要链接的清单来覆盖.
我为TDataSet编写了Delphi调试可视化工具,以显示当前行的值,源代码+截图:http://delphi.netcode.cz/text/tdataset-debug-visualizer.aspx.工作得很好,但很慢.我做了一些优化(如何获得字段名),但仍然只有20个字段需要10秒才能显示 - 非常糟糕.
主要问题似乎是缓慢IOTAThread90.Evaluate使用如下所示的主代码,这个程序花费大部分时间,与**约80%的时间一致.FExpression是代码中TDataset的名称.
procedure TDataSetViewerFrame.mFillData;
var
iCount: Integer;
I: Integer;
// sw: TStopwatch;
s: string;
begin
// sw := TStopwatch.StartNew;
iCount := StrToIntDef(Evaluate(FExpression+'.Fields.Count'), 0);
for I := 0 to iCount - 1 do
begin
s:= s + Format('%s.Fields[%d].FieldName+'',''+', [FExpression, I]);
// FFields.Add(Evaluate(Format('%s.Fields[%d].FieldName', [FExpression, I])));
FValues.Add(Evaluate(Format('%s.Fields[%d].Value', [FExpression, I]))); //**
end;
if s<> '' then
Delete(s, length(s)-4, 5);
s := Evaluate(s);
s:= Copy(s, 2, Length(s) -2);
FFields.CommaText := s;
{ sw.Stop;
s := sw.Elapsed;
Application.MessageBox(Pchar(s), '');}
end; …Run Code Online (Sandbox Code Playgroud) 我想用INTAIDEINsightService或许AddItem或AddActionList添加到在Delphi的IDE洞察力功能的条目.
根据Delphi OTA wiki, INTAIDEINsightService 允许您注册自己的操作.我能找到的唯一参考就是这里,它提到了API的名称,并且它存在.Delphi中没有任何关于它的帮助.ToolsAPI.pasDelphi XE中的单元在此界面中显示了两个方法,可用于注册操作:
function AddActionList( Actions: TCustomActionList; ... ): Integer;
procedure RemoveActionList(const Index: Integer);
Run Code Online (Sandbox Code Playgroud)
注释说"项目将显示为[描述|]类别| TCustomAction.Caption.不会显示未指定类别的包含操作.".
我无法使用操作找到任何其他文档或示例.一个简单的"hello world"示例,其中一个动作,或者只是一个项目,在描述或类别"helloworld"中注册,然后可以搜索并在您点击F6时显示,这将是完美的,但是动作是首选.
看起来这样的向导必须实现INTAIDEInsightItem才能在IDE洞察中呈现自己,但我不确定这是否是"必需"的hello-world样本.我不确定你是否必须使用动作,或者常规的"项目"添加是否足够.
(我的最终目标是创建一个新的gExperts风格的专家"通过使用IDE洞察力按名称搜索我的库路径中的任何单元"但我会首先将一个项目的名称添加到ide一个项目中.)
我正在编写Delphi插件,我需要在模块(视图 - 调试窗口 - 模块)窗口打开时进行检测(连接到IDE编辑器).我正在使用IOTAEditorNotifier在新的编辑器窗口打开时收到通知,但仅适用于源文件.
这是用于从IDE编辑器接收通知的代码.
uses
Classes, SysUtils, ToolsAPI;
type
TSourceEditorNotifier = class(TNotifierObject, IOTANotifier, IOTAEditorNotifier)
private
FEditor: IOTASourceEditor;
FIndex: Integer;
{ IOTANotifier }
procedure Destroyed;
{ IOTAEditorNotifier }
procedure ViewActivated(const View: IOTAEditView);
procedure ViewNotification(const View: IOTAEditView; Operation: TOperation);
public
constructor Create(AEditor: IOTASourceEditor);
destructor Destroy; override;
end;
TIDENotifier = class(TNotifierObject, IOTANotifier, IOTAIDENotifier)
private
{ IOTAIDENotifier }
procedure FileNotification(NotifyCode: TOTAFileNotification; const FileName: string; var Cancel: Boolean);
procedure BeforeCompile(const Project: IOTAProject; var Cancel: Boolean); overload;
procedure AfterCompile(Succeeded: Boolean); overload;
end;
procedure Register; …Run Code Online (Sandbox Code Playgroud) 我正在编写自己的组件,我希望它"db"在interface使用子句时将其添加到表单中,因为它有一个已发布的事件,如:
TMyDBEvent = procedure(Sender: TObject; DataSet: TDataSet) of object;
Run Code Online (Sandbox Code Playgroud)
TDataSet声明db.pas,我需要手动添加此单位,我想避免.
我见过这个解决方案:
还有这个:
我可以制作一个自定义Delphi组件,将多个单元添加到uses子句中吗?
这个用途RegisterSelectionEditor,但Delphi 5(我知道......)似乎没有这个单元.
我有什么选择?