Principales respuestas
como bloquear un formulario en ejecucion cuando se abre otro

Pregunta
-
hola a todos por favor necesito una ayuda veran tengo diseñada una pantalla de menú en c# y cuando esta en ejecucion y desde el mismo se abre otras pantallas. pero cuando por error se cierra el formulario de menú y los demas estan abiertos, como debo hacer para que aunque se cierre la pantalla de menu o el formulario principal los demas que estan abiertos no se cierren tambien
lunes, 8 de marzo de 2010 21:21
Respuestas
-
cuando por error se cierra el formulario de menú y los demas estan abiertos, como debo hacer para que aunque se cierre la pantalla de menu o el formulario principal los demas que estan abiertos no se cierren tambien
Abre el archivo Program.cs y examina el método Main. Verás que tiene una sentencia que dice algo así como Application.Run(new Form1()). Esto hace que se muestre el Form1, y a la vez conecta un manejador de eventos al evento Close del formulario que ejecuta un ExitThread al cerrar el form; esto hace que se cierren todos los demás formularios cuando cierras este. El remedio, si no quieres que se cierren los demás, es sacar del Run() el formulario principal. Por lo tanto, el método Main quedaría asi:
(new Form1()).Show();
Aplication.Run();
Si haces esto, recuerda poner en algún sitio alguna opción para cerrar el programa, ya que al cerrar el Form1 el programa sigue en marcha.- Propuesto como respuesta Pablo Gonzalez martes, 9 de marzo de 2010 19:54
- Marcado como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator miércoles, 7 de abril de 2010 17:08
lunes, 8 de marzo de 2010 22:45Moderador -
haber en el ejm que te muestro esta facilisimo....y funciona muy bien lo probe..
1.- crea una aplicacion de pruebas
2.- al crear la aplicacion se crea con el form1 por default.. entonces create un form2
3.-en el form1 haz la propiedad IsMdiContainer en TRUE..
4.-agrega el menu en uno de sus menus llama al segundo form2...
asi..
fom2 fr = new form2();
fr.show()
5.-create una clase con el ejemplo tal como te muestra aqui...
puiblic clas Init:..........etc..
http://geeks.ms/blogs/mrubino/archive/2008/04/17/cerrar-el-formulario-principal-sin-cerrar-la-aplicaci-243-n-c.aspx
una vez creada la clase guarda..
6...en el explorador de soluciones busca la clase Program.cs si es c# .vb si es visual basic--y copia como te muestra en el mismo enlace tal como esta ..
es decir hace que inicie con init la clase init
7..prueba el funcionamiento ...ami me funciona al pelis..
Pablo González Desarrollo de Sistemas. Ecuasoftware.Net Ecuador.- Propuesto como respuesta Pablo Gonzalez martes, 9 de marzo de 2010 19:54
- Marcado como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator miércoles, 7 de abril de 2010 17:08
lunes, 8 de marzo de 2010 23:48 -
hola
pero si necesitas validar eso y la aplciacion no es MDI, o sea no hay formulario contenedor
puedes usar
Application. OpenForms (Propiedad)
con este podrias detectar si hay mas de una instancia de formulario abierta
si solo hay una, quiere decir que solo esta el formulario principal y puede proceder a cerrar
si hay mas de uno, hay varios formularios, por eso no cierras
para ello usa el evento FormClosing del formulario que has definido como principal
private void Form1_FormClosing(Object sender, FormClosingEventArgs e)
{
if(Application.OpenForms.Count > 1)
{
MessageBox.Show("Existen instancias de formulario abiertas, cierrelas");
e.Cancel = true;
}
}
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Marcado como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator miércoles, 7 de abril de 2010 17:08
martes, 9 de marzo de 2010 3:06
Todas las respuestas
-
hola....
una solucion algo modica para que el usuario no cometa el error es llamando a los otros formularios con showDialog...este hace qeu se mantenga el foco de los otros formularios sobre el que abrio asi entonces si no se cierra los formularios hijos por asi decir entonces no podra cerrar el padre ...
..debes de estar usando MDI Container por eso cuando cierras este formulario se cierran los otros..porque de no ser asi no deberia cerrarse ningun otro formulario asi sea el que le llame..
y de ser asi debes implementar este codigo para que cuando se presion x del formulario pregunte si en realidad quiere salir de la aplicacion o cerrar esa ventana..
http://msdn.microsoft.com/es-es/library/system.windows.forms.form.formclosing(VS.80).aspx
Y por ultimo aqui hay un codigo que explica algo como
http://geeks.ms/blogs/mrubino/archive/2008/04/17/cerrar-el-formulario-principal-sin-cerrar-la-aplicaci-243-n-c.aspx
Pablo González Desarrollo de Sistemas. Ecuasoftware.Net Ecuador.lunes, 8 de marzo de 2010 21:59 -
he revisado los formularios y ningundo tiene true la propiedad de IsMdiConteiner, y la verdad el ejemplo no lo entiendo muy bien si puedes ser un poco mas explicito te agradeceria muchisimo...
por que solo deseo que cuando se cierre la pantalla principal no se me cierre las demas que estan abiertas.lunes, 8 de marzo de 2010 22:37 -
cuando por error se cierra el formulario de menú y los demas estan abiertos, como debo hacer para que aunque se cierre la pantalla de menu o el formulario principal los demas que estan abiertos no se cierren tambien
Abre el archivo Program.cs y examina el método Main. Verás que tiene una sentencia que dice algo así como Application.Run(new Form1()). Esto hace que se muestre el Form1, y a la vez conecta un manejador de eventos al evento Close del formulario que ejecuta un ExitThread al cerrar el form; esto hace que se cierren todos los demás formularios cuando cierras este. El remedio, si no quieres que se cierren los demás, es sacar del Run() el formulario principal. Por lo tanto, el método Main quedaría asi:
(new Form1()).Show();
Aplication.Run();
Si haces esto, recuerda poner en algún sitio alguna opción para cerrar el programa, ya que al cerrar el Form1 el programa sigue en marcha.- Propuesto como respuesta Pablo Gonzalez martes, 9 de marzo de 2010 19:54
- Marcado como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator miércoles, 7 de abril de 2010 17:08
lunes, 8 de marzo de 2010 22:45Moderador -
por ejemplo todos los demas formularios tienen la opcion para cerrar, pero me doy cuenta cuando ejecuto desde el visual que cuando cierro la ultima pantalla no se detiene la ejecucion si no que sigue en ese estado pero ya no hay ninguna otra pantalla abierta...lunes, 8 de marzo de 2010 23:06
-
Supongo que Application.Run() contiene el message-loop. Y si se falla el message-loop, el método acaba. Si se postea un WM_QUIT, con por ejemplo, PostQuitMessage(), el message-loop deberia terminar y con eso la aplicación...
¿Sí?lunes, 8 de marzo de 2010 23:23 -
será que me puedas explicar como hago el posteo y donde lo agrego...lunes, 8 de marzo de 2010 23:31
-
haber en el ejm que te muestro esta facilisimo....y funciona muy bien lo probe..
1.- crea una aplicacion de pruebas
2.- al crear la aplicacion se crea con el form1 por default.. entonces create un form2
3.-en el form1 haz la propiedad IsMdiContainer en TRUE..
4.-agrega el menu en uno de sus menus llama al segundo form2...
asi..
fom2 fr = new form2();
fr.show()
5.-create una clase con el ejemplo tal como te muestra aqui...
puiblic clas Init:..........etc..
http://geeks.ms/blogs/mrubino/archive/2008/04/17/cerrar-el-formulario-principal-sin-cerrar-la-aplicaci-243-n-c.aspx
una vez creada la clase guarda..
6...en el explorador de soluciones busca la clase Program.cs si es c# .vb si es visual basic--y copia como te muestra en el mismo enlace tal como esta ..
es decir hace que inicie con init la clase init
7..prueba el funcionamiento ...ami me funciona al pelis..
Pablo González Desarrollo de Sistemas. Ecuasoftware.Net Ecuador.- Propuesto como respuesta Pablo Gonzalez martes, 9 de marzo de 2010 19:54
- Marcado como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator miércoles, 7 de abril de 2010 17:08
lunes, 8 de marzo de 2010 23:48 -
Típicamente se haría en el WM_DESTROY (¿será ese el Unload()?). En el último mensaje que la ventana recibirá.
Yo diría que preguntes si es el último form que queda vivo y entonces invoques a la función (imagino que sera del User32) PostQuitMessage(0). Cero es el exit-code.lunes, 8 de marzo de 2010 23:49 -
me surgio la misma pregunta de hace un momento, ¿como hago para que no este en ejecucion es decir que se detenga la aplicacción?...
martes, 9 de marzo de 2010 0:07 -
sopita la verdad es que no se como hacer lo que me sugieres ayudame por favor....
como y donde debo hacer esa funcion y desde donde debo llamarla....martes, 9 de marzo de 2010 0:34 -
Ok. Voy a ver si tipeo algo y si funciona. Dame algún minuto...martes, 9 de marzo de 2010 0:39
-
ok maestro, muchas gracias por la ayuda...martes, 9 de marzo de 2010 0:58
-
Si, pero no programando peces.
Instancié tres diferentes clases de form's como te indica Alberto.
En una de ellas, en el FormClosed(), invoque a PostQuitMessage(0), previo
using System.Runtime.InteropServices;
y
[DllImport("user32")] public static extern void PostQuitMessage(int nExitCode);
Cuando cierro el form de esa clase, el programa se cierra, haya o no otros forms abiertos. Digamos que el Run() termina y con él acaba la función principal de usuario.
No diré que me gusta, pero se cierra...martes, 9 de marzo de 2010 1:26 -
mira todo funciona muy bien. pero si me puedes indicar como puedo controlar a manera de codigo si todos los formularios hijos estan cerrados, te pregunto eso por que con la función que me diste me dejó en lo mismo.
Para ser mas explicito lo que deseo es que no se cierre la pantalla principal mientras los demas formulario estan abiertos.... no sé si me explique con la problemática.
saludos
Mario Ayala.martes, 9 de marzo de 2010 2:19 -
hola
pero si necesitas validar eso y la aplciacion no es MDI, o sea no hay formulario contenedor
puedes usar
Application. OpenForms (Propiedad)
con este podrias detectar si hay mas de una instancia de formulario abierta
si solo hay una, quiere decir que solo esta el formulario principal y puede proceder a cerrar
si hay mas de uno, hay varios formularios, por eso no cierras
para ello usa el evento FormClosing del formulario que has definido como principal
private void Form1_FormClosing(Object sender, FormClosingEventArgs e)
{
if(Application.OpenForms.Count > 1)
{
MessageBox.Show("Existen instancias de formulario abiertas, cierrelas");
e.Cancel = true;
}
}
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Marcado como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator miércoles, 7 de abril de 2010 17:08
martes, 9 de marzo de 2010 3:06