Mostrar ventana de espera mientras se ejecuta un proceso

9,501 views
Skip to first unread message

Geovanny Quirós Castillo

unread,
Jan 9, 2013, 5:20:33 PM1/9/13
to vfp-a-c...@googlegroups.com
Hola amigos,
cómo podría hacer para presentar en pantalla una ventana con un mensaje de espera mientras se ejecuta un proceso en una aplicación Windows?
Podría ser algo como lo que uno solía hacer en fox con el wait window.
Estoy trabajando con vb.net 2008 express.
Gracias
 
 

Victor Espina

unread,
Jan 9, 2013, 8:13:49 PM1/9/13
to vfp-a-c...@googlegroups.com
No existe (hasta donde se) un equivalente al WAIT WINDOWS en VFP.  En todo caso, al menos yo, nunca usaba el WAIT WINDOW mas que para mensaje de depuracion; para mensajes de "Por favor, espere" siempre use un form no modal, especialmente disenado para esa funcion, y lo mismo puedes hacer aca en .NET.

El truco es que un form no modal se muestra y luego continua con la ejecucion del codigo que sigue a su llamada.  Por tanto, la forma seria:

a) Mostrar la forma de "Espere..."
b) HAcer tu proceso
c) Ocultar o destruir la forma "Espere"

Saludos

Victor Espina

Geovanny Quirós Castillo

unread,
Jan 9, 2013, 8:58:46 PM1/9/13
to vfp-a-c...@googlegroups.com
Gracias por responder Victor,
voy a hacer pruebas.
Saludos
--
 
 
 

Fox Friend

unread,
Jan 9, 2013, 10:44:33 PM1/9/13
to vfp-a-c...@googlegroups.com

Geovanny Quirós Castillo

unread,
Jan 10, 2013, 9:26:12 AM1/10/13
to vfp-a-c...@googlegroups.com
Hola Victor,
ya hice lo que me sugeriste y funciona bien, pero...no me muestra el texto del label ni la imagen del picturebox, alguna sugerencia.
Saludos
 
 
Sent: Wednesday, January 9, 2013 7:13 PM
--
 
 
 

Victor Espina

unread,
Jan 10, 2013, 9:38:52 AM1/10/13
to vfp-a-c...@googlegroups.com
Este es un ejemplo de un form no modal especialmente disenado para funcionar como "WAIT". A nivel de codigo, esta encapsulado en una clase helper. asi que todo lo que tengo que hacer es:

NVDialogs.Wait("Procesando, por favor espere...")

* Acciones

NVDialogs.Wait()


Esto mismo puede ser implementado en .NET usando metodos STATIC.


Saludos
Screen Shot 2013-01-10 at 11.36.33 AM.png

Victor Espina

unread,
Jan 10, 2013, 9:44:30 AM1/10/13
to vfp-a-c...@googlegroups.com
Amigo, como siempre respondiendo lo que no comprendes.    Primero, nadie hable de modo consola. NADIE usa el modo consola, excepto para crear utilitarios de linea de comando.

Segundo, el MessageBox() no aplica en este caso muestra una ventana modal que no permite que continue la ejeecucion hasta que no se cierre.... justamente lo contrario de lo que se quiere.

Lo que el OP (Original Poster) queria era una forma de mostrar un mensaje en pantalla MIENTRAS se ejecuta un proceso que consume mucho tiempo... algo mas similar al WAIT WINDOWS NOWAIT.  Por ende, POR DEFINICION, cualquier solucion tiene que pasar por la via de un form NO MODAL.


Saludos

Victor Espina

Victor Espina

unread,
Jan 10, 2013, 9:49:18 AM1/10/13
to vfp-a-c...@googlegroups.com
Fijate que respondiendote a ti me di cuenta que no es tan cierto eso de que "cualquier solucion tiene que venir por la via de un formulario no modal".

En algunos sistemas he implementado la idea de un "MesageBar". Este es un control basado en Container que se ubica a todo lo ancho del form, justo en el margen superior del mismo, y esta escondido. 

Cuando deseo mostrar un mensaje de "Procesando, espere", simplemente invoco un metodo del conrol que cambia el contenido de un label dentro del container y luego hace el control visible.  El usuario ve entonces como aparece una barra grande (de unos 75 a 100 pixeles de alto) en la parte superior del form que dice "Por favor, espere" y se mantiene visible hasta que el proceso subyacente finaliza.  En ese momento invoco otro metodo del control que simplemente lo esconde.

Se logra el mismo efecto pero sin requerir de un form.


Saludos

Victor Espina
Screen Shot 2013-01-10 at 11.48.27 AM.png

Fox Friend

unread,
Jan 10, 2013, 9:56:05 AM1/10/13
to vfp-a-c...@googlegroups.com
Victor,

Me enredaste mas...

El Wait window deja ejecutar otras acciones mientras sigue apareciendo el mensaje en la pantalla?...

Saludos!

Geovanny Quirós Castillo

unread,
Jan 10, 2013, 9:56:20 AM1/10/13
to vfp-a-c...@googlegroups.com
FoxFriend, el wait window con la clausula nowait sirve para mostrar un mensaje de espera mientras se ejecuta un proceso.
--
 
 
 

Geovanny Quirós Castillo

unread,
Jan 10, 2013, 9:59:03 AM1/10/13
to vfp-a-c...@googlegroups.com
Victor, con la sugerencia anterior me funcionó mas o menos bien mostrar el formulario en modo no modal, pero me quedó la pulga de que no pinta los controles en el mismo.
Mira la imagen.
image
 
 
Sent: Thursday, January 10, 2013 8:49 AM
--
 
 
 
image[1].png

Fox Friend

unread,
Jan 10, 2013, 11:09:01 AM1/10/13
to vfp-a-c...@googlegroups.com
He leído algunas veces sobre los Backgrounders, pero no sé si ese tema te sirva:

Domingo Cuevas

unread,
Jan 10, 2013, 11:51:02 AM1/10/13
to vfp-a-c...@googlegroups.com

Geovanny,

 

Prueba lo que esta en el siguiente link.

 

http://www.codeproject.com/Articles/449594/Progress-Bars-Threads-Windows-Forms-and-You

 

Saludos,

--
 
 
 

image001.png

Geovanny Quirós Castillo

unread,
Jan 10, 2013, 12:07:40 PM1/10/13
to vfp-a-c...@googlegroups.com
Gracias Domingo, voy a revisar.
Saludos
--
 
 
 
image001.png

Domingo Cuevas

unread,
Jan 10, 2013, 3:02:24 PM1/10/13
to vfp-a-c...@googlegroups.com

Estuve probando sin usar:Threads o Backgrounders.

 

Cree 2 formularios, en el formulario principal tengo un boton, el cual tiene el siguiente codigo:

 

frm = new MsgForm();

frm.Show();

for (int i = 0; i <= 100; i++)

{

   frm.Actualizar(i);

   Application.DoEvents();

}

 

En el formulario 2 tengo un label y progressbar, el cual tiene la clase “Actualizar()” que recibe un Entero con el asigno el valor al progressbar.

 

Esto me funcionó. Va actualizado la barra de progreso de acuerdo al ciclo del “for”.

 

Espero esto te sirva.

--
 
 
 

image001.png

thenewin...@gmail.com

unread,
Jan 10, 2013, 3:23:06 PM1/10/13
to vfp-a-c...@googlegroups.com
Bueno, si el tema ya cambió a una progress bar, en el manual de 2 partes que les envié viene un código muy sencillo de cómo configurar una barra de progreso.

El enlace para bajar el curso está aquí:


El código era de muy pocas líneas. Solo hay que leerlo.. eso es todo..

Saludos!

Domingo Cuevas

unread,
Jan 10, 2013, 3:51:58 PM1/10/13
to vfp-a-c...@googlegroups.com

El tema no cambio, sigue el de mostrar una ventana con un mensaje de espera. La prueba que hice fue con la barra de progreso, por que me interesaba ver si en medio del proceso actualizaba la ventana del mensaje.

 

Para lo que quiere Geovanny le funciona, hice esa prueba porque con threads y Backgrounders es mas complicado.

 

Saludos,

--
 
 
 

Geovanny Quirós Castillo

unread,
Jan 10, 2013, 4:18:11 PM1/10/13
to vfp-a-c...@googlegroups.com
Gracias Domingo,
este ejemplo corre en un formulario y msgform es el formulario 2 que será el que muestre el progressbar, cierto?
El tema es que trabajo con vb y todo el código es muy similar excepto por la línea  Application.DoEvents(); que no se me habilita el .DOEVENTS EN APPLICATION :-(
--
 
 
 
image001.png

Fox Friend

unread,
Jan 10, 2013, 4:27:10 PM1/10/13
to vfp-a-c...@googlegroups.com
Por aquí hay 2 convetidores de código C#/VB.NET que se mencionan en este foro:



Saludos!

Domingo Cuevas

unread,
Jan 11, 2013, 9:07:48 AM1/11/13
to vfp-a-c...@googlegroups.com

 

Si, son 2 formularios; msgform es el que tiene el progressbar.

 

En cuanto a Application.DoEvents(); prueba lo siguiente.

My.Application.DoEvents()

--
 
 
 

image001.png

Victor Espina

unread,
Jan 11, 2013, 11:23:03 AM1/11/13
to vfp-a-c...@googlegroups.com
WAINT "Procesando, por favor espere..." WINDOW NOWAIT

Hace eso.  La clausula NOWAIT le indica a VFP que muestre el mensaje y continue con la ejecucion.  Luego, para quitar la ventana de WAIT haces:

WAIT WINDOW CLEAR


Saludos

Fox Friend

unread,
Jan 11, 2013, 11:47:19 AM1/11/13
to vfp-a-c...@googlegroups.com
Gracias Victor, creo que ya capté el punto de que es como un mensaje, pero no es solo un mensaje. Permite ejecutar un proceso y que el mensaje quede fijo, hasta que el proceso termine.

He usado el wait window, pero siempre pensé que era igual que el enviador de mensajes messagebox(), pero para programas que no usaban interfaz visual (GUI).

Por ello mencioné después lo de los backgrounds. Gracias!

Geovanny Quirós Castillo

unread,
Jan 11, 2013, 12:33:13 PM1/11/13
to vfp-a-c...@googlegroups.com
Gracias a todos, ya tengo solucionado el problema.
Podemos dar por finalizado el caso.
--
 
 
 
image001.png

Fox Friend

unread,
Jan 11, 2013, 12:37:55 PM1/11/13
to vfp-a-c...@googlegroups.com
Serías tan amable de explicar la solución?.. Talvez nos pueda servir al resto de los compañeros. Gracias!

Victor Espina

unread,
Jan 11, 2013, 1:04:27 PM1/11/13
to vfp-a-c...@googlegroups.com
Si, buen punto.  Si es con codigo, mejor :)

Geovanny Quirós Castillo

unread,
Jan 11, 2013, 1:33:01 PM1/11/13
to vfp-a-c...@googlegroups.com
Las soluciones de Victor y Domingo me funcionaron muy bien, y se causa el efecto que quería.
Este es un código  de ejemplo:
 
Private Sub btnVarios_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnVarios.Click
    Dim FrmWait As New FrmEspere
    FrmWait.Show()
    My.Application.DoEvents()
    DGVDatosAsamovil.DataSource = Nothing
    DGVDatosAsamovil.Refresh()
    Ds = ObjDatos.MensajesEnBitacoraVarios()
    DGVDatosAsamovil.DataSource = Ds.Tables(0)
    DGVDatosAsamovil.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
    FrmWait.Close()
End Sub
 
image
 
 
From: Fox Friend
Sent: Friday, January 11, 2013 11:37 AM
Subject: Re: [ C# Latinoamérica ] Re: Mostrar ventana de espera mientras se ejecuta un proceso
 
Serías tan amable de explicar la solución?.. Talvez nos pueda servir al resto de los compañeros. Gracias!

--
 
 
 
image[1].png

Fox Friend

unread,
Jan 11, 2013, 1:46:24 PM1/11/13
to vfp-a-c...@googlegroups.com
Gracias por compartir! También pueden visitar el foro VB.NET cuando lo deseen.


Saludos!


Victor Espina

unread,
Jan 14, 2013, 1:10:54 PM1/14/13
to vfp-a-c...@googlegroups.com
Giovanny, para una solucion mas generica, mira esto:

class msgHelper {

   static waitForm activeWaitForm;

   public static void Wait(string mensaje) 
   {
      activeWaitForm = new waitForm();    // Simplemente un form no modal con un label llamado lblMensaje
      form.setMensaje(mensaje);  // setMensaje es un metodo en waitForm que permite cambiar el valor de lblMensaje
      form.Show() 
      Application.DoEvents();
  }
  public static void Wait()   // Al sobrecargar Wait podemos usar un solo metodo para mostrar y ocultar el form
  {
      activeWaitForm.Close();
  }

}


En tu ejemplo, seria:

Private Sub btnVarios_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnVarios.Click
    msgHelper.Wait("Por favor, espere un momento...")
    DGVDatosAsamovil.DataSource = Nothing
    DGVDatosAsamovil.Refresh()
    Ds = ObjDatos.MensajesEnBitacoraVarios()
    DGVDatosAsamovil.DataSource = Ds.Tables(0)
    DGVDatosAsamovil.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
    msgHelper.Wait()
End Sub

Asi es que lo uso yo.

Saludos

Victor Espina

Geovanny Quirós Castillo

unread,
Jan 14, 2013, 1:46:43 PM1/14/13
to vfp-a-c...@googlegroups.com
Gracias Victor Guiño
--
 
 
 
wlEmoticon-winkingsmile[1].png
Reply all
Reply to author
Forward
0 new messages