Delphi2007变量类型初始化

Delphi2007变量类型初始化,delphi,delphi-2007,Delphi,Delphi 2007,我试图声明一个常量数组,用于验证输入对象持有的类型属性。但是我做了一些不正确的事情,请看下面的代码: // Record to hold Name-Value pair for checking entities TValues = record Name : WideString; Value : Variant; end; const coarrType1Properties : array[0..5] of TValues = ( (Nam

我试图声明一个常量数组,用于验证输入对象持有的类型属性。但是我做了一些不正确的事情,请看下面的代码:

// Record to hold Name-Value pair for checking entities  
TValues = record  
  Name : WideString;  
  Value : Variant;  
end;  

const  
 coarrType1Properties : array[0..5] of TValues =  
 (  
  (Name : 'HARDWARE'; Value : TRUE),  
  (Name : 'SOFTWARE'; Value : TRUE),  
  (Name : 'TAG'; Value : TRUE),  
  (Name : 'AUTHORIZED'; Value : TRUE),  
  (Name : 'ID'; Value : 700),  
  (Name : 'CODE'; Value : 0)  
 );  
但我得到了类型值的delphi编译时错误,即该类型无法初始化。如何防止这种错误?或者我们可以有其他解决方案等。请协助

:变量不能用常量表达式初始化。

表格D2007帮助: E2071:无法初始化此类型

文件类型(包括类型文本),并且无法初始化类型变量,即不能声明这些类型的类型化常量或初始化变量

program Produce;

var
  V: Variant = 0;

begin
end.
//该示例尝试声明Variant类型的初始化变量,这是非法的

program Solve;

var
  V: Variant;

begin
  V := 0;
end.
解决方案是使用赋值语句初始化正常变量。

状态:

文件类型(包括类型文本),并且无法初始化类型变量,即不能声明这些类型的类型化常量或初始化变量

因此,您的问题在于您的变体记录成员。这意味着您需要一种不同的方法,必须放弃使用常量数组

function Values(const Name: WideString; const Value: Variant): TValues;
begin
  Result.Name := Name;
  Result.Value := Value;
end;

type
  TValuesArray = array of TValues;

function ValuesArray(const Values: array of TValues): TValuesArray;
var
  i: Integer;    
begin
  SetLength(Result, Length(Values));
  for i := 0 to high(Result) do
    Result[i] := Values[i];
end;

var
  coarrType1Properties: TValuesArray;

initialization
  coarrType1Properties := ValuesArray([
    Values('HARDWARE', TRUE),
    Values('SOFTWARE', TRUE),
    Values('TAG', TRUE),
    Values('AUTHORIZED', TRUE),
    Values('ID', 700),
    Values('CODE', 0)
  ]);
对于这些(布尔型、整数型)和其他简单类型,您可以使用
TVarData
进行初始化,并将类型转换回
Variant

type
  TValues = record
    Name: WideString;
    Value: TVarData;
  end;

const
  coarrType1Properties : array[0..5] of TValues = (
    (Name: 'HARDWARE'; Value: (VType: varBoolean; VBoolean: True)),
    (Name: 'SOFTWARE'; Value: (VType: varBoolean; VBoolean: True)),
    (Name: 'TAG'; Value: (VType: varBoolean; VBoolean: True)),
    (Name: 'AUTHORIZED'; Value: (VType: varBoolean; VBoolean: True)),
    (Name: 'ID'; Value: (VType: varInteger; VInteger: 700)),
    (Name: 'CODE'; Value: (VType: varInteger; VInteger: 0))
  );

procedure Test;
var
  I: Integer;
begin
  for I := Low(coarrType1Properties) to High(coarrType1Properties) do
    Writeln(Format('coarrType1Properties[%d]: ''%s'', %s', [I, coarrType1Properties[I].Name, VarToStr(Variant(coarrType1Properties[I].Value))]));
end;

@大卫和GJ都给了你答案。我想指出的是,当你提问时,给出完整的实际错误信息要比说“我遇到了delphi编译时错误”要好得多。确切地知道你遇到了什么错误,可以更容易地帮助你得到答案。@Ken:谢谢……我以后会处理这些事情:)@谢谢David,错误已经过去了……不过我更喜欢TOndrej soln来处理我的问题。@Nains TOndrej解决方案给你留下了一个常量,但可读性稍差。我想这就是交易。顺便说一句,我的答案遵循了我经常使用的模式,我希望语言能够更好地支持它。您至少可以使用语言支持摆脱
ValuesArray
函数:
coarrType1Properties:=TValuesArray.Create(值('HARDWARE',True),值('ID',700))