Tôi muốn khởi tạo một lớp nhưng tôi chỉ có tên của nó trong một chuỗi. Là có một cách?Có cách nào để khởi tạo một lớp theo tên của nó trong delphi?
Trả lời
Đâ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;
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.
- 1. Khởi tạo một lớp từ tên văn bản của nó
- 2. Bắt lớp theo tên của nó
- 3. Làm thế nào để lấy tham chiếu kiểu lớp bằng tên của nó trong Delphi XE?
- 4. Khởi tạo một lớp Python từ tên
- 5. khởi đối tượng lớp theo tên
- 6. Khởi tạo một lớp mới từ tên của một biến trong một không gian tên
- 7. Làm thế nào tôi có thể khởi tạo một đối tượng chỉ biết tên của nó?
- 8. Tạo đối tượng của một lớp có tên của nó trong biến chuỗi
- 9. .NET - cách tạo một lớp sao cho chỉ có một lớp cụ thể khác có thể khởi tạo nó?
- 10. Phản ánh trong Ruby. Khởi tạo một đối tượng theo tên lớp đã cho
- 11. Khởi tạo một lớp bằng trình khởi tạo siêu lớp
- 12. Làm cách nào để khởi tạo một std :: vector trong một hàm tạo lớp trong C++?
- 13. Làm thế nào tôi có thể tự động khởi tạo (theo tên lớp như một chuỗi) lớp để gọi getThings() trong ví dụ này?
- 14. Làm thế nào tôi có thể khởi tạo một biến const của một lớp cơ sở trong một lớp khởi tạo 'constructor trong C++?
- 15. PHP có thể khởi tạo một đối tượng từ tên của lớp dưới dạng chuỗi không?
- 16. Tôi có thể khởi tạo một lớp ẩn danh trong hàm tạo của lớp ngoài không?
- 17. Cách khởi tạo một lớp học?
- 18. Tạo đối tượng của lớp thông qua tên của nó được lưu trữ trong một chuỗi?
- 19. Có cách nào để tạo một hàm khởi tạo chỉ hiển thị với một lớp cha trong C#?
- 20. Việc khởi tạo một lớp lớn trên một trang có làm chậm nó xuống không?
- 21. Tạo một lớp từ chuỗi và khởi tạo nó trong Scala 2.10
- 22. Cách khởi tạo cấu trúc thành viên trong danh sách khởi tạo của lớp C++?
- 23. làm thế nào để khởi tạo một đối tượng của lớp từ chuỗi trong Objective-C?
- 24. Làm cách nào để tạo một lớp trong C# mà tôi có thể khởi tạo giống như một chuỗi?
- 25. khởi tạo tăng :: multi_array trong một lớp
- 26. Tạo một lớp PHP -> Tạo một đối tượng của nó trong một lớp khác
- 27. Có thể một thành viên của một lớp được đặt tên giống với tên của nó (lớp khác) không?
- 28. Làm thế nào để khởi tạo lớp từ chuỗi tên trong Rails?
- 29. Cách khởi tạo mảng trong java khi hàm tạo của lớp có các tham số?
- 30. Tạo một thể hiện của một lớp trong hàm tạo tĩnh của nó - tại sao nó được cho phép?
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? –
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? –
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 –