在Delphi中,如何从接口类型数据初始化一个TGUID的const数组?

时间:2009-04-01 07:07:47

标签: delphi interface guid array-initialize

我想初始化一个这样的数组 -

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是一种或另一种,但似乎顽固地转变为错误的类型。

7 个答案:

答案 0 :(得分:11)

您可以从接口声明中提取GUID并将它们声明为(字符串)常量。然后,您可以在接口声明和数组常量声明中使用这些常量。编译器接受有效的GUID字符串,其中包含TGUID。无效的字符串会导致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);

答案 1 :(得分:3)

如果你使用const数组,你必须使用这样的const值设置它:

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

答案 2 :(得分:1)

我刚刚在C ++ Builder中尝试过:

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

我怀疑显式关键字__uuid可能会避免你遇到的问题,但它只是用非常类似的东西替换它。虽然第一行工作正常,但第二行产生:

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

(英文:[C ++ error] Unit1.cpp(9):E2034无法从'const _GUID'转换为'unsigned long')

答案 3 :(得分:1)

另一个想法:以下编译:

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

Blah([IInterface, IDispatch]);

也许你可以使用这种方法。

答案 4 :(得分:1)

您可以编写一个函数来返回GUID数组。 (我将此技术用于常量日期值。)

  • 它不是“真正的”常数,但在通常使用常量的任何地方都应该可用。
  • 但它也无法使用“assignable typed constants”选项进行修改。 作弊不允许:)
  • 因此,与初始化部分中的全局设置相比,它有一个小优势。
  • 此外,与将接口使用的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;

答案 5 :(得分:0)

您可以创建一个IInterface数组。

答案 6 :(得分:0)

这是我发现的一种方式,传统上,consts在delphi中并不是真正的const。需要编译器开关才能返回此行为(在D2007中)

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

在初始化部分 -

MyArray[0] := IInterface;