2009-10-09 9 views
3

Alors que la déclaration d'énumération subrange travaux suivants:Delphi: Comment avoir un type d'énumération de sous-gamme non contiguë?

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

Cela ne signifie pas:

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

pas plus

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

Comment puis-je déclarer un type de sous-gamme avec des valeurs non contiguës?

+3

Votre dernier exemple n'est pas un type de sous-catégorie (contrairement au titre de votre question). Vous pouvez déclarer TReceiptCode = (rcspace, rcA, rcB, rcc, rcD, rcE, rcF, rcR); ReceiptCodeStr: tableau de TReceiptCode = ('', 'A', 'B', 'C', 'D', 'E', 'F', 'R'); – Argalatyr

+0

Le commentaire d'Argalatyr est parfaitement valide et il vous a fourni une solution parfaitement réalisable. Donc pas besoin d'être offensant. – Despatcher

Répondre

5

Malheureusement, je ne pense pas qu'il y ait moyen de le faire. Vous pouvez déclarer une énumération (nouvelle) non contiguë ou une sous-gamme d'un type existant, mais pas les deux.

+0

Personne ne s'est présenté au cours des 4 derniers mois avec une solution, alors je suppose qu'il n'y en a vraiment pas. Accepté. –

4

Pourriez-vous utiliser un ensemble à la place?

TSomeCharSet= Set of Char; 

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

Peut-être mamie et de l'oeuf, mais je ne suis pas sûr de ce que vous utilisez ensuite pour :) ...

Eh bien tout vous reste alors crée TNonContigousCharRange vous à l'aide d'un ensemble ou un tableau en tant que "Range" limitant et levant une exception quand il est hors de portée ou ayant une procédure SetReceiptCode pour faire une chose similaire.

+0

Un type est actuellement défini comme Char. je voudrais limiter les valeurs des caractères peuvent être assignés à ce type. –

+0

Oh, et non, un ensemble ne fonctionnerait pas car il prend alors un ensemble de valeurs, plutôt qu'une seule valeur. –

+0

Un ensemble fonctionne, il ne vous donne simplement pas de vérification automatique des valeurs dans le compilateur, vous devez tester vous-même l'appartenance à cet ensemble, mais cela vous donne précisément la structure de données dont vous avez besoin pour y parvenir. – Deltics

3

Pour toutes les réponses précédentes Je voudrais ajouter simplement que l'indice est dans le nom du type: sous gamme

En termes simples, une gamme a une limite inférieure et une limite supérieure. Ce que vous décrivez est un mis (ou un sous-ensemble), pas une sous-plage donc bien sûr vous ne pouvez pas l'exprimer comme une sous-gamme.

+0

Vous avez raison, bien sûr. Je pense que le terme applicable est "oxymoron", non pas péjoratif mais simplement descriptif d'une phrase qui contient des termes contradictoires. – Argalatyr

+0

N'oubliez pas que je «compose» un terme, puisque je ne connais pas le terme «propre» de Delphi pour ce que je suis en train de faire. Il s'avère que Delphi ne peut pas faire ce que je veux, donc il n'y a pas de terme "officiel" - donc mon terme inventé est valide. Quelqu'un est libre d'inventer un autre nom que j'essaie d'atteindre. –

+1

Vous avez manqué le point: Q: "Pourquoi cette décalration de sous-gamme ne fonctionne-t-elle pas?" R: "Parce que ce n'est pas une sous-gamme, c'est autre chose". Et oui, vous avez raison, le "quelque chose d'autre" dont vous avez besoin n'existe pas dans Delphi. Mais cela ne rend pas votre utilisation du terme "sous-gamme" pour le décrire valide, pas moins parce que "sous-gamme" * a * sens dans Delphi une signification qui ne correspond pas à ce que vous essayez d'atteindre (qui * est * un "ensemble"). – Deltics