2012-01-28 5 views
7

Google은 이러한 종류의 검색에는 쓸모가 없습니다. 특정 질문과 관련이없는 수억 개의 결과가 있기 때문입니다.속성으로 클래스 참조

문제는 단순히이 :

  • 은 델파이에서 클래스 참조 속성을 가질 수 있습니까?
  • 그렇다면 어떻게됩니까?

다음은 그러나 오브젝트 인스펙터가 전혀 ObjectType 속성을 표시하지 않습니다,

type 

    TMyObject = class 
    // ... 
    end; 

    TMyObjectClass = class of TMyObject 

    TMyObjectA = class(TMyObject) 
    // specifics here 
    end; 

    TMyObjectB =class(TMyObject) 
    // specifics here 
    end; 

    TMyComponent = class(TComponent) 
    private 
    FObjectType: TMyObjectClass; 
    published 
    property ObjectType: TMyObjectClass read FObjectType write FObjectType; 
    end; 

위의 코드는 잘 컴파일 ... 내가 무엇을 시도했다입니다.

내 목표는 (이미 짐작하지 않았다면) 동일한 기본 구성 요소에서 클래스 하위 클래스를 선택하여 동일한 구성 요소가 다른 방식으로 동작하도록하는 것입니다.

구성 요소가 하위 클래스에 대해 직접 알 필요가 없도록이 방법을 사용하고 싶습니다. (은 모듈화가 완벽해야합니다 (). 그것은이 특별한 경우 단순히 불가능 (내가 구성 요소가 직접 하위 클래스 유형에 링크 할 수 없기 때문에, 서브 클래스 유형 사이에서 선택을 열거을 사용할 수 없습니다 을 :

나를 그냥 분명이 비트를 만들어 보자)

어쨌든 ... 미리 감사드립니다!

+0

개체 속성은 등록 된 속성 편집기가 없으므로 속성을 표시하지 않습니다. – kludg

답변

5

특정 기본 클래스의 하위 클래스 인 Delphi: At runtime find classes that descend from a given base class?을 찾을 수 있으며이 목록을 TPropertyEditor을 사용하는 값 ​​목록과 함께 특별 속성으로 지정할 수 있습니다.

+0

답변을 처음으로 답변으로 표시했습니다 (물론 정답입니다). 이 시스템에서는 RTTI를 사용하고 싶지 않기 때문에이 방법을 사용하지 않을 것입니다. 'TMyObjectA' 또는'TMyObjectB'의 구성 요소가 속성을 통해'TMyComponent' 인스턴스에 링크되는 "상호 링크 된 구성 요소"개념으로 가기로 결정했습니다. – LaKraven

+0

Simon, 그러한 속성 편집기가 디자인 타임 패키지의 컨텍스트에서 실제로 클래스 유형을 확보하는 방법을 고려하십시오. –

+0

David, 예 ... RTTI를 사용하여 Property Editor를 추가하는 것이 상대적으로 쉽습니다. 그러나 이전 코멘트에서 말한 것처럼 RTTI를 사용하고 싶지 않습니다. 컴파일 된 실행 파일 (DFM에 저장된 정규화 된 클래스에서 클래스를 가져와야 함) – LaKraven

3

이 작업을 수행하려는 경우 property editor을 제공해야합니다. IDE에는 클래스 유형 속성에 대한 속성 편집기가 함께 제공되지 않습니다. 또한 .dfm 지속성을 처리해야합니다. .dfm 파일에 클래스 유형을 문자열로 쓰고 .dfm 파일을 읽을 때 참조를 수정해야합니다. 새로운 스타일의 RTTI가 그렇게 할 수 있습니다.

그러나 저는 다음과 같은 이유로이 중 어떤 것도 실제로 실행 가능하다고 생각하지 않습니다. 디자인 타임 코드는 IDE 내부의 패키지에서 실행되며 IDE의 활성 프로젝트에있는 클래스 유형에 액세스 할 수 없습니다. 이러한 클래스 유형은 해당 프로젝트가 실행될 때만 존재합니다. 따라서 질문의 코드에있는 ObjectType 속성을 디자인 타임 패키지의 의미있는 항목에 할당 할 수 없습니다. 글쎄, 당신은 VCL과 IDE에 설치된 다른 패키지들에 정의 된 클래스들을 위해 사용할 수 있지만, 나는 당신이 활성 프로젝트에 정의 된 클래스들에서 그것을 사용하기를 원한다고 생각합니다.

나는 이것이 단순 문자열 속성을 사용하고 런타임에만 클래스 유형 참조를 수정해야한다는 것을 의미한다고 생각합니다.

관련 문제