gpt4 book ai didi

delphi - 获取对 Delphi IDE 内对象的引用

转载 作者:行者123 更新时间:2023-12-03 15:02:37 26 4
gpt4 key购买 nike

这是我对此问题的回答:

Can I change the display format for strings in the watch list?

事实证明,在 D7 和 XE3 之间的某个时刻,IDE 的监 window 口的实现从使用 TListView 更改为 TVirtualStringTree。

虽然我通过忽略 VST 并从剪贴板获取 watch 值来发布了与 XE4 一起使用的答案的更新,但如果可以的话,我仍然希望能够从 VST 获取 watch 值。我想我知道该怎么做一旦我引用了 VST,但问题是我尝试获取 VST 失败了。

以下是我在自定义包中使用的代码的 MCVE。希望它的作用是不言自明的。问题是 block 中的代码

  if WatchWindow.Components[i] is TVirtualStringTree then begin
[...]
end;

永远不会执行,尽管类名“TVirtualStringTree”出现在 Memo1 中。显然,具有该类名的组件未通过“is”测试。我猜测原因是编译到 IDE 中的 TVirtualTreeView 与我正在使用的版本不同,v.5.3.0,这是我能找到的最接近 XE4 的前身。

所以,我的问题是,这是可能的解释吗?我能对此做些什么吗?我怀疑如果有人能够从帽子上开发用于 XE4 的 TVirtualStringTree 版本,那可能会解决我的问题。

type
TOtaMenuForm = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
WatchWindow : TForm;
VST : TVirtualStringTree;
end;

procedure TOtaMenuForm.FormCreate(Sender: TObject);
var
i : Integer;
S : String;
begin

WatchWindow := Nil;
VST := Nil;

// Iterate the IDE's forms to find the Watch Window
for i := 0 to Screen.FormCount - 1 do begin
S := Screen.Forms[i].Name;
if CompareText(S, 'WatchWindow') = 0 then begin
WatchWindow := Screen.Forms[i];
Break;
end;
end;

Assert(WatchWindow <> Nil);

if WatchWindow <> Nil then begin
Memo1.Lines.Add('Looking for VST');
for i := 0 to WatchWindow.ComponentCount - 1 do begin
Memo1.Lines.Add(IntToStr(i) + ':' + WatchWindow.Components[i].ClassName);
if WatchWindow.Components[i] is TVirtualStringTree then begin
VST := TVirtualStringTree(WatchWindow.Components[i]);
Memo1.Lines.Add('found VST');
Break;
end;
end;
if VST = Nil then
Memo1.Lines.Add('VST not found');
end;
end;

顺便说一句,我意识到依赖于 IDE 实现细节的解决方案可能很脆弱,但这只是为了娱乐(我喜欢从组件中获取字符串数据的挑战,该组件会不遗余力地避免存储任何)。

最佳答案

也许您可以尝试通过 RTTI 方法仅使用嵌入到 IDE TVirtualStringTree 实现中的已发布属性来执行您想要的操作?

关于delphi - 获取对 Delphi IDE 内对象的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33176908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com