Antonio
Me encuentro con un problema al cual le he dado solución pero desconozco su alcance.
En ocasiones despues de llamar al Metodo END() de un dialog para cerrarlo, se ejecutan los VALID'S de los Controles definidos sobre el propio dialogo. Lo he solucionado cambiando el valor de lModal a .F. justo antes de llamar al END() para que en lugar de EndDialog() ejecute DestroyWindow().
¿Por que pasa esto?
¿Que diferencia hay entre ambas funciones?
¿Puede provocar el uso de DestroyWindow en pérdidas de memoria por no cerrar correctamente los recursos?.
Las llamadas al ACTIVATE del DIALOG las realizo sin especificar la clausula NOWAIT pero ejecutando en el INIT la funcion DlgFullScr( ::hWnd )
Saludos
Diferencia entre EndDialog y DestroyWindow DIALOG:END()
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Toni,
El API de Windows contempla dos tipos de cajas de diálogo: modales y no modales. Las modales se crean (según reglas del API) usando DialogBox() y han de terminarse llamando a EndDialog().
El código fuente del procedimiento de ventana de una caja de diálogo modal no está disponible, ya que Microsoft no lo proporciona, pero se entiende que que se encarga de automatizar una serie de tareas como el uso del tab, el impedir que la ventana padre tome focus, etc. EndDialog() debe forzosamente de llamar a DestroyWindow().
Una caja de diálogo no modal, por el contrario, se construye con CreateDialog() y se destruye con DestroyWindow(). Así lo especifica el API de Windows.
Con el cambio que haces, llamas a DestroyWindow() en vez de a EndDialog(). Debe funcionar porque asi tambien consigues destruir la caja de diálogo, lo que ocurre es que no sabemos si EndDialog() hará más cosas, que quedan sin hacer al llamar a DestroyWindow() directamente.
Has probado la alternativa de quitar todos los VALIDs antes de llamar a oDlg:End() ? de esta forma se evitaría el efecto de que algún VALID se procese, como comentas.
El API de Windows contempla dos tipos de cajas de diálogo: modales y no modales. Las modales se crean (según reglas del API) usando DialogBox() y han de terminarse llamando a EndDialog().
El código fuente del procedimiento de ventana de una caja de diálogo modal no está disponible, ya que Microsoft no lo proporciona, pero se entiende que que se encarga de automatizar una serie de tareas como el uso del tab, el impedir que la ventana padre tome focus, etc. EndDialog() debe forzosamente de llamar a DestroyWindow().
Una caja de diálogo no modal, por el contrario, se construye con CreateDialog() y se destruye con DestroyWindow(). Así lo especifica el API de Windows.
Con el cambio que haces, llamas a DestroyWindow() en vez de a EndDialog(). Debe funcionar porque asi tambien consigues destruir la caja de diálogo, lo que ocurre es que no sabemos si EndDialog() hará más cosas, que quedan sin hacer al llamar a DestroyWindow() directamente.
Has probado la alternativa de quitar todos los VALIDs antes de llamar a oDlg:End() ? de esta forma se evitaría el efecto de que algún VALID se procese, como comentas.
Antonio
Sigue sin funcionar, pero he detectado el motivo por el cual se lanzan los VALID.
Estoy utilizando Menus tipo botones para lanzar el END() del dialog y es justo la perdida del foco el que hace lanzar el VALID. Esto se solucionaría sin pudiera poner la clausula CANCEL a este tipo de Menu.
Saludos
Sigue sin funcionar, pero he detectado el motivo por el cual se lanzan los VALID.
Estoy utilizando Menus tipo botones para lanzar el END() del dialog y es justo la perdida del foco el que hace lanzar el VALID. Esto se solucionaría sin pudiera poner la clausula CANCEL a este tipo de Menu.
Saludos
Toni Sales
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact: