![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Cita:
![]() Desde luego para mostrar el formulario lo hago asi (Siguiendo tu ejemplo): En el evento OnClose del formulario (Form2 en mi caso) hago esto: Y en un boton que tengo en el formulario 2 (Form2) hago esto: Y no tengo problemas... .Quisas en tu caso tienes algun código mas por ahí , que es el causador del error que mencionas. ![]() .Cita:
..si es una forma,en realidad la funcion Assigned lo que hace es Verificar si un puntero o variable es diferente de nulo(nil) algo asi:De ahi la importancia de utilizar la funcion FreeAndNil. ![]() Cita:
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7 |
|
#2
|
||||
|
||||
|
rgstuamigo y look :
Pues algo sigue estando raro con mi codigo, voy a checarlo bien. Mientras probé de esta manera a ver que opinan:
Y desde el Form_Prueba puedo cerrar de las siguientes maneras sin ningun error hasta el momento:
De esta forma le ven algún detalle que se me escape??? Con la forma que me recomendaron aun sigo checando si el problema es con la validación: if not Assigned() o con la llamada Close desde el evento OnClick del Boton. Muchas gracias de verdad por su tiempo y comentarios. |
|
#3
|
||||
|
||||
|
Personalmente no lo veo muy óptimo yo prerferiría usar la funcion assigned en ves de recorrer todos formulario y usar el procedimiento FreeAndNil en lugar de Release tal como te hemos mencionado.
![]()
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7 |
|
#4
|
||||
|
||||
|
Cita:
![]() Yo hice la prueba del compañero y también obtuve un Access Violation. Luego agregué un tercer formulario al proyecto y "funcionó". O sea que, dependiendo de según qué circunstancias, puedes o no tener un problema. El punto es, que no puedes usar FreeAndNil en el evento OnClose (y en ningún evento del formulario) por la misma razón que no puedes usar Free y debes usar Release en su lugar. Tú mismo has observado que Release hace un Post del mensaje CM_RELEASE que, a su vez, genera la llamada a Free. Pero, al hacerse vía un Post, se garantiza que el formulario que se destruye ya ha procesado todos los eventos. Al usar FreeAndNil e invocar el método Close tal como hace el compañero, el problema está en que el formulario se destruye cuando el evento Button1Click aún no termina. En todo caso, podría funcionar algo como:
De todas maneras, a mi en lo particular no me gusta este tipo de métodos. Se supone que una clase no debería hacer referencia a ninguna instancia en particular de ella. Lo que yo hago en estos casos, es usar el mecanismo de notificaciones entre componentes dado por FreeNotification y Notification. Cuando creo el formulario, uso
Esto asegura que Self (el formulario desde donde se abre el segundo formulario) sea notificado cuando Form2 se destruya:
Entonces, la parte que faltaría, es redefinir el método Notification de TForm1 para, ahí sí, poner en nil la variable:
// Saludos |
|
#5
|
||||
|
||||
|
Cita:
(y si que tuve suerte), la verdad creo que es un comportamiento extraño , ya que si tengo otras controles con algun evento codificado en algunos casos no obtengo dicho error pero en otros si me sale. .De todas formas tambien podriamos solucionarlo(segun mis pruebas) poniendo un componente TBitBtn en lugar del TButton y poner la propiedad Kind=bkClose para que cuando se presione dicho boton el formulario se cierre sin necesidad de codificar nada en su evento OnClick ,desde luego ésto me ha funcionado usando FreeAndNil y no he tenido problemas.![]() Saludos... ![]()
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7 |
|
#6
|
|||
|
|||
|
Hola,
proba con: en el evento Close poner solo Action := caFree; y en el evento destroy Form2:=nil; Saludos |
|
#7
|
||||
|
||||
|
Cita:
Me respeta correctamente la validación Assigned y no ha provocado ningún error por el momento :P Con esto no se queda de basura en memoria o algo así??? El Form se libera bien y el puntero se pone a NIL correctamente al parecer... Alguien opina algo diferente, algún detalle??? |
|
#8
|
||||
|
||||
|
Hola rgstuamigo y roman que tal, gracias poco a poco me va quedando claro este asunto, no puedo usar definitivamente FreeAndNil desde el mismo Form... suena logico sobre todo por el asunto de invocar al Close de un evento Click de un Botón.
Al usar el Release lo hace bien por que antes de destruir el Form termina todo los procesos pendientes... Muy bien entonces las conclusiones son las siguientes: * Entonces para usar la validación Assigned el Form que se valida necesia estar Liberado y con el punturo a NIL, de aqui la importancia del FreeAndNil * Assigned pordria no funcionar bien con el Release por que antes de liberar al Form manda los mensajes a una cola de espera y poner el puntero a NIL un tiempo mas tarde, por eso al validar el Assigned podria regresar TRUE aunuqe ya se haya liberado el Form. |
|
#9
|
||||
|
||||
|
Hola Roman de lo que sugeriste tengo unas dudas ya que intente aplicarlo y no pude :P
Esta parte no la tengo poner verdad? o si??? Cita:
Y en esta no me reconoce el procedure TForm1.Notification me falta alguna declaración en el USES??? Cita:
Gracias! Saludos. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Assigned y Free | gluglu | Varios | 4 | 14-05-2007 21:03:37 |
| Problemas FreeAndNil | OscarG | OOP | 4 | 09-11-2005 12:48:46 |
| Invalid Pointer Operation con Free y Assigned | adlfv | OOP | 3 | 07-10-2005 00:17:06 |
| Database not assigned!! | cwelx | Conexión con bases de datos | 1 | 29-09-2004 22:06:40 |
| Left side cannot be assigned to | gbece7mx7 | Varios | 2 | 29-10-2003 19:01:24 |
|