Как инициализировать массив const TGUID из данных типа интерфейса в Delphi?

Я хочу инициализировать такой массив -

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 ответов


вы можете вытащить 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);

Если вы используете массив 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 может избежать проблемы, но оно просто заменяет его чем-то очень похожим.В то время как первая строка работает нормально, вторая дает:

[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' невозможно)


другая идея: следующие компиляции:

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.


вот как я обнаружил, используя тот факт, что традиционно, const на самом деле не const в delphi. Требует, чтобы переключатель компилятора возвращался к этому поведению (в D2007)

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

В разделе

MyArray[0] := IInterface;