2008-08-27 5 views
2

Comment pourrais-je implémenter des énumérations de type sécurité dans Delphi dans un scénario COM? Fondamentalement, je voudrais remplacer un ensemble de constantes primitives d'une énumération avec un ensemble de références d'objet final statique encapsulé dans une classe? . En Java, nous pouvons faire quelque chose comme:Comment implémenter des énumérations COM sécurisées?

public final class Enum 
{ 
    public static final Enum ENUMITEM1 = new Enum(); 
    public static final Enum ENUMITEM2 = new Enum(); 
    //... 
    private Enum() {} 
} 

et faire des comparaisons en utilisant le type d'énumération personnalisé:

if (anObject != Enum.ENUMITEM1) ... 

Je suis actuellement en utilisant l'ancien Delphi 5 et je voudrais déclarer certains paramètres énumérations sur les interfaces, ne permettant pas aux objets client de passer des types entiers (ou longs) à la place du type d'énumération requis. Avez-vous une meilleure façon d'implémenter des énumérations que d'utiliser les enums Delphi?

Répondre

1

Maintenant, vous nous avez fourni quelques indices supplémentaires sur la nature de votre question, à savoir en mentionnant COM, je pense que je comprends ce que vous voulez dire. COM ne peut rassembler qu'un sous-ensemble des types que Delphi connaît entre un serveur COM et un client. Vous pouvez définir des énumérations dans l'éditeur TLB, mais toutes sont de type TOleEnum qui est essentiellement un type entier (LongWord). Vous pouvez avoir une variable du type TOleEnum toute valeur entière que vous voulez et affecter des valeurs de différents types d'énumération les uns aux autres. Pas vraiment sûr de type.

Je ne peux pas penser à une raison pour laquelle COM de Delphi ne peut pas utiliser les enums de type safe à la place, mais ce n'est pas le cas. Je crains que rien ne puisse être fait à ce sujet. Peut-être que les changements dans l'éditeur TLB dans la prochaine version de Delphi 2009 pourraient changer cela. Pour l'anecdote: Lorsque l'éditeur TLB n'est pas utilisé, Delphi est parfaitement capable d'avoir une interface avec des méthodes qui ont des enum type safe comme paramètres.

3

Qu'est-ce qui ne va pas avec les enums Delphi natifs? Ils sont de type sûr.

type 
    TMyEnum = (Item1, Item2, Item3); 

if MyEnum <> Item1 then... 

Depuis Delphi 2005, vous pouvez avoir des constats dans une classe, mais pas Delphi 5.

type 
    TMyEnum = sealed class 
    public 
    const Item1 = 0; 
    const Item2 = 1; 
    const Item3 = 2; 
    end; 
4

Les énumérations Delphi natives sont déjà sécurisées. Les énumérations Java étaient une innovation pour ce langage, car auparavant il n'y avait pas du tout d'énumérations. Cependant, vous voulez peut-être dire une fonctionnalité différente - les valeurs d'énumération préfixées par leur nom de type. Prochain Delphi 2009, et la dernière version du produit Delphi for .NET, prennent en charge une nouvelle directive appelée scoped enums. Il ressemble à ceci:

{$APPTYPE CONSOLE} 
{$SCOPEDENUMS ON} 
type 
    TFoo = (One, Two, Three); 
{$SCOPEDENUMS OFF} 

var 
    x: TFoo; 
begin 
    x := TFoo.One; 
    if not (x in [TFoo.Two, TFoo.Three]) then 
    Writeln('OK'); 
end. 
1

Je pense savoir pourquoi Borland a choisi de ne pas utiliser d'énumération sécurisée dans l'éditeur TLB. Enums dans COM peut être des valeurs différentes tandis que Delphi seulement depuis Delphi 6 (je pense) peut le faire.

type 
    TSomeEnum = (Enum1 = 1, Enum2 = 6, Enum3 = 80); // Only since Delphi 6 
Questions connexes