Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Crear Objeto por su nombre de clase (https://www.clubdelphi.com/foros/showthread.php?t=52044)

jlrbotella 08-01-2008 20:19:25

Crear Objeto por su nombre de clase
 
Hola:

Actualmente tengo dos formulario (TForm1 y Tform2) y me gustaria crearlos con un único procedure: Ejemplo

procedure CrearFormulario(Form : TForm)
begin
Form := TForm.Create(self);
end;

// Este ejemplo funciona, pero me lo crea con la clase heredada TForm y no la que correspondería que seria:

Form := TForm1.Create(self);
Form := TForm2.Create(self);

Hay alguna forma de crear el objeto sin saber su clase?

NombreClase := Classname(Form);
Form := NombreClase.Create(self);

Un saludo,
JL

maeyanes 08-01-2008 20:31:18

Hola...

Tendrías que construir una fabrica de objetos (o clases :p), en la cual registrar los nombres de clase de la forma con su respectiva clase y luego solo las creas usando el nombre de la clase:

Algo como:

Código Delphi [-]
Form1 := FormFactory.FormClasses['TForm1'].Create(Applicacion);

Ahora, en tu caso la función que quieres usar puedes mandarle el tipo de la forma que quieres crear:

Código Delphi [-]
function CrearForma(AFormClass: TFormClass): TForm;
begin
  Result := AFormClass.Create(Application)
end;

Para llamar la función solo haces:

Código Delphi [-]
// Crear TForm1:
Form1 := CrearForma(TForm1);

// Crear TForm2
Form2 := CrearForma(TForm2);


Saludos...

axesys 08-01-2008 23:44:37

Yo las creo a partir del nombre de un TAction que tenga el mismo nombre de la forma que voy a crear. Todos los action les asigno el mismo evento OnExecute

Código:

procedure TfrmMenu.actAbrirVentanaExecute(Sender: TObject);
begin
  CrearVentana(TAction(Sender).Name).Show
end;

function TfrmMenu.CrearVentana(sForma: string): TForm;
begin
  sForma:= StringReplace(sForma, 'act', 'Tfrm', []);
  Result:= TFormClass(GetClass(sForma)).Create(Self)
end;

Nomas que necesitas agregar a cada forma al final algo así

Código:

initialization
  RegisterClass(TfrmNombreForma)



La franja horaria es GMT +2. Ahora son las 22:34:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi