2

COM シナリオで Delphi にタイプ セーフな列挙を実装するにはどうすればよいですか? 基本的に、列挙型のプリミティブ定数のセットを、クラスにカプセル化された静的な最終オブジェクト参照のセットに置き換えたいですか? . 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 を使用しており、クライアント オブジェクトが必要な列挙型の代わりに整数 (または long) 型を渡さないように、インターフェイスでいくつかの列挙型パラメーターを宣言したいと考えています。ネイティブのデルファイ列挙型を使用する以外に、列挙型を実装するより良い方法はありますか?

4

4 に答える 4

4

ネイティブの Delphi 列挙は、すでに型安全です。Java 列挙は、その言語の革新でした。以前は列挙がまったくなかったからです。ただし、おそらく別の機能を意味する可能性があります-型名が前に付いた列挙値。

今後の Delphi 2009、および Delphi for .NET 製品の最終バージョンは、スコープ付き列挙型と呼ばれる新しいディレクティブをサポートします。次のようになります。

{$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.
于 2008-08-31T22:46:32.603 に答える
3

ネイティブの Delphi 列挙型の何が問題になっていますか? それらは型安全です。

type
  TMyEnum = (Item1, Item2, Item3);

if MyEnum <> Item1 then...

Delphi 2005 以降、クラスに const を含めることができますが、Delphi 5 ではできません。

type
  TMyEnum = sealed class
  public
    const Item1 = 0;
    const Item2 = 1;
    const Item3 = 2;
  end;
于 2008-08-27T17:08:56.253 に答える
1

これで、質問の性質、つまりCOMについて言及する手がかりがいくつか提供されました。私はあなたの意味を理解していると思います. COM は、COM サーバーとクライアントの間で Delphi が認識する型のサブセットのみをマーシャリングできます。TLB エディターで列挙型を定義できますが、これらはすべて基本的に整数型 (LongWord) である TOleEnum 型です。タイプ TOleEnum の任意の整数値の変数を持ち、異なる列挙型の値を互いに割り当てることができます。タイプセーフではありません。

Delphi の COM がタイプ セーフな列挙型を代わりに使用できない理由は思いつきませんが、そうではありません。それについては何もできないのではないかと心配しています。おそらく、今後の Delphi 2009 バージョンでの TLB エディタの変更により、それが変わる可能性があります。

記録として: TLB エディタを使用しない場合、Delphi は、タイプ セーフな列挙型をパラメータとして持つメソッドとのインターフェイスを完全に持つことができます。

于 2008-09-02T20:59:59.410 に答える
1

Borland が TLB エディターでタイプ セーフな列挙型を使用しないことを選択した理由はわかっていると思います。COMの列挙型は異なる値にすることができますが、DelphiはDelphi 6(私が思うに)それができるのでのみです。

type
  TSomeEnum = (Enum1 = 1, Enum2 = 6, Enum3 = 80);  // Only since Delphi 6
于 2008-09-03T07:11:41.500 に答える