Delphi 为什么';t代码来自;德尔福大部头;编译?

Delphi 为什么';t代码来自;德尔福大部头;编译?,delphi,compilation,Delphi,Compilation,我试图使用随附代码中的TDRecLst和TDSplyCm单元,但在TDBasics.pas中出现编译器错误: 我在TDStrRes.inc中得到了一个类似的错误: 出了什么问题,我该如何解决 可从作者处获得。您显然使用的是比Delphi 6更新的Delphi版本。尽管在2005年进行了更新,该书中的代码只检测到该版本的Delphi。TDDefine.inc根据检测到的版本定义许多编译器符号,但当您使用的版本无法识别时,它不会定义任何符号。当编译器在TDBasics.pas中遇到这样的代码时,

我试图使用随附代码中的TDRecLst和TDSplyCm单元,但在TDBasics.pas中出现编译器错误:

我在TDStrRes.inc中得到了一个类似的错误:

出了什么问题,我该如何解决


可从作者处获得。

您显然使用的是比Delphi 6更新的Delphi版本。尽管在2005年进行了更新,该书中的代码只检测到该版本的Delphi。TDDefine.inc根据检测到的版本定义许多编译器符号,但当您使用的版本无法识别时,它不会定义任何符号。当编译器在TDBasics.pas中遇到这样的代码时,这最终会导致问题

由于未定义任何
Delphi1
Delphi2Plus
Kylix1Plus
,因此
uses
子句为空。当我们忽略所有编译器指令和非活动代码块时,编译器最终会看到如下代码:

implementation

uses

const
  UnitName = 'TDBasics';
这就是为什么编译器抱怨需要一个标识符而不是
const

要修复它,您需要教TDDefine.inc识别您的Delphi版本。不过,更简单的方法可能是忽略所有版本检测代码,并硬编码所有应用于您正在使用的版本的符号。只要您从未使用任何早于Delphi 6的版本,所有符号都将应用于您的所有版本

在TDDefine.pas中查找以下代码块:


删除第一行和最后一行,以便无条件处理剩余的
$DEFINE
指令。

我认为这个问题很好。海报上写着“无法编译程序,也不明白为什么”。你还需要什么?任何附加信息都可能使可能的回答产生偏差。无论如何,10对1这是一个搜索路径/单位未找到的问题。例如,要编译TDRecList.pas,文件TDBasics.pas和TDDefine.inc必须出现在搜索路径中。Igor,谢谢!我也不明白。。。这里有一个单元(见我帖子上的链接)。我在程序中添加了单位。清楚吗?我无法编译代码。错误:@Igor,你是对的,更多的信息会使回答产生偏差;这会使他们倾向于乐于助人,而不是在黑暗中开枪。这个问题中最基本的缺失信息是错误信息。在上一个问题中,您缺失了单位。这个问题不同吗?你现在下载了所有的源代码单元了吗?@David,我现在很清楚问题是什么:尽管在2005年进行了更新,但代码只准备检测最高为6(VER140)的Delphi版本。当TDDefine.inc没有检测到版本时,其他地方的代码最终会丢失关键部分(如
uses
子句中的单元)。谢谢!为了解决在TDDefine.inc(Delphi7)中添加{$IFDEF VER150}{$DEFINE Delphi7}{$DEFINE Delphi2Plus}{$DEFINE Delphi3Plus}{$DEFINE Delphi4Plus}{$DEFINE Delphi5Plus}{$DEFINE Delphi6Plus}{$DEFINE hassassert}{$ENDIF}的问题,我们应该为Delphi XE或XE4添加什么?谁在乎呢?本书其余的代码从不检查任何其他Delphi版本,那么为什么还要添加一行又一行代码来检测它们呢?如果您确实必须知道,请检查,然后调整代码以使用此处定义的符号,而不是书作者选择的符号。
implementation

uses

const
  UnitName = 'TDBasics';
{$IFDEF VER140}
  {$DEFINE Delphi6}
  {$DEFINE Delphi1Plus}
  {$DEFINE Delphi2Plus}
  {$DEFINE Delphi3Plus}
  {$DEFINE Delphi4Plus}
  {$DEFINE Delphi5Plus}
  {$DEFINE Delphi6Plus}
  {$DEFINE HasAssert}
{$ENDIF}