Como você inicializar uma matriz const de TGUID a partir de dados Tipo de interface, em Delphi?

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

Pergunta

Eu quero inicializar uma matriz como este -

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

Mas isso resulta em -

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

Então, para ver o que iria acontecer eu tentei isso -

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

Que resultados neste!

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

Que estranho! Certamente IInterface é um ou outro, mas parece transformar teimosamente para o tipo errado.

Foi útil?

Solução

Você pode puxar os GUIDs das declarações de interface e declará-los como (string) constantes. Você pode então usar essas constantes em suas declarações de interface e suas declarações constantes da matriz. O compilador aceita cadeias GUID válido onde TGUID é esperado. cordas inválidos resultar em E2204 "sintaxe GUID incorreto" erro de compilação.

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

Outras dicas

Se você usar uma matriz const você tem que configurá-lo com valores const como este:

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

Eu apenas tentei em C ++ Builder:

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

Eu suspeitava que a palavra-chave explícita __uuidof pode evitar o problema que você tem, mas apenas substitui-lo com algo muito similar.While a primeira linha funciona bem, os rendimentos segunda:

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

(em Inglês: [erro de C ++] Unit1.cpp (9): E2034 Conversão de 'const _GUID' to 'unsigned long' não é possível)

Outra idéia: As seguintes compilações:

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

Blah([IInterface, IDispatch]);

Talvez você possa usar essa abordagem.

Você poderia escrever uma função para retornar o conjunto de GUIDs. (Eu uso essa técnica para valores de data constantes.)

  • Não é "verdadeiramente" uma constante, mas deve ser utilizável onde quer que você normalmente utilizar a constante.
  • Mas também não pode ser modificada usando a opção "constantes digitadas atribuíveis". Cheating não permitidos:)
  • Por isso, tem uma pequena vantagem sobre a criação de um global no inicialização .
  • Além disso, é menos trabalho manual do que mudar os GUIDs utilizados pelas interfaces com as próprias constantes.

Você tem a opção de retornar um dinâmico ou matriz de tamanho fixo.

Opção 1

type
  TGUIDArray = array of TGUID;

function GetMyInterfaces: TGUIDArray;
begin
  SetLength(Result, 2);
  Result[0] := IMyInterface1;
  Result[1] := IMyInterface2;
end;

Opção 2

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

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

Você pode criar uma matriz de IInterface.

Aqui está uma maneira que eu descobri usando o fato de que, tradicionalmente, consts não são realmente const em delphi. Requer um parâmetro de compilador para retornar a esse comportamento (Em D2007)

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

Na seção de inicialização -

MyArray[0] := IInterface;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top