Delphi - E2003未声明的标识符问题

3
我是一个有用的助手,可以进行文本翻译。

我在 Delphi XE2 IDE 中遇到了一个非常奇怪的问题。

在一个包中,我声明了以下类:

TCommandInfo = class
    private
        fParameters : TCommandParameters;
        // other fields...
    public
        property Parameters : TCommandParameters read fParameters;
        // other properties...
end;

TReceiveCommand = class(TCommand)
    // other fields and properties
    private
        fInfo : TCommandInfo;

    public
        property Info : TCommandInfo read fInfo;

end;


TReceiveErrorCommand = class(TReceiveCommand);

TReceiveDataCommand = class(TReceiveCommand)
    // procedures and properties defined, etc.
end; 

现在,在一个完全不同的包中,该包依赖于上面的包,我有这个成员函数:
procedure DoDataCommand;
var
    cmd : TReceiveDataCommand;
    success : Boolean;
    params : TCommandParameters;
begin
    cmd := TReceiveDataCommand.Create;
    success := cmd.Initialize;

    if success then begin
        // #### ERROR HERE ####
        params := cmd.Info.Parameters;
    end;
end;

我看到的是,当尝试编译依赖包时,出现E2003错误,指出“未声明的标识符:'Info'”,并且当我CTRL+CLICK TReceiveDataCommand以查找该声明时,IDE跳转到包含文件中不同的位置。
我在工作机器上运行了完全相同的代码,并且没有失败。我想知道是否有一些潜伏的BPL存在,但我已经进行了彻底清理。
当尝试跳转到TReceiveDataCommand类源时,IDE将我带到错误的位置,这似乎很奇怪。
请问有什么建议吗?

我猜你正在使用一个过时的dcp文件。 - David Heffernan
我已经进行了大约5次的清理/全盘清理,但没有任何改变。 - weblar83
你使用的是哪个版本的Delphi?我现在已经折腾了几个小时,只有一次成功地复制了你的问题。那是在Delphi XE8上,IDE报告说类中没有字段,即使代码提示在类构造函数中提供了它。所以我甚至无法首先编译代码。当我将该代码从Delphi XE3复制到时,它可以编译而没有问题。当我将该代码从Delphi XE3复制到Delphi XE8的新项目中时,它也可以编译并且没有任何问题。... - SilverWarior
所以我猜测代码编辑器可能有问题,导致它向编译器发送了错误的代码。但是我之前从未遇到过这样的情况,尽管我经常使用自定义类。 - SilverWarior
2个回答

1

TReceiveCommand 类型在不同的包中定义。编译器使用 .dcp 文件来解析该不同包中的名称。如果未能识别 Info,则显然编译器找到的 .dcp 文件与问题中的源代码不匹配。

逻辑结论是编译器找到了一个过时的 .dcp 文件。


当包出现在BPL需要列表中时,编译错误会发生。当我从BPL需要列表中删除该包时,我就不会得到编译错误 - 没有其他变化。如果我通过执行这个单一的操作错过了什么,我就不知道是什么了。 - weblar83
你一直在谈论bpl文件,但它们绝对不是问题所在。你不愿意考虑问题可能出在dcp文件上。我认为我回答了你的问题。但你显然不同意,因为你没有接受我的答案。 - David Heffernan
也许问题不在于我的答案有误,而是你还没有理解我的意思?包的接口由编译器生成的dcp文件描述,而描述“TReceiveDataCommand”的任何dcp文件都明显与问题中的代码不匹配。 - David Heffernan
好的,我同意。因此,如果编译器从包含所有正确定义的相同源代码生成接口文件,为什么会出现这个问题呢?(请耐心等待),这让我想起了我的“requires”解决方案——似乎编译器正在使用这个需求清单来生成接口DCP文件。您不会同意吗? - weblar83
requires 告诉编译器引用哪些包。在编译时,它会引用该包的 dcp 文件。 - David Heffernan
显示剩余14条评论

0

我曾经在从 Xe6 迁移到 xe7 时遇到过这种情况。它同时链接了 xe6xe7 的内容。因为项目转换/迁移没有完成它的工作。我会检查 dproj 文件中的路径。

现在问一个非常明显的问题 - 你重新构建了吗?


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