2009-03-31 11 views

Odpowiedz

28

to z pomocą Delphi (Delphi 2006, ale również dostępny z co najmniej Delphi 7):

Składnia getClass funkcyjne (const AClassName: String): TPersistentClass;

Opis Zadzwoń do GetClass, aby uzyskać klasę z nazwy klasy. Ta klasa może być używana jako parametr dla procedur wymagających klasy. Klasa musi zostać zarejestrowana, zanim GetClass ją znajdzie. Klasy formularzy i klasy komponentów, które są przywoływane w deklaracji formularza (zmienne instancji), są automatycznie rejestrowane po załadowaniu formularza. Inne klasy można zarejestrować, wywołując RegisterClass lub RegisterClasses.

Oto przykładowy kod. Działa jako taki tylko dlatego, że TButton jest TControl, a zatem typecast jest ważny.

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

Świetne rozwiązanie. Ale teraz natknąłem się na inny problem. Klasa, którą chciałbym utworzyć, jest klasą własną, która implementuje interfejs. A registerClass musi zostać wywołany z klasą trwałą. Dowolny pomysł? –

+0

Czy można wywodzić swoją klasę lub jednego z jej przodków z TPersistent? –

+0

Nie wierzę, ponieważ implementuje interfejs i musi pochodzić z TInterfaceObject –

2

Kiedy potrzebowałem, aby to zrobić, ja zbudowałem mój własny zakład obiekt, który wykorzystuje specjalnie podklasy TStringList, obecnie używam Delphi 7 więc klasa lista ciąg obsługuje dołączyć tylko sprzeciw wobec String, potem dostałem podklasę TStringList, aby umożliwić obsługę typów klas, więc teraz mogę utworzyć obiekt, który przekazuje fabrykę swojej klasie. Działa w ten sposób:

Pierwszy - Załaduj fabrykę obiektów Singleton;
2st - Zarejestruj dowolny obiekt w fabryce, może znajdować się w sekcji inicjalizacji urządzenia;

Główne metody Fabryki to: isClassRegistered, registerClass, instantiateClass (ClassName: STring): TObject;

W ten sposób mogę utworzyć instancję dowolnego obiektu lub użyć wcześniej utworzonego obiektu lub nawet jego podzestawu.

Raczej używam typu wyliczeniowego zamiast ciągu znaków do identyfikacji klasy.

Uwagi: Jest to bardzo, bardzo zwięzły przykład, kod całkowicie funkcjonalny jest bardziej złożony, ale, uwierz mi, nie za dużo.

Powiązane problemy