문제

나는 첫 번째 멤버가 평소 0 (0)보다는 1 (1)의 서수 값을 갖기를 원하는 다음 열거 유형을 선언했습니다.

  type
    TMyEnum = (
               meFirstValue = 1,
               meSecondValue,
               meThirdValue
              );

내가 전화하면 typeinfo (), 예를 들어 전화의 일환으로 getenumname (), 컴파일러 오류가 발생합니다.

  GetEnumName(TypeInfo(TMyEnum), Ord(aValue));

오류 : "e2134 : type 'tmyenum'은 typeinfo가 없습니다."

왜 이런거야?

나는 클래스가 typeinfo만이 $ m 컴파일러 옵션 활성화 또는 (일부 클래스에서 파생, 예 : tpersistent) 그러나 나는 열거 유형에 대한 typeinfo를 갖는 특별한 조건이 있다고 생각하지 않았다.

도움이 되었습니까?

해결책 2

특정 서수 값이 할당되는 열거 값에 대해 유형 정보가 지원되지 않습니다.

특정 값이 필수적이거나 바람직한 경우 "사용하지 않은"열거 회원은 필요에 따라 열거를 "패드"에 삽입해야합니다. 예 : (강조만을위한 추가 들여 쓰기) :

  type
    TMyEnum = (
                meNOTUSED1,   {= 0}
               meFirstValue,  {= 1} 
               meSecondValue,
               meThirdValue
              );

그런 다음 서브 랜지를 사용하여 사용하지 않은 초기 값을 "필터링"할 수 있습니다.

   TValidMyEnum = meFirstValue..meThirdValue;

그런 다음 프로젝트 전체에서 서브 레인지 유형을 사용할 수 있도록 원래 열거 유형의 이름을 바꾸는 것을 고려할 수 있습니다.

열거에 "갭"이 포함 된 경우 서브 랜지가 충분하지 않습니다.

  type
    TMyEnum = (
                meNOTUSED1,   {= 0}
               meFirstValue,  {= 1} 
               meSecondValue,
               meThirdValue,
                meNOTUSED2,
               meFinalValue   {= 5}
              );

이 경우 사용하지 않은 회원을 제외하기 위해 컴파일 타임 범위 점검을 확장하는 방법은 없지만 몇 가지 세트 유형이 필요한 모든 구현 사업을 단순화합니다. 실행 시간 체크 무늬:

  type
    TMyEnums = set of TMyEnum;

  const
    meNOTUSED      = [meUNUSED1, meUNUSED2]; //  .. etc as required
    meValidValues  = [Low(TMyEnum)..High(TMyEnum)] - meNOTUSED;


  if NOT (aValue in meValidValues) then
     // etc

다른 팁

0에서 시작하지 않는 불연속 열거 및 열거에는 typeinfo가 없습니다. TypeInfo가 구현 되려면 뒤로 호환성 문제로 인해 기존의 tkenumeration과 다른 형식이어야합니다.

나는 Delphi 2010을 위해 tkdiscontiguouseUnumeration (또는 더 나은 명명 된 멤버)을 구현하는 것을 고려했지만, 상대적 부족과 열거의 어려움을 고려할 때 혜택은 작은 것처럼 보였습니다. 어떻게 범위를 효율적으로 인코딩합니까? 일부 인코딩은 일부 시나리오에서는 더 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top