¿Cómo se inicializa una matriz constante de TGUID a partir de datos de tipo de interfaz en Delphi?
interface array-initialize (7)
Quiero inicializar una matriz como esta -
Const MyArray : Array[0..0] Of TGUID = (IInterface);
Pero resulta en -
[DCC Error] Test.pas(10): E2010 Incompatible types: ''TGUID'' and ''string''
Entonces, para ver qué pasaría, intenté esto:
Const MyArray : Array[0..0] Of String = (IInterface);
¡Lo que resulta en esto!
[DCC Error] Test.pas(10): E2010 Incompatible types: ''string'' and ''TGUID''
¡Que extraño! Sin duda, la interfaz es una u otra, pero parece transformarse obstinadamente en el tipo equivocado.
Acabo de probar en C ++ Builder:
const TGUID g = __uuidof(IInterface);
const TGUID MyArray[] = {__uuidof(IInterface)};
Sospeché que la palabra clave explícita __uuidof podría evitar el problema que tienes, pero simplemente lo reemplaza con algo muy similar. Mientras que la primera línea funciona bien, la segunda cede:
[C++ Fehler] Unit1.cpp(9): E2034 Konvertierung von ''const _GUID'' nach ''unsigned long'' nicht möglich
(en inglés: [Error de C ++] Unit1.cpp (9): E2034 No es posible la conversión de ''const _GUID'' a ''unsigned long'')
Puede crear una matriz de IInterface.
Puede extraer los GUID de las declaraciones de interfaz y declararlas como constantes (de cadena). Puede usar estas constantes en sus declaraciones de interfaz y sus declaraciones de constante de matriz. El compilador acepta cadenas GUID válidas donde se espera TGUID. Las cadenas no válidas producen un error de compilación E2204 "sintaxis GUID incorrecta".
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);
Si usa una matriz de const, debe configurarla con valores de const como este:
const GuidArray: array[0..0] of TGuid=
(''{84DBCC66-72AA-4806-AE28-B55FC5B83FC8}'');
Esta es una forma que descubrí usando el hecho de que tradicionalmente, las constelaciones no son realmente const en delphi. Requiere un modificador de compilador para volver a este comportamiento (en D2007)
{$J+}
Const MyArray : Array[0..0] Of TGUID = (());
{$J-}
En la sección de inicialización -
MyArray[0] := IInterface;
Otra idea: las siguientes compilaciones:
procedure Blah(const MyArray: array of TGUID);
begin
//...
end;
Blah([IInterface, IDispatch]);
Tal vez puedas usar este enfoque.
Podría escribir una función para devolver su matriz de GUID. (Utilizo esta técnica para valores de fecha constante).
- No es "realmente" una constante, pero debería poder usarse dondequiera que normalmente se use la constante.
- Pero tampoco puede ser modificado usando la opción de "constantes tipeados asignables". Hacer trampa no está permitido :)
- Por lo tanto, tiene una pequeña ventaja sobre la configuración de un global en la sección de inicialización .
- Además, es menos trabajo manual que mover los GUID utilizados por las interfaces a sus propias constantes.
Usted tiene la opción de devolver una matriz de tamaño fijo o dinámico.
Opción 1
type
TGUIDArray = array of TGUID;
function GetMyInterfaces: TGUIDArray;
begin
SetLength(Result, 2);
Result[0] := IMyInterface1;
Result[1] := IMyInterface2;
end;
opcion 2
type
TGUIDArray = array[0..1] of TGUID;
function GetMyInterfaces: TGUIDArray;
begin
Result[0] := IMyInterface1;
Result[1] := IMyInterface2;
end;