Question

Comment puis-je implémenter des énumérations Type-Safe dans Delphi dans un scénario COM ?Fondamentalement, j'aimerais remplacer un ensemble de constantes primitives d'une énumération par un ensemble de références d'objet final statiques encapsulées dans une classe ?.En Java, nous pouvons faire quelque chose comme :

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

et effectuez des comparaisons à l'aide du type d'énumération personnalisé :

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

J'utilise actuellement l'ancien Delphi 5 et je voudrais déclarer certains paramètres d'énumération sur les interfaces, ne permettant pas aux objets clients de transmettre des types entiers (ou longs) à la place du type d'énumération requis.Avez-vous un meilleur moyen d'implémenter les énumérations que d'utiliser les énumérations natives de Delphi ?

Était-ce utile?

La solution

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

Je ne vois pas de raison pour laquelle COM de Delphi ne peut pas utiliser les énumérations de type sécurisé à la place, mais ce n'est pas le cas.Je crains qu’on ne puisse pas faire grand-chose à ce sujet.Peut-être que les modifications apportées à l'éditeur TLB dans la prochaine version de Delphi 2009 pourraient changer cela.

Pour mémoire :Lorsque l'éditeur TLB n'est pas utilisé, Delphi est parfaitement capable d'avoir une interface avec des méthodes qui ont des énumérations de type sécurisé comme paramètres.

Autres conseils

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 d'énumérations du tout.Cependant, vous parlez peut-être d'une fonctionnalité différente : les valeurs d'énumération préfixées par leur nom de type.

Delphi 2009 à venir et la dernière version du produit Delphi pour .NET prennent en charge une nouvelle directive appelée scoped enums.Cela 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.

Quel est le problème avec les énumérations natives de Delphi ?Ils sont de type sécurisé.

type
  TMyEnum = (Item1, Item2, Item3);

if MyEnum <> Item1 then...

Depuis Delphi 2005, vous pouvez avoir des consts dans une classe, mais Delphi 5 ne le peut pas.

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

Je pense savoir pourquoi Borland a choisi de ne pas utiliser d'énumérations de type sécurisé dans l'éditeur TLB.Les énumérations dans COM peuvent avoir des valeurs différentes alors que Delphi uniquement depuis Delphi 6 (je pense) peut le faire.

type
  TSomeEnum = (Enum1 = 1, Enum2 = 6, Enum3 = 80);  // Only since Delphi 6
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top