Diferencia entre EndDialog y DestroyWindow DIALOG:END()

Post Reply
tsales
Posts: 186
Joined: Sat Oct 08, 2005 7:32 am

Diferencia entre EndDialog y DestroyWindow DIALOG:END()

Post by tsales »

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
Toni Sales
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
tsales
Posts: 186
Joined: Sat Oct 08, 2005 7:32 am

Post by tsales »

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
Toni Sales
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Toni,

El problema es que un menuitem no es un control de la caja de diálogo luego no podemos usar CANCEL con él.

Prueba a quitarle el VALID al control desde el WHEN del menuitem:
WHEN ( oControl:bValid := nil, .T. )
regards, saludos

Antonio Linares
www.fivetechsoft.com
tsales
Posts: 186
Joined: Sat Oct 08, 2005 7:32 am

Post by tsales »

Antonio
Funciona pero sigue con otro error. Lo he solucionado justo antes del End() del dialog, un End() de cada control incluido en aControls.

Saludos
Toni Sales
Post Reply