8

我正在尝试使用The Tomes of Delphi中包含的代码中的TDRecLstTDSplyCm单元,但在TDBasics.pas中出现编译器错误:

需要标识符,但找到了“CONST”

我在TDStrRes.inc中遇到类似的错误:

与上述相同的错误

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

该代码可从作者处获得。

4

1 回答 1

13

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

implementation

uses
  {$IFDEF Delphi1}
  WinTypes, WinProcs;
  {$ENDIF}
  {$IFDEF Delphi2Plus}
  Windows;
  {$ENDIF}
  {$IFDEF Kylix1Plus}
  Types, Libc;
  {$ENDIF}

{$IFDEF Delphi1}
{$R TDStrRes.r16}
{$ENDIF}
{$IFDEF Delphi2Plus}
{$R TDStrRes.r32}
{$ENDIF}
{$IFDEF Kylix1Plus}
{$R TDStrRes.r32}
{$ENDIF}

const
  UnitName = 'TDBasics';

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

implementation

uses

const
  UnitName = 'TDBasics';

这就是为什么编译器抱怨需要一个标识符而不是const.

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

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

{$IFDEF VER140}
  {$DEFINE Delphi6}
  {$DEFINE Delphi1Plus}
  {$DEFINE Delphi2Plus}
  {$DEFINE Delphi3Plus}
  {$DEFINE Delphi4Plus}
  {$DEFINE Delphi5Plus}
  {$DEFINE Delphi6Plus}
  {$DEFINE HasAssert}
{$ENDIF}

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

于 2013-06-05T22:17:09.967 回答