Frage

Wie könnte ich typsichere Aufzählungen in Delphi in einem COM-Szenario implementieren?Grundsätzlich möchte ich einen Satz primitiver Konstanten einer Aufzählung durch einen Satz statischer endgültiger Objektreferenzen ersetzen, die in einer Klasse gekapselt sind?.In Java können wir so etwas tun:

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

und Vergleiche mit dem benutzerdefinierten Aufzählungstyp durchführen:

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

Ich verwende derzeit das alte Delphi 5 und möchte einige Enumerationsparameter auf den Schnittstellen deklarieren, um zu verhindern, dass Clientobjekte Ganzzahltypen (oder Long-Typen) anstelle des erforderlichen Enumerationstyps übergeben.Gibt es eine bessere Möglichkeit, Aufzählungen zu implementieren, als die nativen Delphi-Aufzählungen zu verwenden?

War es hilfreich?

Lösung

Jetzt haben Sie uns weitere Hinweise auf die Art Ihrer Frage gegeben, nämlich die Erwähnung von COM. Ich glaube, ich verstehe, was Sie meinen.COM kann nur eine Teilmenge der Typen, die Delphi kennt, zwischen einem COM-Server und einem Client marshallen.Sie können Aufzählungen im TLB-Editor definieren, diese sind jedoch alle vom Typ TOleEnum, der im Grunde ein ganzzahliger Typ (LongWord) ist.Sie können eine Variable vom Typ TOleEnum mit einem beliebigen ganzzahligen Wert versehen und einander Werte verschiedener Enum-Typen zuweisen.Nicht wirklich typsicher.

Ich kann mir keinen Grund vorstellen, warum Delphis COM nicht stattdessen die typsicheren Aufzählungen verwenden kann, aber das ist nicht der Fall.Ich fürchte, dagegen kann man nicht viel tun.Vielleicht könnte sich das durch die Änderungen im TLB-Editor in der kommenden Delphi 2009-Version ändern.

Fürs Protokoll:Wenn der TLB-Editor nicht verwendet wird, kann Delphi problemlos eine Schnittstelle zu Methoden herstellen, die typsichere Aufzählungen als Parameter haben.

Andere Tipps

Native Delphi-Aufzählungen sind bereits typsicher.Java-Aufzählungen waren eine Innovation für diese Sprache, da es zuvor überhaupt keine Aufzählungen gab.Möglicherweise meinen Sie jedoch eine andere Funktion – Aufzählungswerte, denen ihr Typname vorangestellt ist.

Das kommende Delphi 2009 und die letzte Version des Delphi für .NET-Produkts unterstützen eine neue Direktive namens „scoped enums“.Es sieht aus wie das:

{$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.

Was ist falsch an nativen Delphi-Enums?Sie sind typsicher.

type
  TMyEnum = (Item1, Item2, Item3);

if MyEnum <> Item1 then...

Seit Delphi 2005 können Sie Konstanten in einer Klasse haben, Delphi 5 jedoch nicht.

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

Ich denke, ich weiß, warum Borland im TLB-Editor keine typsicheren Aufzählungen verwendet.Aufzählungen in COM können unterschiedliche Werte haben, während Delphi dies erst seit Delphi 6 (glaube ich) kann.

type
  TSomeEnum = (Enum1 = 1, Enum2 = 6, Enum3 = 80);  // Only since Delphi 6
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top