Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-08-2016
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Como abrir forms dentro de otro form

Hola amigos,

Como he visto que en varios post preguntando lo mismo para lazarus, voy a aportar lo que he recogido y resumido de otros post.

En primer lugar colocamos en el form principal un panel vacio, en la propiedad align le asignais alClient.

Si queremos que, al pulsar un boton, se abra el form debeis poner:

Código Delphi [-]
procedure TPrincipal.SpkLargeButton8Click(Sender: TObject);
begin
   if not assigned(fproveedores) then //Para verificar que no ha sido asginado/abierto el form y no lo abra mas de una vez.
   begin
   fproveedores:=tfproveedores.Create(application);
   fproveedores.Parent:=panel; //Asignamos parent al panel para que se abra dentro de él.
   fproveedores.Show;
   end;
end;

En las propiedades del form que queremos abrir, le tenemos que asignar:
Código:
align:=alNone
BorderStype:=bsSizeable
FormStyle:=fsNormal
En el evento OnClose del form le poneis
Código Delphi [-]
fproveedores.nil
, para que quede desasignado y podamos abrirlo despues.

Con eso ya nos abrira el form dentro del panel.

Una puntualizacion adicional.
Como en mi caso tengo algun problema a la hora de maximizar o cambiar el tamaño porque no refresca bien, lo que hice fue, meter en la clausula uses del form, vinculo con el form principal asi, a la hora de hacer un onResize, haga un refresh del panel.
Código Delphi [-]
procedure Tfproveedores.FormResize(Sender: TObject);
begin
  principal.contenedor.refresh;
end;

Espero que a alguien le sirva este pequeño resumen.

Gracias
Responder Con Cita
  #2  
Antiguo 15-08-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por anubis Ver Mensaje
Código Delphi [-]
 Fproveedores.nil
Eso no libera la memoria, debes hacer Fproveedores.Free
Responder Con Cita
  #3  
Antiguo 15-08-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Tiene owner el objeto Application. Así que se destruye al final de todo. Así que en la práctica es un memory leak porque está la referencia al form hasta que no se destruye Application.

Básicamente se crea un form nuevo cada vez que se dispara el evento del botón. Y cuando se cierra queda oculto y como la referencia original es nil, not assigned evalúa a true

Lo suyo es evitar las variables globales; crear, mostrar, operar el form, y destruirlo cuando no se necesita más. Como cualquier objeto, por ejemplo cuando se usan stream siempre se liberan cuando ya no hace falta

Ahora es cierto que hay casos en los que un form, frame o cualquier control se incrusta dentro de otro y el tiempo de vida es el mismo que el de su parent. En ese caso lo ideal es crearlos en el constructor y destruirlos en el destructor. Lo mismo que un dbgrid, un string grid, un ListView, etc. Código que anda chequeando por nil termina cansando
Lo justo es asegurarse de que todo los controles estén propiamente inicializados.

Por ejemplo en tu código no preguntas si el botón esta asignado. Así debería ser siempre con todos
Responder Con Cita
  #4  
Antiguo 15-08-2016
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por AgustinOrtu Ver Mensaje
[...]Código que anda chequeando por nil termina cansando [...]
¡De acuerdo en todo y en lo citado!
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 16-08-2016
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias por las respuestas.
Teneis toda la razon y ademas aplastante.
La idea de poner solo form.nil, es porque si meto form.free en el evento onclose como recomedabais, a la hora de cerrar el formulario da error de violacion. entiendo que estas intentando liberar un formulario creado desde el mismo sitio que lo estas cerrando asi que no entiendo entonces donde se debe de poner.
Por otro lado amigos, nose si hay alguna forma de saber si un formulario esta abierto (no asignado) para poder meter en ese punto el form.free.

Perdonad la ignorancia, de momento no he usado nunca los constructores, pero veo que es diferente a crearlos..

Sobre asignar el boton que abre el formulario ademas, quiero pensar, del form asignado, como le digo que el boton esta asignado para que no deje pulsarlo mas veces, si tengo que tener en cuenta que lo debe de desasignar cuando el formulario se cierre?

Última edición por anubis fecha: 16-08-2016 a las 23:02:27.
Responder Con Cita
  #6  
Antiguo 16-08-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
En el OnClose le pones Action caFree y el framework ya se encarga de liberarlo.

Ese AV se produce porque luego de ejecutar tu evento TForm sigue haciendo algunas cosas en su método DoClose
Responder Con Cita
  #7  
Antiguo 17-08-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por anubis Ver Mensaje
...
Por otro lado amigos, nose si hay alguna forma de saber si un formulario esta abierto (no asignado) para poder meter en ese punto el form.free.
Hola Anubis.

Si para determinar si el formulario está abierto o cerrado, usas el modo
Código Delphi [-]
  if not Assigned(fproveedores) then
  begin
    fproveedores := Tfproveedores.Create(...);
    ...
o, con el mismo resultado:
Código Delphi [-]
  if fproveedores = nil then
  begin
    fproveedores := Tfproveedores.Create(...);
    ...
No te va a alcanzar con liberar el segundo formulario, también deberás poner el valor nil en la variable (fproveedores) al cerrarlo o destruirlo.

Tal vez estos enlaces te aclaren mas el punto:
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 18-08-2016
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Se agradece.

Entonces si le añado como decis, en el evento onclose del formulario fproveedores, closeaction:=cafree, y luego fproveedores:=nil, ya no estoy dejando sin cerrarlo y encima liberarlo.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Interactuar con forms dentro de otra form cd.rafael Lazarus, FreePascal, Kylix, etc. 2 13-01-2016 17:16:33
Enviar cordenadas del mouse dentro del form a otro form look OOP 7 30-12-2013 16:58:22
Como hacer que un formulario solo se pueda mover dentro de otro jasmad OOP 8 19-09-2011 16:27:10
Form contenedor dentro de otro form. vpepen Varios 7 14-04-2011 00:12:30
Un form dentro de otro Ubed Gráficos 7 01-11-2007 20:07:06


La franja horaria es GMT +2. Ahora son las 03:06:51.


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
Copyright 1996-2007 Club Delphi