¿Cómo se puede inicializar una matriz const de TGUID a partir de datos tipo de interfaz, en Delphi?

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

Pregunta

Quiero inicializar un array como esto -

Const MyArray : Array[0..0] Of TGUID = (IInterface);

Sin embargo, el resultado es -

[DCC Error] Test.pas(10): E2010 Incompatible types: 'TGUID' and 'string'

Así que para ver lo que sucedería He intentado esto -

Const MyArray : Array[0..0] Of String = (IInterface);

lo que se traduce en esto!

[DCC Error] Test.pas(10): E2010 Incompatible types: 'string' and 'TGUID'

Qué extraño! Seguramente IInterface es uno o el otro, pero parece transformar tenazmente en el tipo incorrecto.

¿Fue útil?

Solución

Puede tirar de los GUID de las declaraciones de interfaz, lo cuenten como constantes (cuerda). A continuación, puede utilizar estas constantes en sus declaraciones de interfaz y de la matriz de declaraciones de constantes. El compilador acepta cadenas GUID válido donde se espera TGUID. cadenas no válidas como resultado E2204 "sintaxis GUID incorrecto" Error de compilación.

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);

Otros consejos

Si utiliza una matriz const hay que configurarlo con los valores const como esta:

const GuidArray: array[0..0] of TGuid=
  ('{84DBCC66-72AA-4806-AE28-B55FC5B83FC8}');

he intentado en C ++ Builder:

const TGUID g = __uuidof(IInterface);
const TGUID MyArray[] = {__uuidof(IInterface)};

Yo sospechaba que la palabra clave explícita __uuidof podría evitar el problema que tiene, pero simplemente lo reemplaza con algo muy similar.While la primera línea funciona bien, el segundo rendimientos uno:

[C++ Fehler] Unit1.cpp(9): E2034 Konvertierung von 'const _GUID' nach 'unsigned long' nicht möglich

(en Inglés: [C ++ error] Unit1.cpp (9): e2034 La conversión de '_GUID const' a 'unsigned long' no es posible)

Otra idea: Los siguientes compilaciones:

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

Blah([IInterface, IDispatch]);

Tal vez se puede utilizar este método.

Se puede escribir una función para devolver su gama de GUID. (I utilizar esta técnica para los valores de fecha constantes.)

  • No es "realmente" una constante, sino que debe ser utilizable donde quiera que tendría que utilizar normalmente la constante.
  • Pero también no se puede modificar mediante la opción "asignables constantes al escribir". No es trampa permitidos:)
  • Por lo tanto, tiene una pequeña ventaja sobre el establecimiento de un mundial en el inicialización sección .
  • Además, es menos trabajo manual de mover los GUID utilizados por las interfaces en 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;

Opción 2

type
  TGUIDArray = array[0..1] of TGUID;

function GetMyInterfaces: TGUIDArray;
begin
  Result[0] := IMyInterface1;
  Result[1] := IMyInterface2;
end;

Puede crear una matriz de IInterface.

Aquí está una manera he descubierto usando el hecho de que, tradicionalmente, consts 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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top