Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Forms dinámicos (https://www.clubdelphi.com/foros/showthread.php?t=42469)

juliobuitrago 15-04-2007 10:03:04

Forms dinámicos
 
Siempre suelo hacer este tipo de procedimiento para lamar a un form.
form1 := tform1.Create(Application);
try
form1.ShowModal;
finally
freeandnil(form1);
end;

Asi mismo para cuando uso reportes, yo uso el qreport
claro, con el print o con el preview en vez de ShowModal;

Pero ahora necesito tener el mismo procedimiento pero pasar el nombre del form como parametro.
Probé que lo que hay escrito en el forum al respeto, tomando la clase del form y demás, pero no me funcionó.

Es que los clientes me tiene locos, y cada uno pide el form de la plantilla diferente y por cada uno hacer lo mismo.........

Alguna solución dinámica, en la que yo pase por ejemplo:
'form1'
o 'form2
y el me sustituya y funcione?

Saludos de antemano.

Fernando

Lepe 15-04-2007 12:31:37

busca por "RegisterClass" y por "fabrica de clases" en el foro.

Saludos

dec 15-04-2007 12:33:53

Hola,

Cita:

Siempre suelo hacer este tipo de procedimiento para lamar a un form.

Código Delphi [-]
form1 := tform1.Create(Application);
try
form1.ShowModal;
finally
freeandnil(form1);
end;

Yo llevo un tiempo convencido de usar algo así:

Código Delphi [-]
with TForm2.Create(nil) do
try
  ShowModal();
finally
  Free();
end;

Y lo dejo dicho aquí para que se sepa de mi bárbara erudición en estos temas. :)

Sinaloense 16-04-2007 02:59:41

Puedes crear un procedimento como el siguiente:

Código Delphi [-]
procedure TForm4.Button1Click(Sender: TObject);
begin
  ejecuta_forma('TForm6');
end;

procedure TForm4.ejecuta_forma(AClassName: String);
begin
  if AClassName = 'TForm5' then begin
     Form5 := TForm5.Create(Application);
     Form5.ShowModal;
     FreeAndNil(Form5);
  end
  else if AClassName = 'TForm6' then begin
     Form6 := TForm6.Create(Application);
     Form6.ShowModal;
     FreeAndNil(Form6);
  end;

end;

No se si es algo es lo que necesites, hay otra forma más complicada que involucra castings y punteros y funciona con cualquier tipo de forma.



Cita:

Empezado por juliobuitrago
Siempre suelo hacer este tipo de procedimiento para lamar a un form.
form1 := tform1.Create(Application);
try
form1.ShowModal;
finally
freeandnil(form1);
end;

Asi mismo para cuando uso reportes, yo uso el qreport
claro, con el print o con el preview en vez de ShowModal;

Pero ahora necesito tener el mismo procedimiento pero pasar el nombre del form como parametro.
Probé que lo que hay escrito en el forum al respeto, tomando la clase del form y demás, pero no me funcionó.

Es que los clientes me tiene locos, y cada uno pide el form de la plantilla diferente y por cada uno hacer lo mismo.........

Alguna solución dinámica, en la que yo pase por ejemplo:
'form1'
o 'form2
y el me sustituya y funcione?

Saludos de antemano.

Fernando


Lepe 16-04-2007 10:43:53

Sinaloense, gracias, es eso lo que necesita, pero imagina que tienes 80 ventantas distintas... 80 ifs son demasiados, de ahí la sugerencia de fábrica de clases, que permite automatizar la creación de ventanas sin los "ifs".

Saludos

rcarrillom 16-04-2007 12:22:19

Saludos al foro.
La unidad AppUtils de las Rx tienen dos funciones interesantes:
Código Delphi [-]
function FindForm(FormClass: TFormClass): TForm;
function FindShowForm(FormClass: TFormClass; const Caption: string): TForm;
que pueden ser modificadas fácilmente para que busquen el nombre de la clase. Espero que haya sido de utilidad.

juliobuitrago 16-04-2007 17:19:47

Gracias a todos
 
Muchas gracias, llevo casi desde el nacimiento del ClubDelphi y sigue siendo único, muchas gracias.
Resuelto.

juliobuitrago 16-04-2007 18:31:32

En verdad
 
Lo que necesito es la fabrica de clases, pues ya lo tengo de la otra forma con los If, el lio es que lo de la fabrica de clases, no me funciona, seguire probando, gracias

juliobuitrago 16-04-2007 18:47:25

Sigo, lo siento, ayuda por favor
 
Esta es la sección del codigo, probando

Código Delphi [-]
type
  Tplantillas_form_menu = class(TForm)
    ComboBox1: TComboBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  plantillas_form_menu: Tplantillas_form_menu;

implementation

uses uform_plantillas1,uform_plantillas2;

{$R *.dfm}

procedure Lanza(i:String);
var
  FormClass: TPersistentClass;
  j : TForm;
begin
  FormClass := GetClass(i);
  if Assigned(FormClass) then
   if (FormClass.InheritsFrom(TForm)) then
      with Application do
           if Assigned(FindComponent(i)) then
              (FindComponent(i) as TForm).ShowModal()
           Else
               ShowMessage('No Encontrado');
End;
procedure Tplantillas_form_menu.Button1Click(Sender: TObject);
begin
  Lanza(ComboBox1.Text);
end;

initialization
  RegisterClass(Tform_plantillas1);
  RegisterClass(Tform_plantillas2);
end.

Aqui según el chequeo

Código Delphi [-]
  FormClass := GetClass(i);

Dice que FormClass es Nil, o lo que es lo mismo, parece que no lo reconoce.

Ayuda por fa, creo que estamos cerca.....Si se resuelve, puedo tomar en vez del combo de un array todas las formas que necesito, Saludos

Fernando


La franja horaria es GMT +2. Ahora son las 18:24:25.

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