Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Función de Clase para iniciar formulario (https://www.clubdelphi.com/foros/showthread.php?t=87661)

rarratia 06-02-2015 22:50:44

Función de Clase para iniciar formulario
 
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:

Código Delphi [-]
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:

Código Delphi [-]
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:
Código Delphi [-]
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

Código Delphi [-]
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

Código Delphi [-]
Application.CreateForm(TipoForm, VariableForm);

Y la llamada

Código Delphi [-]
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/show...008#post463008

Ojalá te sirva para sacar ideas.

Un saludo. :)

rarratia 07-02-2015 00:31:56

Cita:

Empezado por Al González (Mensaje 488529)
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/show...008#post463008

Ojalá te sirva para sacar ideas.

Un saludo. :)

Gracias amigo, miraré como resuelves eso, saludos

rarratia 07-02-2015 00:33:23

Cita:

Empezado por AgustinOrtu (Mensaje 488528)
Código Delphi [-]
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

Código Delphi [-]
Application.CreateForm(TipoForm, VariableForm);

Y la llamada

Código Delphi [-]
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

Cita:

Empezado por rarratia (Mensaje 488532)
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. ^\||/


La franja horaria es GMT +2. Ahora son las 06:33:48.

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