Frage

Ich möchte ein Array wie folgt initialisieren -

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

Aber es ergibt sich -

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

So zu sehen, was passieren würde ich dies versucht -

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

, die in diesen Ergebnisse!

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

Wie seltsam! Sicherlich IInterface ist die eine oder andere, aber es scheint sich hartnäckig in die falsche Art zu verwandeln.

War es hilfreich?

Lösung

Sie können die GUIDs von den Schnittstellen Erklärungen ziehen und sie als (string) Konstanten deklarieren. Anschließend können Sie diese Konstanten in Ihren Interface-Deklarationen und Ihre Array-Konstante Deklarationen verwenden. Der Compiler akzeptiert gültige GUID-Strings, wo TGUID erwartet wird. Ungültige Zeichenketten führen in E2204 "Eine falsche GUID-Syntax" Fehler kompiliert werden.

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

Andere Tipps

Wenn Sie eine const Array verwenden Sie es mit const Werte wie folgt ein:

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

Ich habe gerade versucht, in C ++ Builder:

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

Ich vermutete, dass die explizite Stichwort __uuidof könnte das Problem vermeiden Sie haben, aber es ersetzt nur mit etwas sehr similar.While die erste Zeile funktioniert gut, die zweite ergibt:

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

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

Eine andere Idee: Die folgenden compiliert:

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

Blah([IInterface, IDispatch]);

Vielleicht können Sie diesen Ansatz verwenden.

Sie können eine Funktion schreiben Sie Ihre Array von GUIDs zurückzukehren. (Ich benutze diese Technik für konstante Datumswerte.)

  • Es ist nicht „wirklich“ eine Konstante ist, sondern sollte verwendbar sein, wo Sie normalerweise die Konstante verwenden würden.
  • Es kann aber auch nicht geändert werden, um die „belegbare typisierte Konstanten“ Option. Cheating nicht erlaubt:)
  • So hat es einen kleinen Vorteil gegenüber einem globalen im Initialisierungsfestlegungsverarbeitung .
  • Außerdem ist es weniger Handarbeit als die GUIDs von den Schnittstellen in ihre eigenen Konstanten zu bewegen.

Sie haben die Wahl zwischen einer dynamische oder feste Größe Array zurück.

Option 1

type
  TGUIDArray = array of TGUID;

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

Option 2

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

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

Sie können ein Array von IInterface erstellen.

Hier ist eine Art, wie ich mit der Tatsache entdeckt, dass traditionell, consts sind wirklich nicht in delphi konst. Benötigt Schalter ein Compiler zu diesem Verhalten zurückzukehren (In D2007)

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

In Initialisierungssektion -

MyArray[0] := IInterface;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top