Как инициализировать константный массив TGUID из данных типа интерфейса в Delphi?
-
22-08-2019 - |
Вопрос
Я хочу инициализировать массив следующим образом:
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;