2012-01-28 43 views
7

Google vô dụng đối với các loại tìm kiếm này, bởi vì bạn nhận được hàng trăm triệu kết quả tuyệt đối không có liên quan nào đến câu hỏi cụ thể.Tham chiếu Lớp là Thuộc tính

Câu hỏi đặt ra là đơn giản này:

  • Có thể có một tài sản tham khảo Class trong Delphi?
  • Nếu có, làm cách nào?

Đây là những gì tôi đã cố gắng ...

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; 

Đoạn mã trên biên dịch tốt, tuy nhiên thanh tra đối tượng không hiển thị ObjectType tài sản ở tất cả.

Mục tiêu của tôi ở đây (nếu bạn chưa đoán) là tạo nó để tôi có thể chọn một hậu duệ của lớp từ một lớp cơ sở cụ thể, để làm cho cùng một thành phần hoạt động theo một cách khác.

Tôi muốn thực hiện theo cách này để thành phần không cần biết trực tiếp về các lớp con (cần phải được mô-đun đầy đủ).

Hãy để tôi chỉ cần đảm bit này rõ ràng: tôi không thể sử dụng một Enum để lựa chọn giữa các loại sub-class là thành phần không thể liên kết trực tiếp đến các loại sub-class (Nó chỉ đơn giản không thể trong trường hợp đặc biệt này)

Dù sao ... cảm ơn trước!

+0

Thanh tra đối tượng không hiển thị thuộc tính vì không có trình chỉnh sửa thuộc tính đã đăng ký cho nó. – kludg

Trả lời

5

Bạn có thể tìm tất cả các lớp đi xuống từ một lớp cơ sở cụ thể: Delphi: At runtime find classes that descend from a given base class? và biến đây thành thuộc tính đặc biệt với danh sách giá trị sử dụng TPropertyEditor.

+0

Đánh dấu câu trả lời của bạn đúng như bạn đã trả lời trước tiên (và đây là câu trả lời đúng). Tôi sẽ không sử dụng phương pháp này vì tôi không muốn sử dụng bất kỳ RTTI nào trong hệ thống này. Quyết định đi với ý tưởng "thành phần liên kết chéo" (trong đó một thành phần của 'TMyObjectA' hoặc' TMyObjectB' liên kết đến một cá thể 'TMyComponent' thông qua một thuộc tính. – LaKraven

+0

Simon, hãy xem xét một trình soạn thảo thuộc tính như thế nào sẽ thực sự nắm giữ các loại lớp trong bối cảnh của một gói thời gian thiết kế. –

+0

David, vâng ... nó sẽ tương đối dễ dàng (sử dụng RTTI) để thêm một Trình chỉnh sửa thuộc tính để xử lý loại điều này ... nhưng như tôi đã nói trong bình luận trước của mình, tôi không muốn sử dụng RTTI trong biên dịch thực thi (mà tôi phải làm để có được Class từ Tên đủ điều kiện của nó như được lưu trữ trong DFM) – LaKraven

3

Nếu bạn định thực hiện điều này thì bạn cần cung cấp property editor. IDE không đi kèm với các trình soạn thảo thuộc tính cho các thuộc tính loại lớp. Bạn cũng cần phải xử lý .dfm persistence. Bạn sẽ viết loại lớp ra tệp .dfm dưới dạng chuỗi và khi tệp .dfm được đọc, bạn sẽ cần phải sửa tham chiếu. RTTI phong cách mới có thể làm điều đó.

Tuy nhiên, tôi không nghĩ rằng điều này thực sự khả thi vì lý do sau. Mã thời gian thiết kế của bạn chạy trong một gói bên trong IDE và không có quyền truy cập vào các kiểu lớp trong dự án đang hoạt động trong IDE. Các loại lớp đó chỉ tồn tại khi dự án đó chạy. Vì vậy, thuộc tính ObjectType trong mã trong câu hỏi của bạn không thể được gán cho bất kỳ điều gì có ý nghĩa trong gói thời gian thiết kế. Vâng, bạn có thể sử dụng nó cho các lớp được định nghĩa trong VCL và bất kỳ gói nào khác được cài đặt trong IDE của bạn nhưng tôi tưởng tượng bạn muốn sử dụng nó trên các lớp được định nghĩa trong dự án đang hoạt động.

Tôi nghĩ tất cả điều này có nghĩa là bạn nên sử dụng một thuộc tính chuỗi đơn giản và sửa chữa các tham chiếu kiểu lớp chỉ khi chạy.

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