2009-04-01 10 views
7

chcę zainicjować tablicę takiego -Jak zainicjować tablicę stałych TGUID z danych typu Interface, w Delphi?

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

Ale to skutkuje -

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

więc zobaczyć, co by się stało, to próbowałem -

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

co skutkuje to!

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

Dziwne! Z pewnością IInterface jest jednym lub drugim, ale wydaje się, że uparcie przekształca się w niewłaściwy typ.

Odpowiedz

11

Można wyciągnąć GUID z deklaracji interfejsu i zadeklarować je jako (ciąg) stałe. Następnie możesz użyć tych stałych w deklaracjach interfejsu i deklaracjach stałych tablicy. Kompilator akceptuje prawidłowe ciągi GUID, w których oczekuje się TGUID. Nieprawidłowe łańcuchy powodują błąd kompilacji E2204 "Nieprawidłowa składnia 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

Podoba mi się to, co najlepsze, to trochę bardziej ręczna praca, niż się spodziewałem, ale wygląda na to, że nie pozostawia żadnych pułapek dla kolejnych programistów, co jest najważniejsze. Dzięki! – David

0

Możesz utworzyć tablicę IInterface.

+0

I rzeczywiście potrzebujemy GUID jednak nie przypadki IInterface – David

3

Jeśli używasz const tablicę trzeba ustawić go z wartościami const tak:

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

Ach, to działa. Chciałem jednak pobierać identyfikatory GUID bezpośrednio z interfejsu, ponieważ ich ręczne synchronizowanie jest nieco niebezpieczne. – David

1

Próbowałem tylko w C++ Builder:

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

Podejrzewałem, że jawne słowo kluczowe __uuidof może uniknąć problemu, ale tylko zastępuje go czymś bardzo podobnym. Podczas gdy pierwsza linia działa poprawnie, druga daje:

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

(w języku angielskim: [C++ Błąd] Unit1.cpp (9): E2034 Konwersja z 'const _GUID' do 'unsigned long' nie jest możliwe)

+0

Co to jest po angielsku? –

+0

Ups. Będę edytować mój post. –

+0

To interesujące, czy istnieje odpowiednik __uuidof w Delphi? Po prostu robię Const MyGUID: TGUID = IInterface; wydał mi błąd. – David

0

Oto sposób, w jaki odkryłem, że tradycyjnie, consts nie są tak naprawdę const w delphi. Wymaga przełącznika kompilatora, aby powrócić do tego zachowania (W D2007)

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

W sekcji inicjalizacji -

MyArray[0] := IInterface; 
+1

Myślę, że w takim przypadku łatwiej byłoby po prostu użyć "var MyArray ...". :-) –

+0

O tak! Dobry punkt :-) – David

1

inny pomysł: Poniższe kompiluje:

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

Blah([IInterface, IDispatch]); 

Być może można użyć tego podejście.

+0

To całkiem fajne podejście. Zdarza się, że tak naprawdę nie pasuje do mojego przypadku, ale mogę sobie wyobrazić, że często potrafię przerobić rzeczy na tę metodę – David

1

Można napisać funkcję zwracającą tablicę identyfikatorów GUID. (Używam tej techniki do stałych wartości dat.)

  • To nie jest "prawdziwa" stała, ale powinna być użyta wszędzie tam, gdzie normalnie używasz stałej.
  • Ale nie można go również zmodyfikować za pomocą opcji "możliwe do przypisania stałe".Oszukiwanie nie jest dozwolone :)
  • Ma więc niewielką przewagę nad ustawianiem globalnym w sekcji inicjowania .
  • Ponadto jest to mniej ręczna praca niż przenoszenie identyfikatorów GUID używanych przez interfejsy do ich własnych stałych.

Masz wybór, aby zwrócić tablicę dynamiczną lub o stałym rozmiarze.

Wariant 1

type 
    TGUIDArray = array of TGUID; 

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

Wariant 2

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

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