Delphi でインターフェイス型データから TGUID の const 配列を初期化するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/704346

質問

このように配列を初期化したい -

Const MyArray : Array[0..0] Of TGUID = (IInterface);

しかし、その結果は -

[DCC Error] Test.pas(10): E2010 Incompatible types: 'TGUID' and 'string'

それで何が起こるかを確認するためにこれを試してみました -

Const MyArray : Array[0..0] Of String = (IInterface);

その結果がこうなる!

[DCC Error] Test.pas(10): E2010 Incompatible types: 'string' and 'TGUID'

おかしいですね!確かに IInterface はどちらか一方ですが、頑固に間違った型に変換されているようです。

役に立ちましたか?

解決

あなたは、インターフェイス宣言からGUIDを引くと(文字列)の定数として宣言することができます。次に、あなたのインターフェイス宣言して、配列定数宣言でこれらの定数を使用することができます。コンパイラはTGUIDが期待されている有効なGUID文字列を受け付けます。無効な文字列は、コンパイルエラーE2204「不適切なGUID構文」になります。

const
  MyGuid1 = '{99BDAB12-B1B6-41B0-9BF1-2C1DB3D8EC70}';
  MyGuid2 = '{8C7CD303-8D81-469B-99ED-E1F163E9036F}';

type
  IMyInterface1 = interface
    [MyGuid1]
  end;

  IMyInterface2 = interface
    [MyGuid2]
  end;

const
  MyArray: array[0..1] of TGUID = (MyGuid1, MyGuid2);

他のヒント

あなたはconstの配列を使用する場合は、

あなたはこのようなconstの値でそれを設定する必要があります:

const GuidArray: array[0..0] of TGuid=
  ('{84DBCC66-72AA-4806-AE28-B55FC5B83FC8}');

私はC ++ Builderで試してみました。

const TGUID g = __uuidof(IInterface);
const TGUID MyArray[] = {__uuidof(IInterface)};

私は、明示的なキーワード__uuidofはあなたが持っている問題を回避するかもしれないと疑われるが、それは単に非常に最初の行が正常に動作しますsimilar.While、二番目の利回り何かに置き換えます:

[C++ Fehler] Unit1.cpp(9): E2034 Konvertierung von 'const _GUID' nach 'unsigned long' nicht möglich

(英:[C ++エラー] Unit1.cpp(9): 'CONST _GUID' からのE2034の変換 'unsigned long型' ことができない)

もう一つのアイデア:以下コンパイルます:

procedure Blah(const MyArray: array of TGUID);
begin
  //...
end;

Blah([IInterface, IDispatch]);

たぶん、あなたは、このアプローチを使用することができます。

GUID の配列を返す関数を作成できます。(私はこの手法を定数の日付値に使用します。)

  • これは「真の」定数ではありませんが、通常定数を使用する場所であればどこでも使用できるはずです。
  • ただし、「割り当て可能な型付き定数」オプションを使用して変更することもできません。 不正行為は許可されません:)
  • したがって、グローバルを設定するよりもわずかな利点があります。 初期化 セクション。
  • また、インターフェイスで使用される GUID を独自の定数に移動するよりも手作業が少なくなります。

動的配列を返すか、固定サイズの配列を返すかを選択できます。

オプション1

type
  TGUIDArray = array of TGUID;

function GetMyInterfaces: TGUIDArray;
begin
  SetLength(Result, 2);
  Result[0] := IMyInterface1;
  Result[1] := IMyInterface2;
end;

オプション 2

type
  TGUIDArray = array[0..1] of TGUID;

function GetMyInterfaces: TGUIDArray;
begin
  Result[0] := IMyInterface1;
  Result[1] := IMyInterface2;
end;

あなたはメソッドはIInterfaceの配列を作成することができます。

これは、伝統的に Delphi では const が実際には const ではないという事実を利用して私が発見した方法です。この動作に戻すにはコンパイラ スイッチが必要です (D2007 の場合)

{$J+}
Const MyArray : Array[0..0] Of TGUID = (());
{$J-}

初期化セクションでは -

MyArray[0] := IInterface;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top