2009-10-09 2 views
3

Хотя следующее объявление поддиапазон перечисления работ:Delphi: Как иметь несмежный тип перечисления поддиапазонов?

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

+0

Замечание Аргалатыра совершенно верно, и он предоставил вам совершенно работоспособное решение. Так что не нужно быть оскорбительным. – Despatcher

ответ

5

К сожалению, я не думаю, что есть способ сделать это. Вы можете объявить (новое) несмежное перечисление или поддиапазон существующего типа, но не оба.

+0

Никто не выступал в течение последних 4 месяцев с решением, поэтому я думаю, что на самом деле его нет. Принято. –

4

Не могли бы вы использовать набор?

TSomeCharSet= Set of Char; 

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

Может быть, бабка и яйца ситуация, но я не уверен, что вы используете, то для :) ...

Ну все, что вам остается, то создает TNonContigousCharRange себя с помощью набора или массива как ограничивающий «диапазон» и поднимающий исключение, когда он находится за пределами допустимого диапазона, или имеющий процедуру SetReceiptCode для выполнения аналогичной вещи.

+0

Тип в настоящее время определяется как Char. Я хотел бы ограничить значения символов, которые могут быть присвоены этому типу. –

+0

О, и нет, набор не будет работать, потому что тогда он принимает набор значений, а не одно значение. –

+0

Набор работает, он просто не дает вам автоматическую проверку значения в компиляторе, вам нужно проверить членство в этом наборе самостоятельно, но это дает вам точно структуру данных, необходимую для достижения этого очень просто. – Deltics

3

Для всех предыдущих ответов я бы просто добавить, что ключ находится в имени типа: суб диапазон

Проще говоря, диапазон имеет нижнюю и верхнюю границу. То, что вы описали, это набор (или подмножество), а не поддиапазон, поэтому, конечно, вы не можете его выразить как поддиапазон.

+0

Вы правы, конечно. Я считаю, что применимым термином является «оксюморон», а не уничижительный, но просто описательный термин, содержащий противоречивые термины. – Argalatyr

+0

Не забывайте, что я «сочиняю» термин, так как я не знаю «правильного» термина Delphi для того, что я пытаюсь сделать. Оказывается, что Delphi не может делать то, что я хочу, поэтому нет «официального» термина, поэтому мой придуманный термин действителен. Кто-то может придумать другое имя, чего я пытаюсь достичь. –

+1

Вам не хватает точки: Q: «Почему эта подкаменальная декаляция не работает?» A: «Потому что это не поддиапазон, это что-то еще». И да, вы правы, «что-то еще», что вам нужно, не существует в Delphi. Но это не означает, что вы используете термин «субдиапазон» для описания его достоверности, не в последнюю очередь потому, что «субдиапазон» * имеет значение в Delphi, что не соответствует тому, что вы пытаетесь достичь (что * is * a "set"). – Deltics

Смежные вопросы