为什么不编写“The Delphi of Tomes”编码?

时间:2013-06-05 20:41:34

标签: delphi compilation

我正在尝试使用The Tomes of Delphi中包含的代码中的 TDRecLst TDSplyCm 单位,但我在 TDBasics中遇到编译器错误.PAS

Identifier expected but 'CONST' found

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

Same error as above

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

The code可从作者处获得。

1 个答案:

答案 0 :(得分:13)

你显然使用的是比Delphi 6更新的Delphi版本。尽管在2005年进行了更新,但该书中的代码只能检测到该版本的Delphi。 TDDefine.inc 根据它检测到的版本定义了许多编译器符号,但是当您使用的版本不是它识别的任何符号时,它定义了 no 符号。当编译器遇到 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';

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

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指令。