PDA

Ver la Versión Completa : Forms dinámicos


juliobuitrago
15-04-2007, 10:03:04
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,


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


form1 := tform1.Create(Application);
try
form1.ShowModal;
finally
freeandnil(form1);
end;



Yo llevo un tiempo convencido de usar algo así:


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:


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.



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:

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
Muchas gracias, llevo casi desde el nacimiento del ClubDelphi y sigue siendo único, muchas gracias.
Resuelto.

juliobuitrago
16-04-2007, 18:31:32
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
Esta es la sección del codigo, probando


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


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