2009-04-01 10 views
7

Voglio inizializzare un array come questo -Come inizializzare un array const di TGUID dai dati del tipo di interfaccia, in Delphi?

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

che si traduce in Questo!

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

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

risposta

11

Si può tirare i GUID dalle dichiarazioni di interfaccia e di dichiarare come (stringa) costanti. È quindi possibile utilizzare queste costanti nelle dichiarazioni dell'interfaccia e nelle dichiarazioni delle costanti degli array. Il compilatore accetta stringhe GUID valide in cui è previsto TGUID. Le stringhe non valide risultano in E2204 Errore di compilazione "Errore di sintassi GUID".

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

Mi piace il migliore, è un lavoro un po 'più manuale di quanto avrei sperato ma sembra che non lasci trappole per nessun programmatore successivo, che è la cosa più importante. Grazie! – David

0

È possibile creare un array di IInterface.

+0

ho effettivamente bisogno i GUID, però, non le istanze di IInterface – David

3

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}'); 
+0

Ah, che funziona. Volevo però estrarre i GUID direttamente dal tipo di interfaccia, poiché mantenerli sincronizzati manualmente è un po 'pericoloso. – David

1

Ho appena provato in C++ Builder:

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

ho sospettato che l'esplicito la parola chiave __uuidof potrebbe evitare il problema che si ha, ma semplicemente la sostituisce con qualcosa di molto simile. Mentre la prima linea funziona bene, la seconda produce:

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

+0

Cosa c'è in inglese? –

+0

Oops. Modificherò il mio post. –

+0

Questo è interessante, c'è un __uuidof equivalente in Delphi? Basta fare Const MyGUID: TGUID = IInterface; ha prodotto un errore per me. – David

0

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

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

Nella sezione di inizializzazione -

MyArray[0] := IInterface; 
+1

Immagino che in tal caso sarebbe più semplice usare "var MyArray ...". :-) –

+0

Oh sì! Buon punto :-) – David

1

Un'altra idea: Le seguenti compila:

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

Blah([IInterface, IDispatch]); 

forse è possibile utilizzare questo approccio.

+0

Questo è un buon approccio. Capita davvero di non adattarsi al mio caso, ma posso immaginare spesso di poter rielaborare le cose con questo metodo – David

1

È possibile scrivere una funzione per restituire l'array di GUID. (Io uso questa tecnica per i valori di data costante.)

  • Non è "veramente" una costante, ma dovrebbe essere utilizzabile ovunque si usi normalmente la costante.
  • Ma non può essere modificato anche tramite l'opzione "Costanti digitazione assegnabile".Cheating not allowed :)
  • Quindi ha un piccolo vantaggio rispetto all'impostazione di una sezione di inizializzazione .
  • Inoltre, è meno lavoro manuale che spostare i GUID utilizzati dalle interfacce nelle proprie costanti.

Avete la scelta di restituire una matrice di dimensioni dinamiche o fisse.

Opzione 1

type 
    TGUIDArray = array of TGUID; 

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

Opzione 2

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

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