Delphi でインターフェイス型データから TGUID の const 配列を初期化するにはどうすればよいですか?
-
22-08-2019 - |
質問
このように配列を初期化したい -
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 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;