我正在尝试使用 The Tomes of Delphi 中包含的代码中的 TDRecLst 和 TDSplyCm 单位,但我在 TDBasics.pas 中收到编译器错误:
我在TDStrRes.inc中遇到类似的错误:
出了什么问题,如何解决?
The code可从作者处获取。
最佳答案
显然,您使用的 Delphi 版本比 Delphi 6 更新。尽管在 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
或 Kylix1Plus
均未定义,因此 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
指令。
关于delphi - 为什么 "The Tomes of Delphi"处的代码无法编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16949486/