Domanda

Mi piacerebbe creare un'istanza di una classe ma ho solo il suo nome in una stringa. C'è un modo?

È stato utile?

Soluzione

Questo è da Delphi aiuto (Delphi 2006, ma anche a disposizione di almeno Delphi 7):

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

Descrizione Chiamata getClass di ottenere una classe da un nome di classe. Questa classe può essere utilizzato come parametro per le routine che richiedono una classe. La classe deve essere registrato prima getClass possa trovarlo. classi di form e classi di componenti cui si fa riferimento in una dichiarazione forma (variabili di istanza) vengono registrati automaticamente quando il modulo viene caricato. Altre classi possono essere registrati chiamando RegisterClass o RegisterClasses.

Ecco alcuni esempi di codice. Funziona come tale solo perché è un TButton 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;

Altri suggerimenti

Quando ho avuto 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 avuto modo di sottoclasse TStringList per rendere possibile Tipi maniglia di classe anche, in modo ora posso un'istanza di un oggetto solo di passaggio è il nome della classe alla fabbrica. Funziona in questo modo:

1 ° - caricare un oggetto di fabbrica Singleton;
2 ° - Registrati qualsiasi oggetto alla fabbrica, potrebbe essere nella sezione di inizializzazione dell'unità;

metodi della fabbrica principale potrebbe essere: isClassRegistered, registerClass, instantiateClass (ClassName: String): TObject;

In questo modo posso istanziare un oggetto, o utilizzare un oggetto istanziato precedente, o addirittura, un sottoinsieme di essi.

Io invece uso un tipo enumerato invece di una stringa per identificare una classe.

Note:. E 'un esempio molto, molto stringato, un codice completamente funzionale è più complessa, ma, belive me, non troppo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top