Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Aportación: Mostrar un mensaje con temporizador

Estas en el tema de Aportación: Mostrar un mensaje con temporizador en el foro de Visual Basic clásico en Foros del Web. Hola, hoy me ha surgido esta necesidad y se me ha ocurrido la siguiente idea, aquí la dejo por si sirve de ayuda a alguien: ...
  #1 (permalink)  
Antiguo 01/07/2010, 15:02
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Aportación: Mostrar un mensaje con temporizador

Hola, hoy me ha surgido esta necesidad y se me ha ocurrido la siguiente idea, aquí la dejo por si sirve de ayuda a alguien:

La idea es mostrar un mensaje de error, aviso, etc evitando el MsgBox y tener que pulsar Aceptar, agilizando el proceso.

Para el ejemplo se necesita crear un Formulario con dos Command, un Timer con el nombre msgTimer y un Label con el nombre msgLabel, por supuesto la posición, colores y tamaño del label a gusto del usuario.


Código vb:
Ver original
  1. Option Explicit
  2.  
  3. Private Sub Command1_Click()
  4.   msgLabel = "Mensaje de prueba en el Command Uno"
  5. End Sub
  6.  
  7. Private Sub Command2_Click()
  8.   msgLabel = "Mensaje de prueba en el Command Dos"
  9. End Sub
  10.  
  11. Private Sub Form_Load()
  12.   ' En la carga del formulario, ajustamos los valores y deshabilitamos el Timer
  13.  msgTimer.Enabled = False    ' Timer detenido
  14.  msgTimer.Interval = 5000    ' Pausa 5 segundos
  15.  msgLabel.Caption = ""       ' Mensaje Borrado
  16.  msgLabel.Visible = False    ' Mensaje Oculto
  17. End Sub
  18.  
  19. Private Sub msgLabel_Change()
  20.   If msgLabel.Caption = "" Then
  21.     ' Mensaje en blanco, detener temporizador, ocultar mensaje
  22.    msgTimer.Enabled = False
  23.     msgLabel.Visible = False
  24.   Else
  25.     ' Mensaje con datos, activar temporizador, mostrar mensaje
  26.    msgTimer.Enabled = False  'Primero desactivamos para detenerlo
  27.    msgTimer.Enabled = True
  28.     msgLabel.Visible = True
  29.   End If
  30. End Sub
  31.  
  32. Private Sub msgTimer_Timer()
  33.   ' Llegado al tiempo, borramos mensaje
  34.  msgLabel.Caption = ""
  35. End Sub

Espero que a alguien le sea de utilidad.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #2 (permalink)  
Antiguo 02/07/2010, 05:45
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 18 años, 3 meses
Puntos: 29
Respuesta: Aportación: Mostrar un mensaje con temporizador

Viendo tu código y al darme cuenta de que el mensaje aparece dentro del form, se me ha ocurrido una idea para mostrar un mensaje en una ventana externa sin crear un nuevo formulario. Quizá le interese a alguien experimentar con ello.

He tenido que añadir una llamada a una api, pero el resultado puede valer la pena.

Con un poco más de código se puede hacer siempre visible o que se pueda arrastrar con el ratón, pero de momento esto es lo que he hecho.

Crear un formulario con un timer llamado msgTimer. Añadir un frame (Frame1), y dentro de ese frame 2 labels y un commandbutton (Label1, Label2 y Command1)
Añadir otro CommandButton fuera del frame (Command2)

Y este código:


Código vb:
Ver original
  1. Option Explicit
  2. Dim DuracionMensajes As Integer
  3. Dim ContadorDuracion As Integer
  4. Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hwndNewParent As Long) As Long
  5.  
  6. Private Sub Command1_Click()
  7. ' este command esta dentro del frame
  8. ' y sirve para cerrar la ventana
  9.  ContadorDuracion = DuracionMensajes - 1
  10.   msgTimer_Timer
  11. End Sub
  12.  
  13. Private Sub Command2_Click()
  14.   ' este timer esta en el form para probar el mensaje
  15.  SetParent Frame1.hWnd, 0
  16.   Frame1.Visible = True
  17.   Frame1.Top = (Screen.Height - Frame1.Height) / 2
  18.   Frame1.Left = (Screen.Width - Frame1.Width) / 2
  19.   msgTimer.Enabled = True
  20. End Sub
  21.  
  22. Private Sub Form_Load()
  23.   msgTimer.Enabled = False
  24.   msgTimer.Interval = 1000
  25.   DuracionMensajes = 5 ' mostraremos el mensaje 5 segundos
  26.  Frame1.Visible = False
  27.   Frame1.Caption = "Aviso"
  28.   Label1.Caption = "Aqui tu mensaje"
  29.   Label2.Caption = CStr(DuracionMensajes) ' Este label muestra la cuenta atras
  30.  Command2.Caption = "Mostrar mensaje"
  31.   Command1.Caption = "Aceptar"
  32. End Sub
  33.  
  34. Private Sub msgTimer_Timer()
  35.   ContadorDuracion = ContadorDuracion + 1
  36.   Label2.Caption = DuracionMensajes - ContadorDuracion
  37.   If ContadorDuracion >= DuracionMensajes Then
  38.     Frame1.Visible = False
  39.     SetParent Frame1.hWnd, Me.hWnd
  40.     msgTimer.Enabled = False
  41.     ContadorDuracion = 0
  42.     Label2.Caption = CStr(DuracionMensajes) ' Este label muestra la cuenta atras
  43.  End If
  44. End Sub

Saludos

PD: Lo bueno de este método es que puedes tener minimizado el formulario y mostrar el mensaje sin restaurar el formulario.
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!

Última edición por pkj; 02/07/2010 a las 05:54
  #3 (permalink)  
Antiguo 02/07/2010, 08:34
Avatar de -rommel_  
Fecha de Ingreso: junio-2008
Ubicación: Lima
Mensajes: 360
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: Aportación: Mostrar un mensaje con temporizador

claro el ejemplo de erbuson es parecido a los mensajes a USuarios que hace el SAP... buen aporte amigo...
  #4 (permalink)  
Antiguo 02/07/2010, 12:24
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 18 años, 3 meses
Puntos: 29
Respuesta: Aportación: Mostrar un mensaje con temporizador

Por mi parte solo quería ampliar un poco las posibilidades.
Por supuesto en ningún caso menospreciar el esfuerzo del compañero Erbuson que se merece un aplauso por su dedicación y paciencia demostradas.

Saludos
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #5 (permalink)  
Antiguo 02/07/2010, 16:24
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: Aportación: Mostrar un mensaje con temporizador

Muchas gracias amigo pkj, ante todo, que te quede claro que en ningún momento he pensado que menospreciabas mi trabajo, es más, con tu inestimable ayuda la función puede tener una gran mejora y con tu permiso la dejo de esta manera:

Para que funcione el código se necesitará un Frame llamado msgFrame, un Label dentro de msgFrame llamado msgLabel y un Timer llamado msgTimer

Código vb:
Ver original
  1. Option Explicit
  2.  
  3. Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hwndNewParent As Long) As Long
  4.  
  5. Private Sub msgMensaje(Optional Mensaje As String, _
  6.                        Optional Segundos As Integer = 5, _
  7.                        Optional Objeto As Variant, _
  8.                        Optional Centrado As Boolean = False)
  9.   ' Rutina para mostrar u ocultar el mensaje, todos los parámetros son Opcionales
  10.  ' la simple llamada de msgMensaje sin parámetros, lo inicializará
  11.  
  12.   ' Detenemos Temporizador, Ajustamos intervalo, Ocultamos mensaje
  13.  msgTimer.Enabled = False
  14.   msgTimer.Interval = Segundos * 1000
  15.   msgFrame.Visible = False
  16.  
  17.   ' Ajustamos el tamaño del Frame exactamente con el Label (Esto no es necesario)
  18.  msgFrame.Width = msgLabel.Width
  19.   msgFrame.Height = msgLabel.Height
  20.   msgLabel.Move 0, 0
  21.  
  22.   ' Anclamos el frame al Objeto que opcionalmente le indiquemos
  23.  If IsObject(Objeto) Then
  24.     SetParent msgFrame.hWnd, Objeto.hWnd
  25.     ' Si deseamos el objeto centrado lo centramos
  26.    If Centrado Then
  27.       msgFrame.Move (Objeto.Width - msgFrame.Width) / 2, (Objeto.Height - msgFrame.Height) / 2
  28.     Else
  29.       msgFrame.Move 0, 0
  30.     End If
  31.   End If
  32.  
  33.   ' Si hay mensaje lo ponemos, hacemos Visible el Frame y activamos Temporizador
  34.  If Mensaje <> "" Then
  35.     msgLabel.Caption = Mensaje
  36.     msgFrame.Visible = True
  37.     msgTimer.Enabled = True
  38.   End If
  39. End Sub
  40.  
  41. Private Sub Form_Load()
  42.   ' Inicializamos Temporizador y mensaje
  43.  msgMensaje
  44. End Sub
  45.  
  46. Private Sub msgTimer_Timer()
  47.   ' Llegado al tiempo, borramos mensaje
  48.  msgMensaje
  49. End Sub

La siguiente es opcional, simplemente el Click en el label procederá a ocultar el mensaje, sin necesidad de un Command.

Código vb:
Ver original
  1. Private Sub msgLabel_Click()
  2.   ' Click sobre el Label lo ocultará (Esta Sub es opcional)
  3.  msgMensaje
  4. End Sub

La llamada al mismo es bastante intuitiva por los nombres definidos en la Sub, pero unos ejemplos serían:

msgMensaje "Este es el mensaje a visualizar", , MSFlexGrid1, True
msgMensaje "Este es el mensaje a visualizar", , Form1, True
msgMensaje "Este es el mensaje a visualizar", 3, Picture1


IMPORTANTE Recordad que el Objeto al que se puede 'Anclar' el Frame debe tener la propiedad hWnd o de lo contrario se producirá un error.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #6 (permalink)  
Antiguo 02/07/2010, 20:02
 
Fecha de Ingreso: noviembre-2009
Mensajes: 315
Antigüedad: 15 años
Puntos: 0
Respuesta: Aportación: Mostrar un mensaje con temporizador

Que son secos, una pregunta ustedes trabajan en visual basic ???? O es solo por amor al arte.

Yo soy estudiante, lo aprendi "por obligacion" pero me gusta la programacion es un arte.
¿ustedes a que se dedican?
  #7 (permalink)  
Antiguo 03/07/2010, 03:54
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 18 años, 3 meses
Puntos: 29
Respuesta: Aportación: Mostrar un mensaje con temporizador

Amigo Carnero, yo soy camionero. Y es que odio pensar por obligación.
Programar es mi hobby por culpa de las mujeres y gracias a las mujeres mi vida es ahora muy tranquila acompañado de mi fiel PC.

Al amigo Erbuson solo decirle que confiaba en que te parecería interesante el sistema, y que la adaptación del código a tu gusto era lo esperado.

Solo añadir (para dar ideas) que esa api la uso yo en un programa que absorve ventanas que están estorbando en el escritorio pero que están procesando algo y no quieres cerrar, como un compresor de video. Una especie de escritorio virtual donde puedes guardar y manejar los programas.
Así luego escondo mi programa y se esconde todo con él. Cuando me parece los libero y vuelven al escritorio.

Por mi parte aportaría alguna sub, como una que auto-ajusta el tamaño de los controles al formulario, pero me temo que no tenga paciencia para solucionar después todas las dudas.
Además no es mágico y la gente parece esperar magia muchas veces.
También mi experiencia al regalar mi PKJ-Player (la niña de mis ojos, literalmente porque me he dejado media vista en el) y ver el poco interés de la gente, me hace pensar que solo pierdo mi tiempo en esos casos.

Saludos
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!

Etiquetas: mensaje, temporizador
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 07:57.