Come implementare le enumerazioni COM indipendenti dai tipi?
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?
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