小编Dsm*_*Dsm的帖子

依赖于版本的编译 - $ENDIF 和 $IFEND

我似乎处于 catch 22 的情况。我想添加编译器版本相关代码。好的 - 这是非常标准的。但是 $IF 语句的语法因版本而异。

这是我想要实现的目标

{$IF CompilerVersion = 28}
  if (fPendingObject = pObject) and (Addr(fPendingActionEvent) = Addr(pPendingActionEvent) ) then
{$ELSE}
  if (fPendingObject = pObject) and (@fPendingActionEvent = @pPendingActionEvent ) then
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)

这在 Delphi XE7 中编译,但不在西雅图或柏林编译。这些编译器需要语法

{$IF CompilerVersion = 28}
  if (fPendingObject = pObject) and (Addr(fPendingActionEvent) = Addr(pPendingActionEvent) ) then
{$ELSE}
  if (fPendingObject = pObject) and (@fPendingActionEvent = @pPendingActionEvent ) then
{$IFEND}  
Run Code Online (Sandbox Code Playgroud)

($IFEND 而不是 $ENDIF)。但是 XE7 不会接受这种语法。

显然必须有一个技巧,确实 Delphi 2009 文档是这么说的,但是我可怜的大脑无法解决这个技巧。有人可以帮忙吗?

delphi

2
推荐指数
1
解决办法
1092
查看次数

当记录超出范围时,引用未记录的记录中的对象

我有一个记录,其中包含我认为是指向引用计数对象的指针.我希望如果我在记录中创建引用计数对象,当记录超出范围时,对象的引用计数将降为零,并且对象将被销毁.但这似乎并非如此.这是最小代码示例.我的表格恰好有一些面板和备忘录,但只有TButton(特别是Button1Click)很重要.

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

type
  TUserData = class( TInterfacedObject )
  public
    AData : integer;

    constructor Create;
    destructor Destroy; override;
  end;

  TTestRec = Record
    AField : integer;
    UserData : TUserData;
  End;

  TForm4 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Memo1: TMemo;
    Button1: TButton;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

procedure TForm4.Button1Click(Sender: TObject);
var
  iRec …
Run Code Online (Sandbox Code Playgroud)

delphi

2
推荐指数
1
解决办法
204
查看次数

标签 统计

delphi ×2