![]() |
| |||||||
| Registrarse | Preguntas Frecuentes | Lista de Foreros | Calendario | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
| | LinkBack | Herramientas | Desplegado |
| |||
| Hola a todos! Trabajo con Delphi 7 en Windows 2000 Estoy diseñando una aplicacion MDI con un MainForm y varios ChildForm. Al cerrar el MainForm quiero que los eventos OnClose de los hijos se disparen. Es por eso que en el evento OnClose del MainForm pongo el siguiente codigo: for i := 0 to MDIChildCount - 1 do MDIChildren[i].Close De este modo, todos los eventos OnClose de los hijos se llamaran. En el codigo OnClose de los hijos tengo el siguiente codigo: action := caFree; Esto funciona correctamente, los hijos se cierran y nadie protesta. El problema viene cuando pretendo meter un codigo mas complicado en el OnClose de los hijos. Mi idea es hacer que cuando se dispare este evento aparezca un cuadro de dialogo preguntando si se desea guardar los cambios. Ahi surgen los problemas. De hecho, con tan solo hacer un ShowMessage, los problemas aparecen tambien. Por ejemplo, este codigo (en el OnClose del hijo): ShowMessage('La ventana se cerrara'); action := caFree; da problemas. Supongamos que tenemos tres hijos (con menos hijos no hay problemas). Al cerrarse el segundo hijo, en el momento que se intenta cerrar el tercer y ultimo hijo, ocurre una excepcion: "Access violation at address... etc" Depurando he comprobado que al cerrarse el segundo hijo el valor de MDIChildCount ha variado, de tres a dos. Por tanto, supongo que en MDIChildren ha desaparecido uno de los hijos, y que entonces el bucle esta intentando acceder a un valor de MDIChildren (MDIChildren[2]) que no existe realmente. Mi pregunta es: ¿Porque ocurre esto? ¿Como hago para mantener invariable el valor de MDIChildren y MDIChildCount? ¿Existe alguna otra alternativa para cerrar hijos (aparte de Destroy, que no me gusta)? He probado el CloseWindow, de la API de windows, pero lo que hace es minimizar, no cerrar. Muchas gracias a todos. Espero haberme explicado bien, y que no haya sido mucha chapa. Saludos, Schumacker |
| | ||||
| ||||
| |
| |||
| en vez de usar el evento onclose , usa el evento onclosequery del form sacado de la ayuda de delphi When the user attempts to close the form in this example, a message dialog appears that asks the user if it is OK to close the form. If the user chooses the OK button, the form closes. If the user chooses Cancel, the form doesn't close. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if MessageDlg('Close the form?', mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then CanClose := False; end; "schumacker" <miguelcampoy***hotmail.com> escribió en el mensaje news:e1eadaf3.0408110220.71a936a1***posting.google.c om... > Hola a todos! > Trabajo con Delphi 7 en Windows 2000 > > Estoy diseñando una aplicacion MDI con un MainForm y varios ChildForm. > Al cerrar el MainForm quiero que los eventos OnClose de los hijos se > disparen. Es por eso que en el evento OnClose del MainForm pongo el > siguiente codigo: > > for i := 0 to MDIChildCount - 1 do > MDIChildren[i].Close > > De este modo, todos los eventos OnClose de los hijos se llamaran. En > el codigo OnClose de los hijos tengo el siguiente codigo: > > action := caFree; > > Esto funciona correctamente, los hijos se cierran y nadie protesta. El > problema viene cuando pretendo meter un codigo mas complicado en el > OnClose de los hijos. Mi idea es hacer que cuando se dispare este > evento aparezca un cuadro de dialogo preguntando si se desea guardar > los cambios. Ahi surgen los problemas. De hecho, con tan solo hacer un > ShowMessage, los problemas aparecen tambien. Por ejemplo, este codigo > (en el OnClose del hijo): > > ShowMessage('La ventana se cerrara'); > action := caFree; > > da problemas. Supongamos que tenemos tres hijos (con menos hijos no > hay problemas). Al cerrarse el segundo hijo, en el momento que se > intenta cerrar el tercer y ultimo hijo, ocurre una excepcion: "Access > violation at address... etc" > > Depurando he comprobado que al cerrarse el segundo hijo el valor de > MDIChildCount ha variado, de tres a dos. Por tanto, supongo que en > MDIChildren ha desaparecido uno de los hijos, y que entonces el bucle > esta intentando acceder a un valor de MDIChildren (MDIChildren[2]) que > no existe realmente. > > Mi pregunta es: ¿Porque ocurre esto? ¿Como hago para mantener > invariable el valor de MDIChildren y MDIChildCount? ¿Existe alguna > otra alternativa para cerrar hijos (aparte de Destroy, que no me > gusta)? He probado el CloseWindow, de la API de windows, pero lo que > hace es minimizar, no cerrar. > > Muchas gracias a todos. Espero haberme explicado bien, y que no haya > sido mucha chapa. > > Saludos, > Schumacker |
| |||
| en vez de usar el evento onclose , usa el evento onclosequery del form sacado de la ayuda de delphi When the user attempts to close the form in this example, a message dialog appears that asks the user if it is OK to close the form. If the user chooses the OK button, the form closes. If the user chooses Cancel, the form doesn't close. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if MessageDlg('Close the form?', mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then CanClose := False; end; "schumacker" <miguelcampoy***hotmail.com> escribió en el mensaje news:e1eadaf3.0408110220.71a936a1***posting.google.c om... > Hola a todos! > Trabajo con Delphi 7 en Windows 2000 > > Estoy diseñando una aplicacion MDI con un MainForm y varios ChildForm. > Al cerrar el MainForm quiero que los eventos OnClose de los hijos se > disparen. Es por eso que en el evento OnClose del MainForm pongo el > siguiente codigo: > > for i := 0 to MDIChildCount - 1 do > MDIChildren[i].Close > > De este modo, todos los eventos OnClose de los hijos se llamaran. En > el codigo OnClose de los hijos tengo el siguiente codigo: > > action := caFree; > > Esto funciona correctamente, los hijos se cierran y nadie protesta. El > problema viene cuando pretendo meter un codigo mas complicado en el > OnClose de los hijos. Mi idea es hacer que cuando se dispare este > evento aparezca un cuadro de dialogo preguntando si se desea guardar > los cambios. Ahi surgen los problemas. De hecho, con tan solo hacer un > ShowMessage, los problemas aparecen tambien. Por ejemplo, este codigo > (en el OnClose del hijo): > > ShowMessage('La ventana se cerrara'); > action := caFree; > > da problemas. Supongamos que tenemos tres hijos (con menos hijos no > hay problemas). Al cerrarse el segundo hijo, en el momento que se > intenta cerrar el tercer y ultimo hijo, ocurre una excepcion: "Access > violation at address... etc" > > Depurando he comprobado que al cerrarse el segundo hijo el valor de > MDIChildCount ha variado, de tres a dos. Por tanto, supongo que en > MDIChildren ha desaparecido uno de los hijos, y que entonces el bucle > esta intentando acceder a un valor de MDIChildren (MDIChildren[2]) que > no existe realmente. > > Mi pregunta es: ¿Porque ocurre esto? ¿Como hago para mantener > invariable el valor de MDIChildren y MDIChildCount? ¿Existe alguna > otra alternativa para cerrar hijos (aparte de Destroy, que no me > gusta)? He probado el CloseWindow, de la API de windows, pero lo que > hace es minimizar, no cerrar. > > Muchas gracias a todos. Espero haberme explicado bien, y que no haya > sido mucha chapa. > > Saludos, > Schumacker |
| |||
| en vez de usar el evento onclose , usa el evento onclosequery del form sacado de la ayuda de delphi When the user attempts to close the form in this example, a message dialog appears that asks the user if it is OK to close the form. If the user chooses the OK button, the form closes. If the user chooses Cancel, the form doesn't close. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if MessageDlg('Close the form?', mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then CanClose := False; end; "schumacker" <miguelcampoy***hotmail.com> escribió en el mensaje news:e1eadaf3.0408110220.71a936a1***posting.google.c om... > Hola a todos! > Trabajo con Delphi 7 en Windows 2000 > > Estoy diseñando una aplicacion MDI con un MainForm y varios ChildForm. > Al cerrar el MainForm quiero que los eventos OnClose de los hijos se > disparen. Es por eso que en el evento OnClose del MainForm pongo el > siguiente codigo: > > for i := 0 to MDIChildCount - 1 do > MDIChildren[i].Close > > De este modo, todos los eventos OnClose de los hijos se llamaran. En > el codigo OnClose de los hijos tengo el siguiente codigo: > > action := caFree; > > Esto funciona correctamente, los hijos se cierran y nadie protesta. El > problema viene cuando pretendo meter un codigo mas complicado en el > OnClose de los hijos. Mi idea es hacer que cuando se dispare este > evento aparezca un cuadro de dialogo preguntando si se desea guardar > los cambios. Ahi surgen los problemas. De hecho, con tan solo hacer un > ShowMessage, los problemas aparecen tambien. Por ejemplo, este codigo > (en el OnClose del hijo): > > ShowMessage('La ventana se cerrara'); > action := caFree; > > da problemas. Supongamos que tenemos tres hijos (con menos hijos no > hay problemas). Al cerrarse el segundo hijo, en el momento que se > intenta cerrar el tercer y ultimo hijo, ocurre una excepcion: "Access > violation at address... etc" > > Depurando he comprobado que al cerrarse el segundo hijo el valor de > MDIChildCount ha variado, de tres a dos. Por tanto, supongo que en > MDIChildren ha desaparecido uno de los hijos, y que entonces el bucle > esta intentando acceder a un valor de MDIChildren (MDIChildren[2]) que > no existe realmente. > > Mi pregunta es: ¿Porque ocurre esto? ¿Como hago para mantener > invariable el valor de MDIChildren y MDIChildCount? ¿Existe alguna > otra alternativa para cerrar hijos (aparte de Destroy, que no me > gusta)? He probado el CloseWindow, de la API de windows, pero lo que > hace es minimizar, no cerrar. > > Muchas gracias a todos. Espero haberme explicado bien, y que no haya > sido mucha chapa. > > Saludos, > Schumacker |
| |||
| en vez de usar el evento onclose , usa el evento onclosequery del form sacado de la ayuda de delphi When the user attempts to close the form in this example, a message dialog appears that asks the user if it is OK to close the form. If the user chooses the OK button, the form closes. If the user chooses Cancel, the form doesn't close. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if MessageDlg('Close the form?', mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then CanClose := False; end; "schumacker" <miguelcampoy***hotmail.com> escribió en el mensaje news:e1eadaf3.0408110220.71a936a1***posting.google.c om... > Hola a todos! > Trabajo con Delphi 7 en Windows 2000 > > Estoy diseñando una aplicacion MDI con un MainForm y varios ChildForm. > Al cerrar el MainForm quiero que los eventos OnClose de los hijos se > disparen. Es por eso que en el evento OnClose del MainForm pongo el > siguiente codigo: > > for i := 0 to MDIChildCount - 1 do > MDIChildren[i].Close > > De este modo, todos los eventos OnClose de los hijos se llamaran. En > el codigo OnClose de los hijos tengo el siguiente codigo: > > action := caFree; > > Esto funciona correctamente, los hijos se cierran y nadie protesta. El > problema viene cuando pretendo meter un codigo mas complicado en el > OnClose de los hijos. Mi idea es hacer que cuando se dispare este > evento aparezca un cuadro de dialogo preguntando si se desea guardar > los cambios. Ahi surgen los problemas. De hecho, con tan solo hacer un > ShowMessage, los problemas aparecen tambien. Por ejemplo, este codigo > (en el OnClose del hijo): > > ShowMessage('La ventana se cerrara'); > action := caFree; > > da problemas. Supongamos que tenemos tres hijos (con menos hijos no > hay problemas). Al cerrarse el segundo hijo, en el momento que se > intenta cerrar el tercer y ultimo hijo, ocurre una excepcion: "Access > violation at address... etc" > > Depurando he comprobado que al cerrarse el segundo hijo el valor de > MDIChildCount ha variado, de tres a dos. Por tanto, supongo que en > MDIChildren ha desaparecido uno de los hijos, y que entonces el bucle > esta intentando acceder a un valor de MDIChildren (MDIChildren[2]) que > no existe realmente. > > Mi pregunta es: ¿Porque ocurre esto? ¿Como hago para mantener > invariable el valor de MDIChildren y MDIChildCount? ¿Existe alguna > otra alternativa para cerrar hijos (aparte de Destroy, que no me > gusta)? He probado el CloseWindow, de la API de windows, pero lo que > hace es minimizar, no cerrar. > > Muchas gracias a todos. Espero haberme explicado bien, y que no haya > sido mucha chapa. > > Saludos, > Schumacker |
| |||
| en vez de usar el evento onclose , usa el evento onclosequery del form sacado de la ayuda de delphi When the user attempts to close the form in this example, a message dialog appears that asks the user if it is OK to close the form. If the user chooses the OK button, the form closes. If the user chooses Cancel, the form doesn't close. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if MessageDlg('Close the form?', mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then CanClose := False; end; "schumacker" <miguelcampoy***hotmail.com> escribió en el mensaje news:e1eadaf3.0408110220.71a936a1***posting.google.c om... > Hola a todos! > Trabajo con Delphi 7 en Windows 2000 > > Estoy diseñando una aplicacion MDI con un MainForm y varios ChildForm. > Al cerrar el MainForm quiero que los eventos OnClose de los hijos se > disparen. Es por eso que en el evento OnClose del MainForm pongo el > siguiente codigo: > > for i := 0 to MDIChildCount - 1 do > MDIChildren[i].Close > > De este modo, todos los eventos OnClose de los hijos se llamaran. En > el codigo OnClose de los hijos tengo el siguiente codigo: > > action := caFree; > > Esto funciona correctamente, los hijos se cierran y nadie protesta. El > problema viene cuando pretendo meter un codigo mas complicado en el > OnClose de los hijos. Mi idea es hacer que cuando se dispare este > evento aparezca un cuadro de dialogo preguntando si se desea guardar > los cambios. Ahi surgen los problemas. De hecho, con tan solo hacer un > ShowMessage, los problemas aparecen tambien. Por ejemplo, este codigo > (en el OnClose del hijo): > > ShowMessage('La ventana se cerrara'); > action := caFree; > > da problemas. Supongamos que tenemos tres hijos (con menos hijos no > hay problemas). Al cerrarse el segundo hijo, en el momento que se > intenta cerrar el tercer y ultimo hijo, ocurre una excepcion: "Access > violation at address... etc" > > Depurando he comprobado que al cerrarse el segundo hijo el valor de > MDIChildCount ha variado, de tres a dos. Por tanto, supongo que en > MDIChildren ha desaparecido uno de los hijos, y que entonces el bucle > esta intentando acceder a un valor de MDIChildren (MDIChildren[2]) que > no existe realmente. > > Mi pregunta es: ¿Porque ocurre esto? ¿Como hago para mantener > invariable el valor de MDIChildren y MDIChildCount? ¿Existe alguna > otra alternativa para cerrar hijos (aparte de Destroy, que no me > gusta)? He probado el CloseWindow, de la API de windows, pero lo que > hace es minimizar, no cerrar. > > Muchas gracias a todos. Espero haberme explicado bien, y que no haya > sido mucha chapa. > > Saludos, > Schumacker |
| |||
| en vez de usar el evento onclose , usa el evento onclosequery del form sacado de la ayuda de delphi When the user attempts to close the form in this example, a message dialog appears that asks the user if it is OK to close the form. If the user chooses the OK button, the form closes. If the user chooses Cancel, the form doesn't close. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if MessageDlg('Close the form?', mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then CanClose := False; end; "schumacker" <miguelcampoy***hotmail.com> escribió en el mensaje news:e1eadaf3.0408110220.71a936a1***posting.google.c om... > Hola a todos! > Trabajo con Delphi 7 en Windows 2000 > > Estoy diseñando una aplicacion MDI con un MainForm y varios ChildForm. > Al cerrar el MainForm quiero que los eventos OnClose de los hijos se > disparen. Es por eso que en el evento OnClose del MainForm pongo el > siguiente codigo: > > for i := 0 to MDIChildCount - 1 do > MDIChildren[i].Close > > De este modo, todos los eventos OnClose de los hijos se llamaran. En > el codigo OnClose de los hijos tengo el siguiente codigo: > > action := caFree; > > Esto funciona correctamente, los hijos se cierran y nadie protesta. El > problema viene cuando pretendo meter un codigo mas complicado en el > OnClose de los hijos. Mi idea es hacer que cuando se dispare este > evento aparezca un cuadro de dialogo preguntando si se desea guardar > los cambios. Ahi surgen los problemas. De hecho, con tan solo hacer un > ShowMessage, los problemas aparecen tambien. Por ejemplo, este codigo > (en el OnClose del hijo): > > ShowMessage('La ventana se cerrara'); > action := caFree; > > da problemas. Supongamos que tenemos tres hijos (con menos hijos no > hay problemas). Al cerrarse el segundo hijo, en el momento que se > intenta cerrar el tercer y ultimo hijo, ocurre una excepcion: "Access > violation at address... etc" > > Depurando he comprobado que al cerrarse el segundo hijo el valor de > MDIChildCount ha variado, de tres a dos. Por tanto, supongo que en > MDIChildren ha desaparecido uno de los hijos, y que entonces el bucle > esta intentando acceder a un valor de MDIChildren (MDIChildren[2]) que > no existe realmente. > > Mi pregunta es: ¿Porque ocurre esto? ¿Como hago para mantener > invariable el valor de MDIChildren y MDIChildCount? ¿Existe alguna > otra alternativa para cerrar hijos (aparte de Destroy, que no me > gusta)? He probado el CloseWindow, de la API de windows, pero lo que > hace es minimizar, no cerrar. > > Muchas gracias a todos. Espero haberme explicado bien, y que no haya > sido mucha chapa. > > Saludos, > Schumacker |
| |||
| en vez de usar el evento onclose , usa el evento onclosequery del form sacado de la ayuda de delphi When the user attempts to close the form in this example, a message dialog appears that asks the user if it is OK to close the form. If the user chooses the OK button, the form closes. If the user chooses Cancel, the form doesn't close. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if MessageDlg('Close the form?', mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then CanClose := False; end; "schumacker" <miguelcampoy***hotmail.com> escribió en el mensaje news:e1eadaf3.0408110220.71a936a1***posting.google.c om... > Hola a todos! > Trabajo con Delphi 7 en Windows 2000 > > Estoy diseñando una aplicacion MDI con un MainForm y varios ChildForm. > Al cerrar el MainForm quiero que los eventos OnClose de los hijos se > disparen. Es por eso que en el evento OnClose del MainForm pongo el > siguiente codigo: > > for i := 0 to MDIChildCount - 1 do > MDIChildren[i].Close > > De este modo, todos los eventos OnClose de los hijos se llamaran. En > el codigo OnClose de los hijos tengo el siguiente codigo: > > action := caFree; > > Esto funciona correctamente, los hijos se cierran y nadie protesta. El > problema viene cuando pretendo meter un codigo mas complicado en el > OnClose de los hijos. Mi idea es hacer que cuando se dispare este > evento aparezca un cuadro de dialogo preguntando si se desea guardar > los cambios. Ahi surgen los problemas. De hecho, con tan solo hacer un > ShowMessage, los problemas aparecen tambien. Por ejemplo, este codigo > (en el OnClose del hijo): > > ShowMessage('La ventana se cerrara'); > action := caFree; > > da problemas. Supongamos que tenemos tres hijos (con menos hijos no > hay problemas). Al cerrarse el segundo hijo, en el momento que se > intenta cerrar el tercer y ultimo hijo, ocurre una excepcion: "Access > violation at address... etc" > > Depurando he comprobado que al cerrarse el segundo hijo el valor de > MDIChildCount ha variado, de tres a dos. Por tanto, supongo que en > MDIChildren ha desaparecido uno de los hijos, y que entonces el bucle > esta intentando acceder a un valor de MDIChildren (MDIChildren[2]) que > no existe realmente. > > Mi pregunta es: ¿Porque ocurre esto? ¿Como hago para mantener > invariable el valor de MDIChildren y MDIChildCount? ¿Existe alguna > otra alternativa para cerrar hijos (aparte de Destroy, que no me > gusta)? He probado el CloseWindow, de la API de windows, pero lo que > hace es minimizar, no cerrar. > > Muchas gracias a todos. Espero haberme explicado bien, y que no haya > sido mucha chapa. > > Saludos, > Schumacker |
| |||
| ah se me olvidava, en el onclose, debes dejar el action:=cafree; "RangerWalker" <RangerWalkerNOTSPAM***terra.es> escribió en el mensaje news:dRnSc.1865052$A6.7090052***telenews.teleline.es ... > en vez de usar el evento onclose , usa el evento onclosequery del form > > sacado de la ayuda de delphi > > When the user attempts to close the form in this example, a message dialog > appears that asks the user if it is OK to close the form. If the user > chooses the OK button, the form closes. If the user chooses Cancel, the form > doesn't close. > > procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); > > begin > if MessageDlg('Close the form?', mtConfirmation, > [mbOk, mbCancel], 0) = mrCancel then > CanClose := False; > end; > > > "schumacker" <miguelcampoy***hotmail.com> escribió en el mensaje > news:e1eadaf3.0408110220.71a936a1***posting.google.c om... > > Hola a todos! > > Trabajo con Delphi 7 en Windows 2000 > > > > Estoy diseñando una aplicacion MDI con un MainForm y varios ChildForm. > > Al cerrar el MainForm quiero que los eventos OnClose de los hijos se > > disparen. Es por eso que en el evento OnClose del MainForm pongo el > > siguiente codigo: > > > > for i := 0 to MDIChildCount - 1 do > > MDIChildren[i].Close > > > > De este modo, todos los eventos OnClose de los hijos se llamaran. En > > el codigo OnClose de los hijos tengo el siguiente codigo: > > > > action := caFree; > > > > Esto funciona correctamente, los hijos se cierran y nadie protesta. El > > problema viene cuando pretendo meter un codigo mas complicado en el > > OnClose de los hijos. Mi idea es hacer que cuando se dispare este > > evento aparezca un cuadro de dialogo preguntando si se desea guardar > > los cambios. Ahi surgen los problemas. De hecho, con tan solo hacer un > > ShowMessage, los problemas aparecen tambien. Por ejemplo, este codigo > > (en el OnClose del hijo): > > > > ShowMessage('La ventana se cerrara'); > > action := caFree; > > > > da problemas. Supongamos que tenemos tres hijos (con menos hijos no > > hay problemas). Al cerrarse el segundo hijo, en el momento que se > > intenta cerrar el tercer y ultimo hijo, ocurre una excepcion: "Access > > violation at address... etc" > > > > Depurando he comprobado que al cerrarse el segundo hijo el valor de > > MDIChildCount ha variado, de tres a dos. Por tanto, supongo que en > > MDIChildren ha desaparecido uno de los hijos, y que entonces el bucle > > esta intentando acceder a un valor de MDIChildren (MDIChildren[2]) que > > no existe realmente. > > > > Mi pregunta es: ¿Porque ocurre esto? ¿Como hago para mantener > > invariable el valor de MDIChildren y MDIChildCount? ¿Existe alguna > > otra alternativa para cerrar hijos (aparte de Destroy, que no me > > gusta)? He probado el CloseWindow, de la API de windows, pero lo que > > hace es minimizar, no cerrar. > > > > Muchas gracias a todos. Espero haberme explicado bien, y que no haya > > sido mucha chapa. > > > > Saludos, > > Schumacker > > |
| |||
| ah se me olvidava, en el onclose, debes dejar el action:=cafree; "RangerWalker" <RangerWalkerNOTSPAM***terra.es> escribió en el mensaje news:dRnSc.1865052$A6.7090052***telenews.teleline.es ... > en vez de usar el evento onclose , usa el evento onclosequery del form > > sacado de la ayuda de delphi > > When the user attempts to close the form in this example, a message dialog > appears that asks the user if it is OK to close the form. If the user > chooses the OK button, the form closes. If the user chooses Cancel, the form > doesn't close. > > procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); > > begin > if MessageDlg('Close the form?', mtConfirmation, > [mbOk, mbCancel], 0) = mrCancel then > CanClose := False; > end; > > > "schumacker" <miguelcampoy***hotmail.com> escribió en el mensaje > news:e1eadaf3.0408110220.71a936a1***posting.google.c om... > > Hola a todos! > > Trabajo con Delphi 7 en Windows 2000 > > > > Estoy diseñando una aplicacion MDI con un MainForm y varios ChildForm. > > Al cerrar el MainForm quiero que los eventos OnClose de los hijos se > > disparen. Es por eso que en el evento OnClose del MainForm pongo el > > siguiente codigo: > > > > for i := 0 to MDIChildCount - 1 do > > MDIChildren[i].Close > > > > De este modo, todos los eventos OnClose de los hijos se llamaran. En > > el codigo OnClose de los hijos tengo el siguiente codigo: > > > > action := caFree; > > > > Esto funciona correctamente, los hijos se cierran y nadie protesta. El > > problema viene cuando pretendo meter un codigo mas complicado en el > > OnClose de los hijos. Mi idea es hacer que cuando se dispare este > > evento aparezca un cuadro de dialogo preguntando si se desea guardar > > los cambios. Ahi surgen los problemas. De hecho, con tan solo hacer un > > ShowMessage, los problemas aparecen tambien. Por ejemplo, este codigo > > (en el OnClose del hijo): > > > > ShowMessage('La ventana se cerrara'); > > action := caFree; > > > > da problemas. Supongamos que tenemos tres hijos (con menos hijos no > > hay problemas). Al cerrarse el segundo hijo, en el momento que se > > intenta cerrar el tercer y ultimo hijo, ocurre una excepcion: "Access > > violation at address... etc" > > > > Depurando he comprobado que al cerrarse el segundo hijo el valor de > > MDIChildCount ha variado, de tres a dos. Por tanto, supongo que en > > MDIChildren ha desaparecido uno de los hijos, y que entonces el bucle > > esta intentando acceder a un valor de MDIChildren (MDIChildren[2]) que > > no existe realmente. > > > > Mi pregunta es: ¿Porque ocurre esto? ¿Como hago para mantener > > invariable el valor de MDIChildren y MDIChildCount? ¿Existe alguna > > otra alternativa para cerrar hijos (aparte de Destroy, que no me > > gusta)? He probado el CloseWindow, de la API de windows, pero lo que > > hace es minimizar, no cerrar. > > > > Muchas gracias a todos. Espero haberme explicado bien, y que no haya > > sido mucha chapa. > > > > Saludos, > > Schumacker > > |
| |
| |
![]() |
| Herramientas | |
| Desplegado | |
| |
Temas Similares | ||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| problema al cerrar word 2007 | Heriberto Martinez Roa | Newsgroup microsoft.public.es.word | 16 | 07-07-2008 00:22:03 |
| Problema al cerrar sesión | JOSE LUIS | Newsgroup microsoft.public.es.windowsvista | 2 | 07-02-2008 17:12:02 |
| problema al cerrar el outlook | Jorge | Newsgroup microsoft.public.es.outlook | 2 | 07-02-2008 14:11:58 |
| Problema al cerrar | Albert | Newsgroup es.comp.lenguajes.visual-basic | 0 | 25-01-2008 07:33:57 |
| Cerrar Aplicaciones/procesos en un Terminal Server | Jesús | Newsgroup es.comp.lenguajes.visual-basic | 14 | 17-01-2005 12:43:49 |