1

我根本没有使用 Delphi 的经验,我有一个非常古老的项目,可以在 Delphi 的 2nd、3rd 版本中编译,但不能在 Delphi 4 中工作。问题在于在新版本中工作方式不同的指针。

这些代码段导致错误“需要变量”:

pEnabled := @pClrWire_s^.enabled;
pEnabled        := @Enabled;
pNEnabled    := @pName_s^.Enabled;

其中 pEnabled 是:

const
pEnabled : ^boolean   = nil;

pClrWire_s 和 pName_s 也是指针:

pClrWire_s : TpImage;      {pointer to an image of colored wire}
pName_s    : TpNamed;      {pointer to the identifier}

TpImage 和 TpNamed 的描述可以在项目的其他文件中找到:

type
  TpImage   = ^TImage;
TpNamed = ^TNamed;
TNamed = class(TLabel)

这个问题能在不认真重写整个代码的情况下解决吗?是什么导致Delphi 4出现这样的问题?

4

2 回答 2

1

以下最小程序在 Delphi4 中运行良好:

program ProjTestWriteableConstants; 
{$APPTYPE CONSOLE} 
{$J+} 
type 
  TMyPt = ^Boolean; 
const 
  pBool : TMyPt = nil; 
var 
  Enabled : Boolean; 
begin 
   pBool := @Enabled; 
end.

来自 Delphi 4 文档:

Type       Switch

Syntax     {$J+} or {$J-}{$WRITEABLECONST ON} or {$WRITEABLECONST OFF}

Default    {$J+}{$WRITEABLECONST ON}

Scope      Local

$J 指令控制是否可以修改类型化常量。在 {$J+} 状态下,类型化常量可以被修改,本质上是初始化变量。在 {$J-} 状态下,类型化常量是真正的常量,任何修改类型化常量的尝试都会导致编译器报告错误。

在以前的 Delphi 和 Borland Pascal 版本中,类型化常量始终是可写的,对应于 {$J+} 状态。使用可写类型常量的旧源代码必须在 {$J+} 状态下编译,但对于新应用程序,建议您使用初始化变量并在 {$J-} 状态下编译代码。


笔记:

  • 与先前版本的变化:在先前版本的 Delphi 和 Borland Pascal 中,类型化常量始终是可写的,对应于 {$J+} 状态。使用可写类型常量的旧源代码必须在 {$J+} 状态下编译...
  • 编译器指令 {$J+} 的范围是本地的,这意味着声明可写常量的每个单元都必须包含 {$J+} 开关。

结论:要使其工作,您必须将编译器指令 {$J+} 放在声明可写常量的每个单元中。

于 2020-02-07T07:53:41.303 回答
0

这是使用最新 Delphi 测试的完整解决方案(如果您与早期的 Delphi 版本号相比,D10.3 确实是 Delphi 版本 26,但这是另一回事):

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TpImage = ^TImage;

{$J+}   // enable writable constant
const
  pEnabled : ^boolean   = nil;

var
  pClrWire_s : TpImage;

type
  TForm1 = class(TForm)
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.

正如 Dalija Prasnikar 和 Gerry Coll 在他们各自的评论中所说,关键是启用可赋值的类型常量。您可以在源代码中使用 {$J+} 或使用位于项目选项/构建/Delphi 编译器/编译/语法选项/可分配类型常量的项目选项来完成。

请让我知道这对你有没有用。

于 2020-02-06T06:40:46.983 回答