클래스를 인스턴스화하고 싶지만 문자열에 이름 만 있습니다. 방법이 있습니까?델파이에서 이름으로 클래스를 인스턴스화하는 방법이 있습니까?
답변
이것은 델파이 도움말에서입니다 (델파이 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;
, 나는 내가 현재 너무 문자열 목록의 클래스는 내가 문자열로 객체를 다음 연결을 지원 델파이 7을 사용하고, 특별히 서브 클래스 TStringList를 사용 내 자신의 개체 공장 준공 TStringList를 서브 클래스 화하여 클래스 유형을 처리 할 수 있도록 했으므로 클래스 이름을 팩토리에 전달하는 객체를 인스턴스화 할 수 있습니다. 그런 식으로 작동합니다 :
1st - 싱글 톤 개체 팩토리로드;
2 번째 - 모든 개체를 공장에 등록하십시오. 장치의 초기화 섹션에있을 수 있습니다.
주 공장의 메소드는 다음과 같습니다. isClassRegistered, registerClass, instantiateClass (ClassName : STring) : TObject;
이 방법을 사용하면 어떤 객체를 인스턴스화하거나 이전 인스턴스화 된 객체 또는 심지어 그 하위 세트를 사용할 수 있습니다.
대신 클래스를 식별하기 위해 문자열 대신 열거 형을 사용합니다.
비고 : 아주 간결한 예입니다. 완전한 기능을하는 코드는 더 복잡하지만, 너무 많이하지는 마십시오.
- 1. java, 다른 이름으로 클래스를 가져올 수있는 방법이 있습니까
- 2. Silverlight XAML에서 '유형'을 인스턴스화하는 방법이 있습니까?
- 3. 개인 생성자가있는 클래스를 인스턴스화하는 방법
- 4. PHP 프로젝트에서 클래스를 인스턴스화하는 전략
- 5. 클래스를 인스턴스화하는 것과 동일한 __get 마법 메서드가 있습니까?
- 6. 클래스를 인스턴스화하는 방법 EJB 또는 POJO?
- 7. Java에서 Socket 클래스를 인스턴스화하는 방법은 무엇입니까?
- 8. 컨트롤러에서 IRepository 클래스를 인스턴스화하는 올바른 방법은 무엇입니까?
- 9. Grails : 이름으로 도메인 클래스를 찾으십시오.
- 10. 이 구문을 사용하여 클래스를 인스턴스화하는 특별한 이유가 있습니까?
- 11. 델파이에서 인터페이스 클래스와 구현 클래스를 분리 하시겠습니까?
- 12. Haskell에서 클래스를 올바르게 인스턴스화하는 방법은 무엇입니까?
- 13. Tomcat이 제공하는 클래스를 인스턴스화하는 Spring 3 애플리케이션
- 14. 델파이에서 사용되지 않는 이벤트 핸들러를 찾는 방법이 있습니까?
- 15. 매개 변수를 사용하여 변수 유형을 인스턴스화하는 우아한 방법이 있습니까?
- 16. 헤더 파일에 포인터를 선언하고 .cpp에서 인스턴스화하는 방법이 있습니까?
- 17. ClassLoader가로드 한 클래스를 가져 오는 방법이 있습니까?
- 18. Python의 클래스 메소드에서 클래스를 수정하는 방법이 있습니까?
- 19. 동적으로 버튼의 CSS 클래스를 변경하는 방법이 있습니까?
- 20. 이클립스를 사용하여 양식 클래스를 찾는 방법이 있습니까?
- 21. [incr Tcl] 클래스를 친구로 만드는 방법이 있습니까?
- 22. .NET 3.5에서 System.Collections.Concurrent 클래스를 가져올 방법이 있습니까?
- 23. C# 클래스를 PHP로 변환하는 쉬운 방법이 있습니까?
- 24. 하나의 클래스 이름으로 여러 개의 CSS 클래스를 지정할 수 있습니까?
- 25. 현재 요소 클래스를 배열 이름으로 사용 하시겠습니까?
- 26. Unity Framework : 동일한 인터페이스에서 두 개의 클래스를 인스턴스화하는 방법은 무엇입니까?
- 27. FileUtils를 UTF-8 파일 이름으로 사용할 수있는 방법이 있습니까?
- 28. jqgrid에서 열 이름으로 열 번호를 가져 오는 방법이 있습니까
- 29. 기본 경로 작업을 컨트롤러와 동일한 이름으로 설정하는 방법이 있습니까?
- 30. CodeIgniter에서 예약 된 PHP 단어를 컨트롤러 이름으로 사용하는 방법이 있습니까?
위대한 솔루션입니다. 하지만 이제 다른 문제가 생겼습니다. 인스턴스화하고 싶은 클래스는 인터페이스를 구현하는 클래스입니다. 그리고 registerClass는 영속 클래스와 함께 호출되어야합니다. 어떤 생각? –
TPersistent에서 조상을 구하거나 그 중 하나를 파생시킬 수 있습니까? –
인터페이스를 구현하고 TInterfaceObject에서 파생해야하기 때문에 저는 그렇게 믿지 않습니다. –