How do you initialise a const array of TGUID from Interface type data, in Delphi?

核能气质少年 提交于 2019-11-28 00:31:51

问题


I want to initialise an array like this -

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

But it results in -

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

So to see what would happen I tried this -

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

Which results in this!

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

How strange! Surely IInterface is one or the other, but it seems to stubbornly transform into the wrong type.


回答1:


You can pull the GUIDs from the interface declarations and declare them as (string) constants. You can then use these constants in your interface declarations and your array constant declarations. The compiler accepts valid GUID strings where TGUID is expected. Invalid strings result in E2204 "Improper GUID syntax" compile error.

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);



回答2:


If you use a const array you have to set it up with const values like this:

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



回答3:


I just tried in C++Builder:

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

I suspected that the explicit keyword __uuidof might avoid the problem you have, but it merely replaces it with something very similar.While the first line works fine, the second one yields:

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

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




回答4:


Another idea: The following compiles:

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

Blah([IInterface, IDispatch]);

Maybe you can use this approach.




回答5:


You could write a function to return your array of GUIDs. (I use this technique for constant date values.)

  • It's not "truly" a constant, but should be usable wherever you'd ordinarily use the constant.
  • But it also cannot be modified using the "assignable typed constants" option. Cheating not allowed :)
  • So it has a tiny advantage over setting a global in the initialization section.
  • Also, it's less manual work than moving the GUIDs used by the interfaces into their own constants.

You have the choice of returning a dynamic or fixed size array.

Option 1

type
  TGUIDArray = array of TGUID;

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

Option 2

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

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



回答6:


You can create an array of IInterface.




回答7:


Here's a way I discovered using the fact that traditionally, consts are not really const in delphi. Requires a compiler switch to return to this behaviour (In D2007)

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

In initialization section -

MyArray[0] := IInterface;


来源:https://stackoverflow.com/questions/704346/how-do-you-initialise-a-const-array-of-tguid-from-interface-type-data-in-delphi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!