PDA

Ver la Versión Completa : Función de Clase para iniciar formulario


rarratia
06-02-2015, 22:50:44
Estimados, se puede crear una función de clase para crear y llamar a un formulario de una manera bien cómoda, por ejemplo definir la siguiente función de clase para un formulario modal:


class function Tf_smName.MostrarVentana(ATag : Integer) : TModalResult;
begin
with Create(Application) do
Try
Tag := ATag;
Result := ShowModal;
finally
Free;
end;
end;


Luego dejas tu formulario no como autocreado sino disponible y en cualquier parte de tu código llamas a la función de clase:

Tf_smName.MostrarVentana(nroTag);

Para el ejemplo lleno la variable tag para que el formulario sepa debido a qué se le llama.

El problema es que en el evento OnCreate del formulario que hereda esta funcionalidad debo poner:
f_smName := Self;

Esto es como todos ustedes bien saben, porque las funciones de clase dan funcionalidad a la clase y no instancias objetos, por lo que el único objeto que queda instanciado con esta llamada es Self, luego debo apuntar Self al objeto de formulario con su respectivo nombre.
¿A alguien se le ocurre alguna forma que en el formulario con la funcionalidad básica y del cual se heredan todos los formularios de una aplicación quedara instanciado el nombre y no que tenga que colocar el puntero Self al nombre en cada OnCreate de cada formulario?
No se si se entiende bien la pregunta, pero esa es una duda que dejo de inquietud. (Ojo, la inicialización de la variable Tag no está disponible en el OnCreate, si en el resto del programa).

AgustinOrtu
06-02-2015, 23:44:20
class function Tf_smName.MostrarVentana(ATag : Integer; var AForm: TForm) : TModalResult;
begin
AForm := Create(Application);
with AForm do
Try
Tag := ATag;
Result := ShowModal;
finally
Free;
end;
end;

No lo he probado en el delphi pero a simple vista asi parece que funcionara el

Application.CreateForm(TipoForm, VariableForm);

Y la llamada

Tf_smName.MostrarVentana(nroTag, f_smName);

Al González
06-02-2015, 23:44:48
Hola.

Quizá no resuelva todas tus dudas, pero estoy seguro que te interesará echar un vistazo a GH Freebrary. Ahí implementé una funcionalidad similar que explico a grandes rasgos en este otro hilo: http://www.clubdelphi.com/foros/showthread.php?p=463008#post463008

Ojalá te sirva para sacar ideas.

Un saludo. :)

rarratia
07-02-2015, 00:31:56
Hola.

Quizá no resuelva todas tus dudas, pero estoy seguro que te interesará echar un vistazo a GH Freebrary. Ahí implementé una funcionalidad similar que explico a grandes rasgos en este otro hilo: http://www.clubdelphi.com/foros/showthread.php?p=463008#post463008

Ojalá te sirva para sacar ideas.

Un saludo. :)

Gracias amigo, miraré como resuelves eso, saludos

rarratia
07-02-2015, 00:33:23
class function Tf_smName.MostrarVentana(ATag : Integer; var AForm: TForm) : TModalResult;
begin
AForm := Create(Application);
with AForm do
Try
Tag := ATag;
Result := ShowModal;
finally
Free;
end;
end;

No lo he probado en el delphi pero a simple vista asi parece que funcionara el

Application.CreateForm(TipoForm, VariableForm);

Y la llamada

Tf_smName.MostrarVentana(nroTag, f_smName);

No, no es igual, el código que implemento, crea el formulario, lo ejecuta y lo libera entregando respuesta en una sola instrucción...

Al González
07-02-2015, 00:48:50
No, no es igual, el código que implemento, crea el formulario, lo ejecuta y lo libera entregando respuesta en una sola instrucción...
¡Colega bibliotecario! :)

Todo lo que sea escribir menos código va en el camino correcto. ^\||/