【问题标题】:How use Procedure with Record using Delphi 7?Delphi 7如何使用Procedure with Record?
【发布时间】:2018-04-17 12:40:46
【问题描述】:

如果这段代码有什么问题,我只想在记录里面放一个程序:

unit unTEFTipos;

interface

type

  TTEFPagamento = record
    AcrescimoDesconto: Double;
    TrocoSaque: Double;
    procedure Clear;
  end;

implementation

procedure TTEFPagamento.Clear;
begin
  AcrescimoDesconto := 0;
  TrocoSaque := 0;
end;

end.

但 Delphi 7 IDE 返回此错误:

 Build

 [Error] unTEFTipos.pas(10): 'END' expected but 'PROCEDURE' found  
 [Error] unTEFTipos.pas(11): 'IMPLEMENTATION' expected but ';' found  
 [Error] unTEFTipos.pas(13): '.' expected but 'IMPLEMENTATION' found  
 [Error] unTEFTipos.pas(10): Unsatisfied forward or external declaration: 'Clear'  
 [Fatal Error] GP.dpr(486): Could not compile used unit 'TEF\unTEFTipos.pas'

【问题讨论】:

  • Delphi 7 不允许记录方法,这种语法是在 D2006 中引入的。
  • 虽然我在编辑后投票决定重新打开,但指出this question 可能是合适的,这就是答案。简而言之,您正在尝试使用 D7 中不存在的语言功能。如果您希望能够使用现代功能,请升级到现代版本的 Delphi。在 D7 中做你想做的唯一方法是使用类而不是记录。
  • 在旧版本的 Delphi 中,如果要添加方法,则必须使用 object 而不是 record

标签: delphi record procedure


【解决方案1】:

在旧版本的 Delphi 中,如果要添加方法,则必须使用 object 而不是 record

 TTEFPagamento = object
    AcrescimoDesconto: Double;
    TrocoSaque: Double;
    procedure Clear;
  end;

它也将与较新的版本兼容,即使您在初始化其中的托管变量时可能会遇到一些问题。

所以我最终写了这样的东西:

 TTEFPagamento = {$ifdef UNICODE}record{$else}object{$endif}
    AcrescimoDesconto: Double;
    TrocoSaque: Double;
    procedure Clear;
  end;

在所有版本上都可以编译,并且行为相同。

【讨论】:

  • 最好包含引入高级记录功能的特定版本 (D2006)。 Unicode 是一个糟糕的选择器,因为在 D2006 和 D2007 中都提供了高级记录支持,这两个都是非 Unicode 版本。讨论 objectrecord 的赋值语义也很好。
  • @J... 这不是重点。这不是关于语法特性,而是关于编译器错误/回归。 Unicode 是我们需要规避的错误/回归的一个很好的选择器 - 请参阅 blog.synopse.info/post/2011/01/29/… AFAICT 这个错误从未得到修复,因为 Embarcadero 说 object 已被弃用。这可能是从他们的角度来看,但对于维护与最旧版本的 Delphi 兼容的代码的人来说,例如带有遗留代码的库或一组项目,这是一种回归,需要规避。
猜你喜欢
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多