Как реализовать перечисления COM типа Safe-Safe? - PullRequest
2 голосов
/ 27 августа 2008

Как я могу реализовать перечисления Safe-Type в Delphi в сценарии COM? По сути, я хотел бы заменить набор примитивных констант перечисления набором статических ссылок на конечные объекты, инкапсулированных в классе? , В Java мы можем сделать что-то вроде:

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

и сравните, используя настроенный тип перечисления:

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

В настоящее время я использую старый Delphi 5, и я хотел бы объявить некоторые параметры перечислений на интерфейсах, не позволяя объектам клиента передавать целые (или длинные) типы вместо требуемого типа перечисления. Есть ли у вас лучший способ реализации перечислений, кроме использования перечислений delphi?

Ответы [ 4 ]

4 голосов
/ 01 сентября 2008

Собственные перечисления Delphi уже безопасны для типов. Перечисления Java были новшеством для этого языка, потому что раньше у него не было перечислений вообще. Однако, возможно, вы имеете в виду другую особенность - значения перечисления с префиксом имени типа.

Предстоящий Delphi 2009 и последняя версия продукта Delphi for .NET поддерживают новую директиву, называемую enum. Это выглядит так:

{$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.
3 голосов
/ 27 августа 2008

Что не так с родными перечислениями Delphi? Они безопасны от типа.

type
  TMyEnum = (Item1, Item2, Item3);

if MyEnum <> Item1 then...

Начиная с Delphi 2005 у вас могут быть константы в классе, но Delphi 5 не может.

type
  TMyEnum = sealed class
  public
    const Item1 = 0;
    const Item2 = 1;
    const Item3 = 2;
  end;
1 голос
/ 03 сентября 2008

Мне кажется, я знаю, почему Borland решил не использовать безопасные перечисления типов в редакторе TLB. Перечисления в COM могут иметь разные значения, в то время как Delphi только с Delphi 6 (я думаю).

type
  TSomeEnum = (Enum1 = 1, Enum2 = 6, Enum3 = 80);  // Only since Delphi 6
1 голос
/ 03 сентября 2008

Теперь вы предоставили нам еще несколько подсказок о характере вашего вопроса, а именно упоминание COM, я думаю, я понимаю, что вы имеете в виду. COM может маршалировать только подмножество типов, которые Delphi знает между COM-сервером и клиентом. Вы можете определить перечисления в редакторе TLB, но все они имеют тип TOleEnum, который в основном является целочисленным типом (LongWord). Вы можете иметь переменную типа TOleEnum для любого целочисленного значения и назначать значения различных типов перечислений друг другу. Не совсем безопасный тип.

Я не могу придумать причину, почему COM Delphi не может вместо этого использовать безопасные перечисления типа, но это не так. Боюсь, с этим ничего не поделаешь. Возможно, изменения в редакторе TLB в следующей версии Delphi 2009 могут изменить это.

Для справки: когда редактор TLB не используется, Delphi вполне может иметь интерфейс с методами, в качестве параметров которых используются безопасные перечисления типов.

...