2009-03-31 15 views

risposta

28

Questo è da Delphi aiuto (Delphi 2006, ma disponibili anche da almeno Delphi 7):

Sintassi getClass funzione (const AClassName: String): TPersistentClass;

Descrizione Chiama GetClass per ottenere una classe dal nome di una classe. Questa classe può essere utilizzata come parametro per le routine che richiedono una classe. La classe deve essere registrata prima che GetClass possa trovarla. Le classi di moduli e le classi di componenti a cui viene fatto riferimento in una dichiarazione di modulo (variabili di istanza) vengono registrate automaticamente quando viene caricato il modulo. Altre classi possono essere registrate chiamando RegisterClass o RegisterClasses.

Ecco alcuni esempi di codice. Funziona come tale solo perché TButton è un TControl e quindi il typecast è valido.

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

Ottima soluzione. Ma ora mi sono imbattuto in un altro problema. La classe che vorrei istanziare è una mia classe che implementa un'interfaccia. E registerClass deve essere chiamato con una classe persistente. Qualche idea? –

+0

È possibile derivare la tua classe o uno dei suoi antenati da TPersistent? –

+0

Non credo, dal momento che implementa un'interfaccia e deve derivare da TInterfaceObject –

2

Quando avevo bisogno di farlo, ho costruito la mia propria fabbrica oggetto che utilizza un TStringList appositamente sottoclasse, Attualmente sto usando Delphi 7 quindi la classe lista di stringhe supporta allegare solo un oggetto in una stringa, poi ho è arrivato a sottoclasse TStringList per rendere possibile gestire anche i Class Type, così ora posso istanziare un oggetto semplicemente passando il suo nome di classe alla factory. Funziona in questo modo:

1 ° - Carica una fabbrica oggetto Singleton;
2st - Registrare qualsiasi oggetto in fabbrica, potrebbe essere nella sezione di inizializzazione dell'unità;

I metodi della Factory principale possono essere: isClassRegistered, registerClass, instantiateClass (ClassName: STring): TObject;

In questo modo è possibile creare un'istanza di qualsiasi oggetto o utilizzare un oggetto istanziato precedente o persino un sottoinsieme di essi.

Preferisco usare un tipo enumerato invece di una stringa per identificare una classe.

Note: È un esempio molto, molto conciso, un codice completamente funzionale è più complesso, ma, credetemi, non troppo.

Problemi correlati