Как инициализировать массив констант TGUID из данных типа интерфейса в Delphi? - PullRequest
7 голосов
/ 01 апреля 2009

Я хочу инициализировать массив следующим образом -

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'

Как странно! Конечно, Интерфейс один или другой, но, похоже, он упрямо превращается в неправильный тип.

Ответы [ 7 ]

11 голосов
/ 01 апреля 2009

Вы можете извлечь 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);
3 голосов
/ 01 апреля 2009

Если вы используете константный массив, вы должны установить его с помощью константных значений, таких как:

const GuidArray: array[0..0] of TGuid=
  ('{84DBCC66-72AA-4806-AE28-B55FC5B83FC8}');
1 голос
/ 09 января 2015

Вы можете написать функцию для возврата массива идентификаторов GUID. (Я использую эту технику для постоянных значений даты.)

  • Это не «действительно» константа, но она должна использоваться везде, где вы обычно используете константу.
  • Но его также нельзя изменить с помощью параметра «присваиваемые типизированные константы». Обман запрещен:)
  • Таким образом, у него есть крошечное преимущество перед установкой глобала в секции initialization .
  • Кроме того, это меньше ручная работа, чем перемещение 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;
1 голос
/ 02 апреля 2009

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

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

Blah([IInterface, IDispatch]);

Может быть, вы можете использовать этот подход.

1 голос
/ 01 апреля 2009

Я только что попробовал в 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 ++] Unit1.cpp (9): E2034 Преобразование из 'const _GUID' в 'unsigned long' невозможно)

0 голосов
/ 02 апреля 2009

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

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

В разделе инициализации -

MyArray[0] := IInterface;
0 голосов
/ 01 апреля 2009

Вы можете создать массив IInterface.

...