델파이에서 인터페이스 유형 데이터에서 TGUID의 const 배열을 어떻게 초기화합니까?

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

문제

이런 배열을 초기화하고 싶습니다.

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

그러나 그것은 결과를 초래합니다.

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

그래서 무슨 일이 일어날 지보기 위해 이것을 시도했습니다.

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

결과가 발생합니다!

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

얼마나 이상합니다! 확실히 iinterface는 하나 또는 다른 하나이지만 완고하게 잘못된 유형으로 변모하는 것 같습니다.

도움이 되었습니까?

해결책

인터페이스 선언에서 안내서를 가져와 (문자열) 상수로 선언 할 수 있습니다. 그런 다음 인터페이스 선언 및 배열 상수 선언에서 이러한 상수를 사용할 수 있습니다. 컴파일러는 TGUID가 예상되는 유효한 안내 문자열을 수락합니다. 잘못된 문자열은 E2204 "부적절한 Guid Syntax"컴파일 오류를 초래합니다.

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

다른 팁

const 배열을 사용하는 경우 다음과 같은 const 값으로 설정해야합니다.

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

방금 C ++ Builder에서 시도했습니다.

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

명시적인 키워드 __UUIDOF가 귀하가 가진 문제를 피할 수 있다고 의심했지만 단지이를 매우 유사한 것으로 대체합니다. 첫 번째 줄은 잘 작동하지만 두 번째 줄은 다음과 같습니다.

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

(영어로 : [C ++ 오류] init1.cpp (9) : e2034 'const _guid'에서 'signed long'으로 변환 할 수 없습니다)

다른 아이디어 : 다음 컴파일 :

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

Blah([IInterface, IDispatch]);

이 접근법을 사용할 수 있습니다.

당신은 당신의 가이드 배열을 반환하기 위해 함수를 작성할 수 있습니다. (나는이 기술을 일정한 날짜 값에 사용합니다.)

  • "진정한"상수는 아니지만 일반적으로 상수를 사용하는 곳마다 사용할 수 있어야합니다.
  • 그러나 "할당 가능한 유형 상수"옵션을 사용하여 수정할 수도 없습니다. 부정 행위는 허용되지 않습니다 :)
  • 그래서 그것은 글로벌 설정보다 작은 이점이 있습니다. 초기화 부분.
  • 또한 인터페이스에서 사용하는 안내서를 자체 상수로 옮기는 것보다 수동 작업이 적습니다.

동적 또는 고정 크기 배열을 반환 할 수 있습니다.

옵션 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;

iinterface 배열을 만들 수 있습니다.

다음은 전통적으로 Consts가 실제로 Delphi에서 Const가 아니라는 사실을 사용하여 발견 한 방법입니다. 이 동작으로 돌아갈 수 있도록 컴파일러 스위치가 필요합니다 (D2007)

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

초기화 섹션에서 -

MyArray[0] := IInterface;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top