Comment avez-vous initialisez un tableau const de TGUID à partir des données de type d'interface, dans Delphi?

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

Question

Je veux initialiser un tableau comme celui-ci -

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

Mais il en résulte -

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

Alors, pour voir ce qui se passerait J'ai essayé -

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

Quels sont les résultats dans ce!

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

étrange! Sûrement IInterface est l'un ou l'autre, mais il semble transformer obstinément dans le mauvais type.

Était-ce utile?

La solution

Vous pouvez tirer les GUIDs des déclarations d'interface et de les déclarer comme des constantes (chaîne). Vous pouvez ensuite utiliser ces constantes dans vos déclarations d'interface et votre tableau des déclarations constantes. Le compilateur accepte des chaînes GUID valides où TGUID est prévu. chaînes non valides entraînent E2204 « syntaxe incorrecte GUID » erreur de compilation.

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

Autres conseils

Si vous utilisez un tableau const vous devez le configurer avec des valeurs const comme ceci:

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

Je viens d'essayer dans C ++ Builder:

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

Je me doutais bien que le mot-clé explicite __uuidof pourrait éviter le problème que vous avez, mais il ne fait que remplacer avec quelque chose de très similar.While la première ligne fonctionne très bien, le second, on obtient:

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

(en anglais: [C ++ error] Unit1.cpp (9): E2034 Conversion de 'const _GUID' à 'unsigned long' pas possible)

Une autre idée: Les compiles suivants:

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

Blah([IInterface, IDispatch]);

Peut-être que vous pouvez utiliser cette approche.

Vous pouvez écrire une fonction pour retourner votre tableau de GUIDs. (J'utilise cette technique pour les valeurs de date constantes).

  • Ce n'est pas « vraiment » une constante, mais devrait être utilisable partout où vous auriez normalement utiliser la constante.
  • Mais il a aussi ne peut pas être modifié en utilisant l'option « constantes assignables typé ». triche pas autorisés:)
  • Il a un petit avantage sur la fixation d'un mondial dans le initialisation section .
  • Aussi, il est le travail manuel que le déplacement des GUIDs utilisés par les interfaces dans leurs propres constantes.

Vous avez le choix de retourner un tableau de taille dynamique ou fixe.

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

Vous pouvez créer un tableau de IInterface.

Voici une façon que j'ai découvert en utilisant le fait que, traditionnellement, consts ne sont pas vraiment const delphi. Nécessite un commutateur de compilateur pour revenir à ce comportement (En D2007)

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

Dans la section d'initialisation -

MyArray[0] := IInterface;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top