2013-05-08 2 views
2

의 유형을 얻고,이 코드델파이 - I 정수 값에서 열거 값을 얻는 방법을 알고 열거

function GetEnumValue(intValue:integer):TMyType 
begin 
    if(ordValue >= Ord(Low(TMyType)))and(ordValue <= Ord(High(TMyType)))then 
     result :=TMyType(ordValue) 
    else 
     raise Exception.Create('ordValue out of TMyType range'); 
end; 

내가 TMyType 이외의 많은 열거 형에 대한 많은 장소에서 위와 같이 비슷한 코드가를 가지고하는 방법 , 그 코드를 기본 클래스의 단일 보호 코드에 캡슐화하여 상속 된 클래스에서 사용할 수 있도록합니다.

하지만 난 그게 바로 열거 형 또는 다른 종류의 객체

내가 어떤 개체 유형의 모든 TObject의 같은 열거 기본 클래스 (또는 단서가 질수 내 코드를 확인할 수 있도록 TMyType을 일반화하는 방법을 잘 모릅니다 모든 VCL 유형에 대한 TControl)을 사용하면 해당 코드를 확인할 수 있습니다.

+1

어떤 버전의 델파이입니까? –

답변

4

TObject가 클래스의 기본 클래스와 같은 열거 유형의 기본 유형은 없습니다.

generics를 지원하는 Delphi 버전이있는 경우 다음 도우미를 사용하여 서수 값에서 열거 형 값으로 일반 캐스트를 만들 수 있습니다.

uses 
    System.SysUtils,TypInfo; 

Type 
    TEnumHelp<TEnum> = record 
    type 
    ETEnumHelpError = class(Exception); 
    class function Cast(const Value: Integer): TEnum; static; 
    end; 

class function TEnumHelp<TEnum>.Cast(const Value: Integer): TEnum; 
var 
    typeInf : PTypeInfo; 
    typeData : PTypeData; 
begin 
    typeInf := PTypeInfo(TypeInfo(TEnum)); 
    if (typeInf = nil) or (typeInf^.Kind <> tkEnumeration) then 
    raise ETEnumHelpError.Create('Not an enumeration type'); 
    typeData := GetTypeData(typeInf); 
    if (Value < typeData^.MinValue) then 
    raise ETEnumHelpError.CreateFmt('%d is below min value [%d]',[Value,typeData^.MinValue]) 
    else 
    if (Value > typeData^.MaxValue) then 
    raise ETEnumHelpError.CreateFmt('%d is above max value [%d]',[Value,typeData^.MaxValue]); 
    case Sizeof(TEnum) of 
    1: pByte(@Result)^ := Value; 
    2: pWord(@Result)^ := Value; 
    4: pCardinal(@Result)^ := Value; 
    end; 
end; 

예 :

가 불연속 또는 0으로 시작하지 않는

열거가, 더 RTTI 정보 소속 카테고리가 없습니다 :

Type 
    TestEnum = (aA,bB,cC); 

var 
    e : TestEnum; 
... 
e := TEnumHelp<TestEnum>.Cast(2); // e = cC 

한 가지 제한이있다. RTTI properties not returned for fixed enumerations: is it a bug?을 참조하십시오.

+0

당신은 내 하루를 저장 ... 고마워 ... 내가 찾고, 너무 열심히이 같은 참조를 찾을 수 있고, 운이 좋았어 난 XE2를 사용 – navirius

+0

나는 캐스트 방법 일반 및 유형하지 것입니다. –

+0

@StefanGlienke, 당신은 'TEnumHelp.Cast (값 : 정수)'를 의미합니다. 그 이점은 무엇입니까? –