Domanda

Come potrei implementare le enumerazioni Type-Safe in Delphi in uno scenario COM?Fondamentalmente, vorrei sostituire un insieme di costanti primitive di un'enumerazione con un insieme di riferimenti statici a oggetti finali incapsulati in una classe?.In Java, possiamo fare qualcosa del tipo:

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

ed effettuare confronti utilizzando il tipo di enumerazione personalizzato:

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

Attualmente sto utilizzando il vecchio Delphi 5 e vorrei dichiarare alcuni parametri di enumerazione sulle interfacce, non consentendo agli oggetti client di passare tipi interi (o lunghi) al posto del tipo di enumerazione richiesto.Hai un modo migliore per implementare le enumerazioni oltre all'utilizzo delle enumerazioni Delphi native?

È stato utile?

Soluzione

Ora che ci hai fornito qualche indizio in più sulla natura della tua domanda, in particolare menzionando COM, penso di capire cosa intendi.COM può eseguire il marshalling solo di un sottoinsieme dei tipi che Delphi conosce tra un server COM e un client.Puoi definire enumerazioni nell'editor TLB, ma queste sono tutte del tipo TOleEnum che fondamentalmente è un tipo intero (LongWord).Puoi avere una variabile del tipo TOleEnum qualsiasi valore intero desiderato e assegnare tra loro valori di diversi tipi di enumerazione.Non proprio sicuro per la digitazione.

Non riesco a pensare a un motivo per cui la COM di Delphi non possa utilizzare invece le enumerazioni sicure, ma non è così.Temo che non si possa fare molto al riguardo.Forse i cambiamenti nell'editor TLB nella prossima versione di Delphi 2009 potrebbero cambiare la situazione.

Per il record:Quando l'editor TLB non viene utilizzato, Delphi è perfettamente in grado di interfacciarsi con metodi che hanno come parametri enumerazioni di tipo sicuro.

Altri suggerimenti

Le enumerazioni native di Delphi sono già indipendenti dai tipi.Le enumerazioni Java furono un'innovazione per quel linguaggio, perché prima non aveva alcuna enumerazione.Tuttavia, forse intendi una funzionalità diversa: valori di enumerazione preceduti dal nome del tipo.

Il prossimo Delphi 2009 e l'ultima versione del prodotto Delphi per .NET supportano una nuova direttiva denominata enumerazioni con ambito.Sembra questo:

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

Cosa c'è di sbagliato nelle enumerazioni Delphi native?Sono sicuri.

type
  TMyEnum = (Item1, Item2, Item3);

if MyEnum <> Item1 then...

Da Delphi 2005 puoi avere const in una classe, ma Delphi 5 no.

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

Penso di sapere perché Borland ha scelto di non utilizzare enumerazioni sicure nell'editor TLB.Le enumerazioni in COM possono avere valori diversi mentre Delphi solo da Delphi 6 (credo) può farlo.

type
  TSomeEnum = (Enum1 = 1, Enum2 = 6, Enum3 = 80);  // Only since Delphi 6
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top