2009-10-09 36 views
3

雖然下面的子範圍枚舉聲明的工作原理:德爾福:如何有非連續的子範圍枚舉類型?

type 
    TReceiptCode = 'A'..'F'; 

這不:

type 
    TReceiptCode = ' ','A'..'F', 'R'; 

也不

type 
    TReceiptCode = ' ','A','B','C','D','E','F','R'; 

我怎樣才能申報使用非連續值的子界類型?

+3

您的最後一個示例不是子範圍類型(​​與您的問題標題相反)。你可以聲明TReceiptCode =(rcspace,rcA,rcB,rcC,rcD,rcE,rcF,rcR); ReceiptCodeStr:TReceiptCode =('','A','B','C','D','E','F','R'); – Argalatyr 2009-10-09 20:27:59

+0

Argalatyr的評論完全有效,他爲您提供了一個完美可行的解決方案。所以不需要冒犯。 – Despatcher 2009-10-13 17:39:41

回答

5

不幸的是,我不認爲有任何方法可以做到這一點。您可以聲明(新)非連續枚舉或現有類型的子範圍,但不能同時包含兩者。

+0

在過去的4個月裏沒有人出現過解決方案,所以我猜這裏真的沒有。公認。 – 2010-01-15 19:59:15

4

您可以使用一套嗎?

TSomeCharSet= Set of Char; 

SomeChars: TSomeCharSet = [' ','A','B','C','D','E','F','R']; 

可能是奶奶和蛋的問題,但我不知道你正在使用然後:)什麼...

那麼你只剩下則使用一組或數組自己創造TNonContigousCharRange作爲限制「範圍」,並在超出範圍或發生SetReceiptCode過程來做類似事情時引發異常。

+0

類型當前定義爲Char。我想限制可以分配給該類型的字符的值。 – 2009-10-14 00:37:47

+0

哦,不,一套不會工作,因爲它然後採取一組值,而不是一個單一的值。 – 2009-10-14 00:38:22

+0

一個集合可以工作,它不會在編譯器中爲您提供自動值檢查,您必須測試自己設置的成員資格,但它確實爲您提供了實現這一目標所需的數據結構。 – Deltics 2010-01-16 05:50:24

3

以前的所有答案,我只想說的線索是在類型的名稱添加:子範圍

簡單地說,一個範圍具有下限和上限。你描述的是一個(或一個子集),而不是一個子範圍,所以當然你不能表示它作爲子範圍。

+0

當然你是對的。我認爲適用的術語是「矛盾修飾詞」,不是貶義的,而是簡單描述包含矛盾術語的短語。 – Argalatyr 2009-10-11 12:19:22

+0

不要忘記我正在「彌補」一個術語,因爲我不知道德爾福對於我想要做的「合適」術語。事實證明,德爾福不能做我想做的事,所以沒有「官方」這個術語 - 所以我的構成術語是有效的。有人可以自由發明我想要實現的另一個名字。 – 2010-01-15 20:01:19

+1

你錯過了這一點:問:「爲什麼這個子範圍的消除不起作用?」答:「因爲這不是一個子範疇,而是另一回事」。是的,你是對的,你需要的「別的東西」在Delphi中不存在。但是,這不會使你使用術語「子範圍」來形容它是有效的,尤其是因爲「子範圍」*在德爾福中的含義不符合你試圖達到的目標*是*「設置」)。 – Deltics 2010-01-16 05:47:50