FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
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:
En las propiedades del form que queremos abrir, le tenemos que asignar: Código:
align:=alNone BorderStype:=bsSizeable FormStyle:=fsNormal , 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.
Espero que a alguien le sirva este pequeño resumen. Gracias |
#2
|
||||
|
||||
Cita:
|
#3
|
||||
|
||||
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 |
#4
|
||||
|
||||
Hola,
¡De acuerdo en todo y en lo citado! |
#5
|
||||
|
||||
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. |
#6
|
||||
|
||||
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 |
|
|
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 |
|