2011-06-14 43 views
1

我想声明一个常量数组来验证输入对象所持有的类型属性。但我做的事情不正确,请在下面的代码看看:德尔福2007年变种类型初始化

// 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编译时错误的类型值,即该类型不能被初始化。如何防止这个错误?或者我们可以有替代解决方案等请协助...

+1

@大卫和GJ俩给你答案。我会指出,当你提出问题的时候,给出完整的* actual *错误信息比说“我得到delphi编译时错误”要好得多。了解到底发生了什么错误,可以更轻松地帮助您获得答案。 – 2011-06-14 11:06:56

+0

@Ken:谢谢...我会照顾这样的事情在未来:) – Nains 2011-06-14 13:04:25

回答

7

对于这些(布尔,整数)等简单的类型,你可以用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; 
+0

感谢man itz works更好...:) – Nains 2011-06-14 13:10:54

0

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

0

形式D2007帮助: E2071:这种类型不能初始化

文件类型(包括类型文本)和变量不能被初始化的类型,也就是说,你不能声明类型的常量或这些类型的初始化的变量。

program Produce; 

var 
    V: Variant = 0; 

begin 
end. 

//该示例尝试声明Variant类型的初始化变量,该变量非法。

program Solve; 

var 
    V: Variant; 

begin 
    V := 0; 
end. 

解决方法是用赋值语句初始化一个普通变量。

3

documentation状态:

文件类型(包括类型文本),以及变型不能初始化,也就是说,你不能声明类型的常量或这些类型的初始化的变量。

所以你的问题是你的变种记录成员。这意味着你需要一个不同的方法,你将不得不放弃使用一个常量数组。

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) 
    ]); 
+0

@感谢大卫,这错误消失了现在...但是我宁愿TOndrej soln我的情况.. – Nains 2011-06-14 13:12:43

+0

@Nains TOndrej解决方案离开你有一个常数,但它的可读性较差。这是我猜想的折衷。顺便说一句,我的答案遵循我经常使用的模式,我希望语言能够更好地支持它。 – 2011-06-14 13:24:53

+0

您可以至少摆脱'ValuesArray'函数的语言支持:'coarrType1Properties:= TValuesArray.Create(Values('HARDWARE',True),Values('ID',700));' – 2011-06-14 15:44:58