我似乎处于 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 文档是这么说的,但是我可怜的大脑无法解决这个技巧。有人可以帮忙吗?
我有一个记录,其中包含我认为是指向引用计数对象的指针.我希望如果我在记录中创建引用计数对象,当记录超出范围时,对象的引用计数将降为零,并且对象将被销毁.但这似乎并非如此.这是最小代码示例.我的表格恰好有一些面板和备忘录,但只有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