奇怪的编译错误消息

时间:2015-06-11 21:33:55

标签: delphi delphi-xe6

以下代码片段,在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

Fwiw,在发现这一点时,我试图将我的步骤回溯到此例程的先前版本,其中编译器正在生成错误

E2197 Constant object cannot be passed as var parameter 

就行了

  lResult := SysUtils.CreateGUID(AGuid);

尽管在后续代码中发现它的事实证明是错误的。

3 个答案:

答案 0 :(得分:1)

数组构造函数中不允许使用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;

根据帮助,数组构造函数不支持枚举和记录:

  

...因为数组构造函数不支持枚举和记录。

大概如果你想要存储Guid,你应该使用GuidToString将它转换为字符串:

CDS.InsertRecord([GUIDToString(AGuid), '', False]);

答案 1 :(得分:1)

这是InsertRecord方法的声明:

procedure InsertRecord(const Values: array of const);

该参数是变量开放数组。 Variant open array parameters通过作为TVarRec实例传递在内部实现。并且TVarRec不能包含记录。由于TGUID是一条记录,因此无法在变量开放数组参数中传递。

答案 2 :(得分:0)

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);
相关问题