Delphi XE中控制键 + 单击函数无效

9
在Delphi 7中,每当我按住Ctrl并单击一个函数/过程时,它会带我到该函数/过程。但是在Delphi XE中,这个功能不起作用 - 至少不是对于所有函数。我有一个名为Associate的函数在ExtUtils.pas文件中。 该函数已经正确编译,所以编译器可以找到ExtUtils.pas(当然,ExtUtils已添加到Uses子句中,并且其文件夹已添加到“Library Path”中)。但是当我控制+单击函数或单元名称时,它不会带我到那里。 有没有办法修复这个问题?

更新1: 此外,在当前单元中声明的函数上按Control+Click无法将光标移动到INTERFACE部分,其中函数被声明。

更新2:
我将ExtUtils单元暂时放在项目文件夹中,现在它可以工作了。因此,Control+Click本身是有效的,但似乎IDE在查找单元时存在问题,即使其文件夹存在于库路径和浏览路径中也是如此。

类似报告:
http://webcache.googleusercontent.com
http://webcache.googleusercontent.com
http://cc.embarcadero.com/Item/28269
此处有一份报告(请见下面的答案)


新测试:
我已经完全卸载了Delphi(并手动删除了文件和注册表残留物)。然后重新安装。除了CodeSite之外,没有安装任何其他工具,甚至没有数据库。然后我创建了一个新项目。它包含一个按钮。当我点击按钮时,它会运行在名为TestUnit.Pas的外部PAS文件中定义的TestMe过程。我在库路径和浏览路径中添加了此库的路径。但是,对TestMe过程进行控制+单击仍然无法正常工作!如果我将鼠标悬停在TestMe过程上方,则弹出窗口会显示“在TestUnit中声明”,其中“TestUnit”一词是蓝色链接。如果我单击它,我会听到Windows系统声音,但IDE不会将我带到该单元。

TestMe过程如下:

procedure TestMe;
begin
  Beep(800, 500);
end;

如果我按下control+click Beep过程,它会带我到Windows.pas。所以这个是有效的。 请让我知道如果你有不同的测试想法。
更新:
现在它工作了!没有任何明显的原因!我只是打开、关闭和编译了项目。但我除了这两个之外没有对Delphi进行任何更改:AutoSave选项->编辑器文件和项目选项。
更新:
这不可能!!!
所以,现在我可以在控制+单击TestMe过程时访问TestUnit.pas文件。 所以,我将原始PAS文件(ExtUtils.pas)移动到与TestUnit.pas相同的文件夹中。猜猜怎么着:我可以打开(用control+click)TestUnit.pas但不能打开ExtUtils.pas!!! Delphi表现得如此奇怪和不一致!
更新:
我编辑了ExtUtils.pas,现在我又无法打开TestUnit.pas了。 Ken White不允许我说Delphi可能有漏洞。所以我不能把“bug”和“Delphi”放在一起使用。有人能帮我把这些词组合在一起吗?

更新:
我完全删除了对ExtUtils.pas的任何引用 - 因此我将项目恢复到它工作的那个点(使用TestUnit)。但现在这个错误仍然存在。即使在几秒钟前它与TestUnit一起工作,现在它再次不工作。

更新:
现在我意识到一个重要的事情:在我的源代码(测试项目中)中,我有一行可编译的代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
 TestMe;
end;

这段代码中没有出现蓝色点——因为它没有被编译。在程序运行的几分钟内,我看到了蓝色点。我已经排除了“自动保存选项->编辑器文件和项目选项”可能导致此问题的原因。
更新:
我找到了解决问题的方法……只能维持几分钟:我将项目和库移动到不同的文件夹中(任何位置都可以)。控制+单击将在一段时间内有效。即使我将文件放回原始文件夹中,它也可以工作。因此,Delphi保留了某些文件的缓存。只要缓存被破坏并且它保留了缓存,控制+单击就无法工作。但是当我移动文件时,它必须重新创建该缓存,因此它将在问题重新出现并存储在缓存中之前起作用。

3
请停止发布“什么都不起作用”、“出故障了”和“这是个bug”的帖子。如果这真的是个bug,那么其他人会在其他地方讨论它。既然你似乎是极少数遇到问题的人之一,很可能是你的项目或安装出了问题,而不是一个bug。 - Ken White
3
好的,Ken,你之前也曾这样回答我一些问题,直到实际证明确实存在Delphi的漏洞(其他人复现或有一个指向错误QC页面的链接)。所以也许你应该停止认为Delphi是没有漏洞的。其他用户一直在报告它们。既然我已经花了太多时间来修复一些实际上是漏洞的问题(例如后台编译错误),除非我能找到其他原因,否则我将把这个问题视为漏洞。 - Gabriel
请告诉我StackOverflow是否有针对“后台编译不起作用”或“无法使用Control+单击函数”的特定规则。也许您可以指出它们。 - Gabriel
似乎我最近遇到的另一个问题又是一个错误:http://stackoverflow.com/questions/6251664/how-to-use-aqtime-free-in-delphi-xe。天哪,我又说了“错误”。该死。 - Gabriel
由于你说除了我以外没有人遇到这个问题,我刚刚发布了一些链接到网站,那里有人报告了类似的问题。其中一个是Embarcadero网站上非常类似于我的QC!!! - Gabriel
显示剩余2条评论
10个回答

7

我们是5名使用Delphi 2010的开发人员,其中2名也使用XE,我们遇到了与您一样的Ctrl-click问题。它似乎会随机停止工作。我们从来没有找到过规律或解决方法。所以有时候我们会听到小隔间里传来咒骂声...

当这种情况发生时,我使用shift-ctrl-F进行搜索。

Sylvain


这个问题会自己解决吗?至于那个模式——我今天花了大约4-5小时重新安装Delphi,然后寻找一个模式。正如您在我的原始问题中所看到的,我可以随时修复该问题,但它随后又出现了。 - Gabriel
我发现的一件事(使用Delphi 2010)是问题可能源于单元的源代码。例如,在接口部分缺少;时,如procedure foo x;,CTRL + Click会中断,而foo应该有一个;后缀。问题在于编译器不会抱怨,IDE也不会,但代码洞察引擎无法处理它。我忘记了x确切是什么关键字,但它不是已弃用、虚拟、重载或覆盖。 - Barry Staes
5年后重温,同样的问题,同样的代码库,再次使用Delphi 2010。历史总是在重演。请参考快捷方式解决方案:https://dev59.com/wlfUa4cB1Zd3GeqPM_Uz#22219675 - Barry Staes

3

我正在使用 Delphi 5,Ctrl-click 也存在问题,我不知道它在新的 Delphi IDE 中是否仍然有效,但是我可以使用 CTRL-SHIFT-UpArrow 或 DownArrow 在声明和实现之间切换。 希望这能够帮助你。


不错!这在 Delphi 2010 中有效(其中 CTRL+单击跳转到错误的行)。 - Barry Staes

3

首先,感谢大家提供关于这个问题的提示。也许这是一个很久以前的问题,但最后,经过许多次尝试,我认为问题的原因实际上在于“项目源代码”。

IDE版本:Delphi XE

请尝试:

  1. 在项目选项>> Delphi编译器>>编译中,确保:

    调试信息:true

    符号引用信息:引用信息

  2. 在项目源文件(dpk文件,通过 项目>> 查看源文件 打开)中, 删除 {$REFERENCEINFO OFF} 或改为 {$REFERENCEINFO ON}

请注意,步骤2非常重要,即使完成了步骤1,没有步骤2也无法浏览源代码。


2

在Delphi中,一直存在这两个不同的选项:

  1. 库路径 - 用于编译您的应用程序。

  2. 浏览路径 - 由Code Insight使用,即在使用Ctrl+单击标识符时。

您需要检查第二个选项。它必须包括您尝试使用Ctrl+单击导航的源文件的路径。


我刚在Delphi 7中查看了一下,“浏览路径”中没有自定义路径。它只包含标准的Borland路径 - 全部都以“$(Delphi)”开头。 - Gabriel
我刚刚也将路径添加到“浏览路径”,但仍然不起作用。(我已经重建了项目并重新启动了IDE)。请查看我的原始问题中的Update2。 - Gabriel

1

我刚刚在Delphi 11中创建了一个新的项目组,其中包含两个项目。之后我使用Ctrl + Click跳转到函数时遇到了问题。我右键单击了项目组并选择了“清理所有”,然后选择了“全部构建”,之后它又可以正常工作了。


1
我发现,如果在接口部分使用记录类型且没有通过类型表达式定义,Ctrl-Click和其他跳转功能(Ctrl+Shift+Up/Down)将无法正常工作。
type
  TForm1 = class(TForm)
  ...
  public
    Something:record
                A, B:integer;
              end;
    procedure DoSomething;
  end;

使用上述代码时,我无法使用Ctrl+Shift+Down跳转到过程的实现。我需要使用以下修复方法:

type
  TMyRecord = record
                A, B:integer;
              end;

  TForm1 = class(TForm)
  ...
  public
    Something:TMyRecord;
    procedure DoSomething;
  end;

使用Delphi XE4进行测试。


+1. 这个结构也会禁用方法生成(Ctrl+Shift+C)。另一个消除所有方便导航功能的事情是IFDEF,如果您使用未在同一单元中声明的常量或定义。已在XE2上进行测试。 - Fr0sT

1

供将来参考。我使用Delphi 2010发现在interface部分中在virtual之前加上;会有所不同。

function MyProc(): String;  overload; virtual;
function MyProc(): Integer; overload; virtual;
//                             >>   ^   <<

这个分号;会破坏CTRL+单击(代码洞察力)功能。尽管如此,编译仍然正常。

0

符号参考信息)除非启用了调试信息和本地符号(见上文),否则此选项无效。

仅当将符号参考信息设置为“参考信息”时,代码完成和代码导航功能(Ctrl+单击)才能正常工作。


0

问题已解决!

对我有效,更改代码洞察类型即可。


1
该错误与XE相关。 - Gabriel

0

这种情况在我经常发生,尤其是当两个集成开发环境同时打开时。

我发现解决的方法是:

  1. 清理你的项目。
  2. 列表项
  3. 关闭IDE。
  4. 使用Windows资源管理器,导航到你的项目。
  5. 搜索*.dcu并删除所有的.dcu文件。
  6. 启动IDE并加载你的项目。
  7. 编译它。

此时,代码导航(Ctrl+点击)应该可以正常工作了。


那是很久以前的事了。现在我使用的是 Delphi 10.4。 - Gabriel

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