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

StackOverflow https://stackoverflow.com/questions/704346

Вопрос

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

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 — это то или другое, но он, похоже, упорно трансформируется в неправильный тип.

Это было полезно?

Решение

Вы можете извлечь 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 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++] 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.

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

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

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

MyArray[0] := IInterface;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top