2014-07-15 39 views
1

我目前有一個與屬性一起使用的選項管理,它使用所有相同的getter/setter方法,但使用索引。將整數轉換爲屬性獲取器/設置器中的枚舉

這適用於Ints和Bools,但我想爲枚舉工作。

TIntegerOptions = (kInt1, kInt2, kInt3); 

class property Integer1: Integer index kInt1 read GetOptionsValueInt write SetOptionsValueInt; 
class property Integer2: Integer index kInt2 read GetOptionsValueInt write SetOptionsValueInt; 
class property Integer3: Integer index kInt3 read GetOptionsValueInt write SetOptionsWertInt; 

FOptionsListInt: array[TIntegerOptions] of IniIntObject; // Objects contain Inifile read&save functionalities 
... 

class function GetOptionsValueInt(const aOption: TIntegerOptions) : Integer 
begin 
    Result := Ord(FOptionsListInt[aOption].GetValue()); 
end; 

class procedure SetOptionsValueInt(const aOption: TIntegerOptions; const aValue: Integer); 
begin 
    FOptionslistInt[aOption].ChangeTo(aValue); 
end; 

這是工作,到目前爲止,現在我的問題:

TEnumOptions = (kEnum1, kEnum2, kEnum3); 
TEnum1 = (e1o1, e1o2, e1o3); 
TEnum2 = (e2o1, e2o2, e2o3); 
TEnum3 = (e3o1, e3o2, e3o3); 

// these props fail because my functions return/excpect Integers, not the matching Enums 
class property Enum1: TEnum1 index kEnum1 read GetOptionsValueInt write SetOptionsValueEnum; 
class property Enum2: TEnum2 index kEnum2 read GetOptionsValueInt write SetOptionsValueEnum; 
class property Enum3: TEnum3 index kEnum3 read GetOptionsValueInt write SetOptionsValueEnum; 

FOptionsListEnum: array[TEnumOptions] of IniIntObject; // Objects contain Inifile read&save functionalities 

標誌着我在代碼中的問題。我可以以某種方式將由getters/setters返回的Integer值轉換爲每個屬性的匹配枚舉值?

對於那些閱讀舊問題的人:
我決定只是對枚舉使用相同的getter/setter,因爲最後他們也會保存爲整數。如果我需要以某種方式投入獲取者,我會再次添加它們,但我希望在屬性聲明內部提供解決方案。

回答

2

關於你提到的更新,要使用這樣的代碼:

class property Enum1: TEnum1 index kEnum1 read GetOptionsValueInt; 

失敗編譯因爲GetOptionsValueInt返回Integer類型的值。由於該屬性的類型爲TEnum1,這是一種簡單的類型不匹配。爲了獲得TEnum1類型的屬性,getter必須是返回TEnum1類型值的函數。

如果每個屬性都有不同的類型,則不能共享getter和setter。共享索引的getter和setter只能用於共享通用類型的屬性。由於看起來這些屬性中沒有一個屬於共享類型,因此您將無法共享獲取者和設置者。


原始答案原來的問題

你不顯示所有的聲明,所以我們很難知道爲什麼你的代碼不能編譯。我們不知道FOptionsListeEnum是什麼,我們不知道Wert()是什麼。

然而,這裏是一個演示是枚舉類型可以作爲索引屬性索引的完整的程序:

{$APPTYPE CONSOLE} 

type 
    TMyEnum = (evOne, evTwo); 

    TMyClass = class 
    private 
    class function GetValue(const Option: TMyEnum): Integer; static; 
    public 
    class property ValueOne: Integer index evOne read GetValue; 
    class property ValueTwo: Integer index evTwo read GetValue; 
    end; 

class function TMyClass.GetValue(const Option: TMyEnum): Integer; 
begin 
    Result := ord(Option); 
end; 

begin 
    Writeln(TMyClass.ValueOne); 
    Writeln(TMyClass.ValueTwo); 
end. 

所以,這清楚地表明,有使用枚舉類型作爲指標沒有問題。在這種情況下,你的問題是什麼。讓我們來看看你的代碼:

class function TKmpOption.GetOptionsWertEnum(const aOption: TEnumOptionen): Integer; 
begin 
    Result := Ord(FOptionsListeEnum[aOption].Wert()); 
end; 

class procedure TKmpOption.SetOptionsWertEnum(const aOption: TEnumOptionen; const aWert: Integer); 
begin 
    FOptionslisteEnum[aOption].Aendern(aOption(aWert)); 
end; 

如果Ord(FOptionsListeEnum[aOption].Wert())不與類型不匹配錯誤編譯,那麼它似乎Wert()不是序數值。

至於aOption(aWert)根本沒有意義。那永遠不能編譯。也許你的意思是TEnumOptionen(aWert),但這也沒有意義。爲什麼該值將用於索引可能選項的相同類型。

我希望上面的代碼顯示該問題與枚舉類型無關,並且實際上是非常平淡無奇的。

+0

對不起,我會添加更多的代碼,以便儘快解釋問題 –

+1

@David Heffernan:OP能否遺漏允許使用枚舉類型作爲函數的構造?我的意思是函數GetEnum(Value:Integer):TAnEnum;開始 結果:= TAnEnum(Value); 結束; – MartynA

+1

你是對的,setter中的代碼完全關閉了 - 自己有點困惑。我會去一臺電腦(剛剛在線與移動),並更新問題,與moee代碼和假名稱,所以它變得更容易理解 - atm它真的很亂,對此表示歉意 –