Crear una ventana a través de su nombre de clase

5149 vistas

Mirando de cerca la unidad Classes veremos:

- procedure RegisterClass(AClass: TPersistentClass);
Esta función permite registrar una clase para que ésta pueda ser usada.

- function FindClass(const ClassName: string): TPersistentClass;
Esta función permite localizar una clase por su nombre. FindClass busca en las clases registradas del sistema.

Mecanismo:
Llamando a RegisterClass, la clase será registrada para el registro de la VCL. El método FindClass intentará localizar dentro de éste la clase de nombre pasado por parámetro. Si la clase no se encuentra, FindClass provocará una excepción.

El siguiente código muestra este mecanismo y permite encontrar una ventana por su nombre de clase.

Recomendaciones:
En un nuevo proyecto, crear 2 formularios nuevos (TForm2 y TForm3) y sus respectivas unidades (Unit2 y Unit3).
El TForm1 (Unit1), ponemos un TEdit y un TButton.
Reemplazamos el código de l aUnit1 por el mostrado aquà debajo.

Uso:
En la ejecución tendremos que rellenar el TEdit con el valor que queramos (TForm2 o TFoem3) y pulsar el TButton.



delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Unit2, unit3, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Edit1: TEdit;
  12.     Button1: TButton;
  13.     procedure FormCreate(Sender: TObject);
  14.     procedure Button1Click(Sender: TObject);
  15.   private
  16.   public
  17.   end;
  18.  
  19. var
  20.   Form1: TForm1;
  21.  
  22. implementation
  23.  
  24. {$R *.DFM}
  25.  
  26. procedure TForm1.FormCreate(Sender: TObject);
  27. begin
  28.   RegisterClass(TForm2);
  29.   RegisterClass(TForm3);
  30. end;
  31.  
  32. procedure TForm1.Button1Click(Sender: TObject);
  33. var
  34.   f: TFormClass;
  35. begin
  36.   try
  37.     f := TFormClass(FindClass(Edit1.text));
  38.     with f.Create(self) do Show;
  39.   except
  40.     Raise;
  41.   end;
  42. end;
  43.  
  44. end.