델파이에서 인터페이스 유형 데이터에서 TGUID의 const 배열을 어떻게 초기화합니까?
-
22-08-2019 - |
문제
이런 배열을 초기화하고 싶습니다.
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;