7

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

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 是其中之一,但它似乎顽固地转换为错误的类型。

4

7 回答 7

13

您可以从接口声明中提取 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);
于 2009-04-01T08:50:31.667 回答
3

如果您使用 const 数组,则必须使用 const 值设置它,如下所示:

const GuidArray: array[0..0] of TGuid=
  ('{84DBCC66-72AA-4806-AE28-B55FC5B83FC8}');
于 2009-04-01T07:48:26.103 回答
1

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

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

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

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

(英文:[C++ error] Unit1.cpp(9): E2034 Conversion from 'const _GUID' to 'unsigned long' not possible)

于 2009-04-01T08:29:12.637 回答
1

另一个想法:以下编译:

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

Blah([IInterface, IDispatch]);

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

于 2009-04-02T07:31:51.003 回答
1

您可以编写一个函数来返回您的 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;
于 2015-01-09T16:58:53.593 回答
0

您可以创建一个 IInterface 数组。

于 2009-04-01T07:13:13.957 回答
0

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

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

在初始化部分 -

MyArray[0] := IInterface;
于 2009-04-02T00:17:19.800 回答