2009-03-31 4 views

답변

28

이것은 델파이 도움말에서입니다 (델파이 2006,하지만에서도보실 적어도 델파이 7) :

구문 기능 GetClass (CONST AClassName : 문자열) : TPersistentClass;

설명 GetClass를 호출하여 클래스 이름에서 클래스를 가져옵니다. 이 클래스는 클래스가 필요한 루틴에 대한 매개 변수로 사용할 수 있습니다. 클래스는 GetClass가 그것을 발견하기 전에 등록되어야합니다. 양식 선언시 참조되는 양식 클래스 및 구성 요소 클래스 (인스턴스 변수)는 양식로드시 자동으로 등록됩니다. RegisterClass 또는 RegisterClasses를 호출하여 다른 클래스를 등록 할 수 있습니다.

여기 몇 가지 샘플 코드입니다. TButton이 TControl이고 따라서 타입 변환이 유효하기 때문에 그런 식으로 작동합니다. 나는 그것을 할 필요하면

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    RegisterClasses([TButton, TForm]); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    CRef : TPersistentClass; 
    AControl : TControl; 
begin 
    CRef := GetClass('TButton'); 
    if CRef<>nil then 
    begin 
    AControl := TControl(TControlClass(CRef).Create(Self)); 
    with AControl do 
    begin 
     Parent := Self; 
     Width := 50; 
     Height := 30; 
    end; 
    end; 
end; 
+0

위대한 솔루션입니다. 하지만 이제 다른 문제가 생겼습니다. 인스턴스화하고 싶은 클래스는 인터페이스를 구현하는 클래스입니다. 그리고 registerClass는 영속 클래스와 함께 호출되어야합니다. 어떤 생각? –

+0

TPersistent에서 조상을 구하거나 그 중 하나를 파생시킬 수 있습니까? –

+0

인터페이스를 구현하고 TInterfaceObject에서 파생해야하기 때문에 저는 그렇게 믿지 않습니다. –

2

, 나는 내가 현재 너무 문자열 목록의 클래스는 내가 문자열로 객체를 다음 연결을 지원 델파이 7을 사용하고, 특별히 서브 클래스 TStringList를 사용 내 자신의 개체 공장 준공 TStringList를 서브 클래스 화하여 클래스 유형을 처리 할 수 ​​있도록 했으므로 클래스 이름을 팩토리에 전달하는 객체를 인스턴스화 할 수 있습니다. 그런 식으로 작동합니다 :

1st - 싱글 톤 개체 팩토리로드;
2 번째 - 모든 개체를 공장에 등록하십시오. 장치의 초기화 섹션에있을 수 있습니다.

주 공장의 메소드는 다음과 같습니다. isClassRegistered, registerClass, instantiateClass (ClassName : STring) : TObject;

이 방법을 사용하면 어떤 객체를 인스턴스화하거나 이전 인스턴스화 된 객체 또는 심지어 그 하위 세트를 사용할 수 있습니다.

대신 클래스를 식별하기 위해 문자열 대신 열거 형을 사용합니다.

비고 : 아주 간결한 예입니다. 완전한 기능을하는 코드는 더 복잡하지만, 너무 많이하지는 마십시오.

관련 문제