2012-04-02 2 views
6

Delphi에서 열거 형 값의 특성을 처리 할 수 ​​없으므로 다른 접근 방식을 시도했습니다. TMyEnum이 제 enum입니다. TMyEnumLabelProvider 클래스는 필 요한 레이블을 제공합니다. enum-type과 속성을 labelprovider에 연결합니다. 그러나 이것은 컴파일되지 않습니다. 그 메소드 중 하나에서 TMyEnum을 사용하기 때문에 classtype을 참조하기 전에 제공자를 완전히 정의 할 수 없습니다.Delphi 속성 생성자에서 특정 클래스 유형 참조 사용

TEnumLabelProviderCallback = procedure(Context: TObject; 
             Index: integer; 
             const Name: string) of object; 

TEnumLabelProvider = class abstract 
public 
    procedure Iterate(Context: TObject; 
         Callback: TEnumLabelProviderCallback); virtual; abstract; 
end; 

TEnumLabelProviderClass = class of TEnumLabelProvider; 

TEnumLabelProviderAttribute = class(TCustomAttribute) 
private 
    FProviderClass: TEnumLabelProviderClass; 
public 
    constructor Create(ProviderClass: TEnumLabelProviderClass); 
    property ProviderClass: TEnumLabelProviderClass read FProviderClass; 
end; 

TMyEnumLabelProvider = class; 

{$SCOPEDENUMS ON} 

[TEnumLabelProvider(TMyEnumLabelProvider)] 
TMyEnum = (MyEnum0, 
      MyEnum1, 
      MyEnum2); 
{$SCOPEDENUMS OFF} 

// This is where the compilation fails..... 
TMyEnumLabelProvider = class(TEnumLabelProvider) 
public 
    class function GetLabel(MyEnum: TMyEnum): string; 
    procedure Iterate(Context: TObject; Callback: TEnumLabelProviderCallback); override; 
end; 

올바르게 수행하는 방법에 대한 아이디어. 지금은 GetLabel (MyEnum : integer)을 선언하여 해결 방법을 제시하고 있지만 분명히 엄격한 형식을 선호합니다.

미리 감사드립니다.

+0

두 번째 생각에는 클래스 도우미를 사용하여이 문제를 해결할 수있었습니다. int를 사용하는 것보다 우아하지는 않지만 더 좋음 : 'TMyEnumLabelProvider = 클래스 (TEnumLabelProvider) public 프로 시저 반복 (컨텍스트 : TObject; 콜백 : TEnumLabelProviderCallback); 보수; 끝; [TEnumLabelProvider (TMyEnumLabelProvider)] TMyEnum = (MyEnum0, MyEnum1, MyEnum2); TMyEnumLabelProviderHelper = TMyEnumLabelProvider의 클래스 도우미 public 클래스 함수 GetLabel (MyEnum : TMyEnum) : string; end;' –

+1

실례지만, 성취하고자하는 것을 찾을 수는 없습니다. 예를 들어 "열거 형 레이블"은 무엇을 의미합니까? –

+0

@UweRaabe 그는 UI에 표시되는 열거 형 요소에 연결된 문자열을 의미한다고 생각합니다. 예를 들어 바인딩 프레임 워크를 생각해보십시오. – jpfollenius

답변

2

가장 간단한 해결책은 아래 정의 된대로 레이블을 저장하기 위해 정적 문자열 배열을 사용하는 것입니다. 열거 형을 사용하여 배열을 색인화하여 필요한 레이블을 가져올 수 있습니다.

type 
    TMyEnum = (MyEnum0, MyEnum1, MyEnum2); 

const 
    EnumLabels : array[TMyEnum] of string = ('MyEnumLabel0', 'MyEnumLabel1', 'MyEnumLabel2');