奇怪的编译错误信息
Odd compilation error message
XE6 中的以下代码片段
procedure TForm1.Test(CDS : TClientDataSet);
var
AGuid : TGuid;
lResult : Longint;
begin
lResult := SysUtils.CreateGUID(AGuid);
CDS.InsertRecord([AGuid, '', False]);
end;
产生错误信息
[dcc32 Error] Unit1.pas(73): E2150 Bad argument type in variable type array constructor
首先,在发现这一点时,我试图将我的步骤追溯至编译器生成错误的该例程的先前版本
E2197 Constant object cannot be passed as var parameter
上线
lResult := SysUtils.CreateGUID(AGuid);
尽管事实证明是引发它的原因是后续代码中的错误。
const 数组不能采用 TGuid
记录类型。
const 数组采用 TVarRec 的项定义为:
TVarRec = record
case Byte of
vtInteger: (VInteger: Integer; VType: Byte);
vtBoolean: (VBoolean: Boolean);
vtChar: (VChar: Char);
vtExtended: (VExtended: PExtended);
vtString: (VString: PShortString);
vtPointer: (VPointer: Pointer);
vtPChar: (VPChar: PChar);
vtObject: (VObject: TObject);
vtClass: (VClass: TClass);
vtWideChar: (VWideChar: WideChar);
vtPWideChar: (VPWideChar: PWideChar);
vtAnsiString: (VAnsiString: Pointer);
vtCurrency: (VCurrency: PCurrency);
vtVariant: (VVariant: PVariant);
数组构造函数中不允许使用 TGuid 类型。
TGuid 声明为:
TGUID = packed record
D1: LongWord;
D2: Word;
D3: Word;
D4: array[0..7] of Byte;
class operator Equal(const Left, Right: TGUID): Boolean;
class operator NotEqual(const Left, Right: TGUID): Boolean;
class function Empty: TGUID; static;
end;
并且根据帮助,数组构造函数不支持枚举和记录:
... because enumerations and records are not supported in array constructors.
大概如果您想存储 Guid,您应该使用 GuidToString 将其转换为字符串:
CDS.InsertRecord([GUIDToString(AGuid), '', False]);
这是InsertRecord
方法的声明:
procedure InsertRecord(const Values: array of const);
参数为变体开放数组。 Variant open array parameters are implemented internally by being passed as TVarRec
个实例。并且 TVarRec
不能包含记录。由于TGUID
是一条记录,所以不能传入变体开放数组参数。
XE6 中的以下代码片段
procedure TForm1.Test(CDS : TClientDataSet);
var
AGuid : TGuid;
lResult : Longint;
begin
lResult := SysUtils.CreateGUID(AGuid);
CDS.InsertRecord([AGuid, '', False]);
end;
产生错误信息
[dcc32 Error] Unit1.pas(73): E2150 Bad argument type in variable type array constructor
首先,在发现这一点时,我试图将我的步骤追溯至编译器生成错误的该例程的先前版本
E2197 Constant object cannot be passed as var parameter
上线
lResult := SysUtils.CreateGUID(AGuid);
尽管事实证明是引发它的原因是后续代码中的错误。
const 数组不能采用 TGuid
记录类型。
const 数组采用 TVarRec 的项定义为:
TVarRec = record
case Byte of
vtInteger: (VInteger: Integer; VType: Byte);
vtBoolean: (VBoolean: Boolean);
vtChar: (VChar: Char);
vtExtended: (VExtended: PExtended);
vtString: (VString: PShortString);
vtPointer: (VPointer: Pointer);
vtPChar: (VPChar: PChar);
vtObject: (VObject: TObject);
vtClass: (VClass: TClass);
vtWideChar: (VWideChar: WideChar);
vtPWideChar: (VPWideChar: PWideChar);
vtAnsiString: (VAnsiString: Pointer);
vtCurrency: (VCurrency: PCurrency);
vtVariant: (VVariant: PVariant);
数组构造函数中不允许使用 TGuid 类型。
TGuid 声明为:
TGUID = packed record
D1: LongWord;
D2: Word;
D3: Word;
D4: array[0..7] of Byte;
class operator Equal(const Left, Right: TGUID): Boolean;
class operator NotEqual(const Left, Right: TGUID): Boolean;
class function Empty: TGUID; static;
end;
并且根据帮助,数组构造函数不支持枚举和记录:
... because enumerations and records are not supported in array constructors.
大概如果您想存储 Guid,您应该使用 GuidToString 将其转换为字符串:
CDS.InsertRecord([GUIDToString(AGuid), '', False]);
这是InsertRecord
方法的声明:
procedure InsertRecord(const Values: array of const);
参数为变体开放数组。 Variant open array parameters are implemented internally by being passed as TVarRec
个实例。并且 TVarRec
不能包含记录。由于TGUID
是一条记录,所以不能传入变体开放数组参数。