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

tbu*_*ton 8 delphi compilation

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

预期的标识符,但找到'CONST'

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

与上面相同的错误

怎么了,怎么解决?

代码可从作者处获得.

Rob*_*edy 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';
Run Code Online (Sandbox Code Playgroud)

由于该子句都不是Delphi1,Delphi2Plus或者Kylix1Plus是定义的,因此该uses子句是空的.当我们忽略所有编译器指令和非活动代码块时,编译器最终会看到如下代码:

implementation

uses

const
  UnitName = 'TDBasics';
Run Code Online (Sandbox Code Playgroud)

这就是为什么编译器抱怨期望标识符而不是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}
Run Code Online (Sandbox Code Playgroud)

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