2012-01-28 12 views
7

Google jest bezużyteczny dla tego rodzaju wyszukiwań, ponieważ dostajesz setki milionów wyników, absolutnie żadne z nich nie odnosi się do konkretnego pytania.Odsyłacz do klasy jako właściwość

Pytanie brzmi po prostu tak:

  • Czy to możliwe, aby mieć obiekt referencyjny klasy w Delphi?
  • Jeśli tak, w jaki sposób?

Oto co próbowałem ...

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; 

Powyższy kod kompiluje grzywny, jednak inspektor Obiekt nie wykazują właściwość ObjectType w ogóle.

Moim celem tutaj (jeśli jeszcze nie zgadłeś) jest uczynienie go tak, żebym mógł wybrać potomka klasy z konkretnej klasy bazowej, aby ten sam komponent zachowywał się w inny sposób.

Chcę zrobić to w ten sposób, aby komponent nie musiał bezpośrednio znać podklas (musi być w pełni modułowy).

Niech mi tylko zrobić ten bit jasne: nie mogę użyć enum wybierać pomiędzy typami podklasa jako składnik nie może bezpośrednio odwołuje się do typów podklasa (To nie jest po prostu możliwe w tym konkretnym przypadku)

W każdym razie ... z góry dzięki!

+0

Inspektor obiektów nie wyświetla właściwości, ponieważ nie ma dla niej edytora zarejestrowanych właściwości. – kludg

Odpowiedz

5

Możesz znaleźć wszystkie klasy, które pochodzą z konkretnej klasy bazowej: Delphi: At runtime find classes that descend from a given base class? i uczynić tę właściwość specjalną z listą wartości przy użyciu TPropertyEditor.

+0

Oznaczono twoją odpowiedź jako poprawną, tak jakbyś jako pierwsza odpowiedziała (i to jest poprawna odpowiedź, oczywiście). Nie będę używać tej metody, ponieważ nie chcę używać żadnego RTTI w tym systemie. Postanowiliśmy przejść z ideą "usieciowanych komponentów" (gdzie komponent 'TMyObjectA' lub' TMyObjectB' łączy się z instancją 'TMyComponent' za pośrednictwem właściwości. Łatwiej w ten sposób! – LaKraven

+0

Simon, zastanów się, w jaki sposób taki edytor właściwości mógłby uzyskać typy klas w kontekście pakietu czasu projektowania. –

+0

David, tak ... byłoby stosunkowo łatwo (przy użyciu RTTI) dodać Edytor właściwości do obsługi tego typu rzeczy ... ale jak powiedziałem w moim wcześniejszym komentarzu, nie chcę używać RTTI w skompilowany plik wykonywalny (który musiałbym zrobić, aby uzyskać klasę z kwalifikowanej nazwy zapisanej w DFM) – LaKraven

3

Jeśli zamierzałeś to zrobić, musisz podać property editor. IDE nie ma edytorów właściwości dla właściwości typu klasy. Będziesz także potrzebował obsługiwać .dfm. Zapisałbyś typ klasy do pliku .dfm jako ciąg, a po odczytaniu pliku .dfm musisz naprawić odnośnik. Nowy styl RTTI mógłby to zrobić.

Jednak nie sądzę, aby to wszystko było możliwe z następującego powodu. Twój kod czasu projektu działa w pakiecie wewnątrz IDE i nie ma dostępu do typów klas w aktywnym projekcie w IDE. Te typy klas istnieją tylko wtedy, gdy projekt jest uruchomiony. Tak więc właściwość ObjectType w kodzie w pytaniu nie może być przypisana do nic znaczącego w pakiecie czasu projektowania. Cóż, możesz go użyć do klas zdefiniowanych w VCL i innych pakietach zainstalowanych w twoim IDE, ale wyobrażam sobie, że chciałbyś go użyć na klasach zdefiniowanych w aktywnym projekcie.

Myślę, że to wszystko oznacza, że ​​zamiast tego należy użyć prostej właściwości łańcuchowej i naprawić odwołania do typu klasy tylko w środowisku wykonawczym.

Powiązane problemy