2009-03-31 26 views

Trả lời

28

Đây là từ Delphi giúp đỡ (Delphi năm 2006, nhưng cũng có sẵn từ ít nhất Delphi 7):

Cú pháp getClass function (const AClassName: string): TPersistentClass;

Mô tả Gọi GetClass để lấy lớp học từ tên lớp học. Lớp này có thể được sử dụng như một tham số cho các thường trình yêu cầu một lớp. Lớp học phải được đăng ký trước khi GetClass có thể tìm thấy nó. Các lớp biểu mẫu và các lớp thành phần được tham chiếu trong một khai báo biểu mẫu (các biến mẫu) được tự động đăng ký khi biểu mẫu được nạp. Các lớp khác có thể được đăng ký bằng cách gọi RegisterClass hoặc RegisterClasses.

Đây là một số mã mẫu. Làm việc như vậy chỉ vì TButton là một TControl và do đó các typecast là hợp lệ.

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

Giải pháp tuyệt vời. Nhưng bây giờ tôi đã gặp phải một vấn đề khác. Lớp tôi muốn khởi tạo là một lớp của riêng tôi mà thực hiện một Giao diện. Và registerClass phải được gọi với một lớp liên tục. Bất kỳ ý tưởng? –

+0

Có thể lấy được lớp học của bạn hay một trong những tổ tiên của nó từ TPersistent? –

+0

Tôi không tin như vậy, vì nó thực hiện một giao diện và nó có nguồn gốc từ TInterfaceObject –

2

Khi tôi cần thiết để làm điều đó, tôi xây dựng Nhà máy Object riêng tôi có sử dụng một TStringList đặc biệt subclassed, Tôi hiện đang sử dụng Delphi 7 vì vậy lớp danh sách chuỗi hỗ trợ chỉ đính kèm một đối tượng vào một String, sau đó tôi có để phân lớp TStringList để làm cho nó có thể xử lý các loại Class quá, vì vậy bây giờ tôi có thể nhanh chóng một đối tượng chỉ cần đi qua tên lớp của nó đến nhà máy. Hoạt động theo cách đó:

1st - Tải một Nhà máy đối tượng Singleton;
2st - Đăng ký bất kỳ đối tượng nào cho nhà máy, có thể nằm trong phần khởi tạo của thiết bị;

Phương thức của Nhà máy chính có thể là: isClassRegistered, registerClass, instantiateClass (ClassName: STring): TObject;

Bằng cách này tôi có thể khởi tạo bất kỳ đối tượng nào hoặc sử dụng đối tượng đã được tạo trước đó hoặc thậm chí là một tập con của chúng.

Tôi thích sử dụng một loại được liệt kê thay vì một chuỗi để xác định một lớp.

Lưu ý: Đó là một ví dụ rất, rất ngắn gọn, một mã hoàn toàn chức năng phức tạp hơn, nhưng, hãy tin tôi, không quá nhiều.

Các vấn đề liên quan