Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Manejo de ventanas (https://www.clubdelphi.com/foros/showthread.php?t=73598)

Kelvin 04-05-2011 02:03:09

Manejo de ventanas
 
He creado una aplicación en lazarus, la cual esta conformada por varios formularios que deben abrirse desde un formulario principal.

Estos formularios no se cargan junto con el programa cuando este se inicia.

Mi duda es:
¿Cual es la forma correcta para abrir los formularios según haga click en el botón programado en el formulario principal para efectuar tal accion?,¿Como quedaría el procedimiento?

Aclaro que puedo necesitar tener mas de un formulario abierto simultáneamente, por lo que no se si abrirlos de forma modal sea la elección correcta

Bueno, agradeciendo de antemano su valiosa colaboración, quedo al pendiente

Saludos

Caral 04-05-2011 02:47:10

Hola
Creando el form cuando se necesite y mostrandolo con modal, este quedara activo, no se podran abrir otros forms.
Creando el from cuando se necesite pero mostrarlo sencillamente, se podra acceder a otros forms, eso si, el form NO sera destruido, salvo que se especifique en el correspondiente evento de ese mismo form.
Saludos

Kelvin 04-05-2011 06:29:35

Cita:

Empezado por Caral (Mensaje 398815)
Hola
Creando el form cuando se necesite y mostrandolo con modal, este quedara activo, no se podran abrir otros forms.
Creando el from cuando se necesite pero mostrarlo sencillamente, se podra acceder a otros forms, eso si, el form NO sera destruido, salvo que se especifique en el correspondiente evento de ese mismo form.
Saludos


Entiendo que cuando dices "salvo que se especifique en el correspondiente evento de ese mismo form", te refieres al momento ya de cerrar el formulario, ¿Es asi?

Por otro lado, a lo mejor estoy pidiendo mucho, pero...será que tu podrias indicarme con un pequeño ejemplo cual seria el codigo para efectuar lo que me indicas?...

Bueno, agradeciendo mucho tu respuesta, nuevamente quedo al pendiente

Gracias y saludos...

Caral 04-05-2011 17:13:43

Hola
El programa es sencillo.
Como sabes hay dos formas, showMODAL o simplemente SHOW.
Con Modal el form queda activo, NO deja que otro form sea visto hasta que se cierre, este se crea y se destruye Desde el form que lo llamo, una vez que se deja de usar
Con Show, se pueden abrir otros formularios a la vez, se crean, pero se destruyen desde el mismo form (puede ser casi cualquier evento, yo uso onclose en este caso).
El problema con este (show) es que se necesita verificar que YA se creo, de otra manera te seguira creando forms (iguales).
El asunto es crear los forms y destruirlos cuando no se necesiten.
Primero se crean normalmente los forms.
En project, option, Forms, se quitan de la lista los forms que no se quieran crear al principio, esto se revisa facilmente en la unit del proyecto (revisala).
Te pongo un ejemplo con 4 forms, el 1 es el principal, el 2 es showmodal y el 3 y 4 son show.
Saludos

Kelvin 04-05-2011 19:28:38

Muy agradecido con toda tu colaboración

El Asunto esta solventado conforme a tus indicaciones, muchas gracias..

Saludos y hasta pronto

luk2009 05-05-2011 06:03:19

Código Delphi [-]
begin
  if not Assigned(Form2) then
   begin
     Form2 :=TForm2.Create(Self);
     Form2.Show;
   end
 else
   begin
     if Form2.WindowState=wsminimized then
       Form2.Show;
       Form2.WindowState:=wsNormal;
   end;
end;

La idea es crear es form y si ya esta creado que lo muestre.
esta es una idea que te podria servir, donde ademas si el form esta minimizado lo muestra en ventana normal.

Kelvin 07-05-2011 02:53:51

Cita:

Empezado por luk2009 (Mensaje 398974)
Código Delphi [-]
begin
  if not Assigned(Form2) then
   begin
     Form2 :=TForm2.Create(Self);
     Form2.Show;
   end
 else
   begin
     if Form2.WindowState=wsminimized then
       Form2.Show;
       Form2.WindowState:=wsNormal;
   end;
end;

La idea es crear es form y si ya esta creado que lo muestre.
esta es una idea que te podria servir, donde ademas si el form esta minimizado lo muestra en ventana normal.


Si, muy buena idea la que planteas, seguro y la adoptaré.

Solo una interrogante....¿como cierras este tipo de ventanas no modales?, tengo entendido que en el evento OnClose del formulario creado agregas :

CloseAction:=caFree;

pero esto me envia un mensaje de error...

¿Cual es la codificación correcta que debo emplear?

De antemano gracias..

ecfisa 07-05-2011 03:18:00

Hola Kelvin.

Que raro... lo que haces parece correcto, sería mas o menos así ¿ no ?:
Código Delphi [-]
procedure TForm2.FormClose(Sender: TObject; var CloseAction: CloseAction);
begin
  CloseAction := caFree;
end;

¿ Que mensaje de error te arroja ?

Un saludo.

Kelvin 09-05-2011 21:30:21

Las disculpas del caso, no es un mensaje de error el que se genera, sino que sucede lo siguiente:


Creo y muestro el formulario (llamado frmclientes) de la siguiente forma desde otro formulario:
Código Delphi [-]
  if not Assigned(frmclientes) then 
  begin
    frmclientes :=Tfrmclientes.Create(Self);
    frmclientes.Show;
  end 
  else 
  begin
    if frmclientes.WindowState=wsminimized then 
    begin
      frmclientes.Show;
      frmclientes.WindowState:=wsNormal;
   end;
  end;

y tengo en el evento OnClose de frmclientes lo siguiente:


Código Delphi [-]
procedure Tfrmclientes.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  CloseAction:=caFree;        
end;


Lo que sucede es que, al iniciar la aplicación y abrir el formulario frmclientes por primera vez este se crea y se muestra sin problemas, luego lo cierro y todo bien, pero cuando quiero volver a mostrarlo siempre desde el mismo formulario desde donde lo llame al iniciar la aplicación, ya no se vuelve a mostrar hasta iniciar de nuevo la aplicacion y caer en el mismo circulo...

¿Que podra ser..?...me suena a que no se esta destruyendo el formulario o algo se esta quedando en memoria...no se..

Gracias y a la espera de sus comentarios...

beginner01 09-05-2011 21:48:11

Cita:

Empezado por Kelvin (Mensaje 399461)

y tengo en el evento OnClose de frmclientes lo siguiente:



procedure Tfrmclientes.FormClose(Sender: TObject; var CloseAction: TCloseAction
);
begin


CloseAction:=caFree;


end;



Lo que sucede es que, al iniciar la aplicación y abrir el formulario frmclientes por primera vez este se crea y se muestra sin problemas, luego lo cierro y todo bien, pero cuando quiero volver a mostrarlo siempre desde el mismo formulario desde donde lo llame al iniciar la aplicación, ya no se vuelve a mostrar hasta iniciar de nuevo la aplicacion y caer en el mismo circulo...

¿Que podra ser..?...me suena a que no se esta destruyendo el formulario o algo se esta quedando en memoria...no se..

Gracias y a la espera de sus comentarios...


saludos.

cambia.
Código Delphi [-]
 
CloseAction:=caFree;

por
Código Delphi [-]
 
FreeAndNil(frmclientes);

Kelvin 09-05-2011 23:22:58

Cita:

Empezado por beginner01 (Mensaje 399467)
saludos.

cambia.
Código Delphi [-]
 
CloseAction:=caFree;

por
Código Delphi [-]
 
FreeAndNil(frmclientes);


Vaya!...esto esta saliendo mas complejo de lo que me esperaba, ¿Sera que estoy condenado a dejar que el proyecto funcione bajo el comportamiento normal de lazarus de crear todas las ventanas al inicio de la aplicación y luego solo ir ocultando o mostrando las que se necesiten???..ojala que no sea así... confío en que hay una solución para mi problema

Ahora, hago el cambio que me indicas y obtengo el siguiente mensaje:


Project regservic.exe raised exception class 'External:SIGSEGV'


Donde "regservic", es el nombre de mi proyecto

¿Que estará sucediendo?


De antemano gracias por la ayuda de todos...y ..pues sigo pendiente de sus comentarios y buscando también por mi cuenta...

Saludos...

ecfisa 10-05-2011 02:50:18

Hola Kelvin.

Dejá el evento OnClose tál como lo tenías:
Código Delphi [-]
...
procedure TfrmClientes.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  CloseAction:= caFree;
end;

Y agregá el evento OnDestroy:
Código Delphi [-]
procedure TfrmClientes.FormDestroy(Sender: TObject);
begin
  frmClientes:= nil; 
end;


Saludos.

Kelvin 10-05-2011 16:55:31

Bravo!!!!....:D

Aplique los cambios que me indicas y efectivamente ahora funciona a la perfección.

Agradesco tu interes y colaboración, asi mismo, quiero hacer extensivo mi agradecimiento para con todos los que aportaron su tiempo y dedicacion para ayudarme: Caral, luk2009,beginner01 y ecfisa....muchas gracias a tod@s...!!

Saludos..


La franja horaria es GMT +2. Ahora son las 05:19:09.

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