2011-06-14 106 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