Come si fa a inizializzare una matrice const di TGUID dai dati di tipo di interfaccia, in Delphi?

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

Domanda

Voglio inizializzare un array come questo -

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

Ma il risultato e '-

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

Quindi, per vedere cosa sarebbe successo ho provato questo -

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

Il che si traduce in questo!

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

Che strano! Sicuramente IInterface è uno o l'altro, ma sembra a trasformare ostinatamente nel tipo sbagliato.

È stato utile?

Soluzione

Si può tirare i GUID dalle dichiarazioni di interfaccia e di dichiarare come (stringa) costanti. È quindi possibile utilizzare queste costanti nelle vostre dichiarazioni di interfaccia e l'array dichiarazioni di costanti. Il compilatore accetta validi stringhe GUID in cui si prevede TGUID. le stringhe non valide risultano in E2204 "sintassi GUID improprio" errore di compilazione.

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

Altri suggerimenti

Se si utilizza una matrice const è necessario configurarlo con valori const come questo:

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

Ho appena provato in C ++ Builder:

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

ho sospettato che la parola chiave esplicita __uuidof potrebbe evitare il problema che hai, ma si è limitata sostituisce con qualcosa di molto similar.While la prima linea funziona bene, la seconda rendimenti uno:

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

(in inglese: [C ++ errore] Unit1.cpp (9): E2034 La conversione da '_GUID const' a 'unsigned long' non è possibile)

Un'altra idea: le seguenti compila:

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

Blah([IInterface, IDispatch]);

Forse è possibile utilizzare questo approccio.

Si potrebbe scrivere una funzione per restituire la matrice di GUID. (Io uso questa tecnica per i valori di data costanti).

  • Non è "veramente" una costante, ma dovrebbe essere utilizzabile ovunque ci si normalmente utilizza la costante.
  • Ma, inoltre, non può essere modificato con l'opzione "assegnabili costanti digitati". non Cheating ammessi:)
  • Così ha un piccolo vantaggio rispetto l'impostazione di un globale nel di inizializzazione .
  • Inoltre, è meno lavoro manuale che spostare i GUID utilizzati dalle interfacce nelle proprie costanti.

Hai la possibilità di restituire un array di dimensioni dinamico o fisso.

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;

È possibile creare un array di IInterface.

Ecco un modo ho scoperto sfruttando il fatto che tradizionalmente, const non sono const davvero in Delphi. Richiede un compilatore switch per tornare a questo comportamento (In D2007)

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

Nella sezione di inizializzazione -

MyArray[0] := IInterface;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top