Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Gestionar 2 Eventos
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Gestionar 2 Eventos 
 
Tengo el siguiente código para controlar la entrada de un NIF en formato adecuado y la salida del formulario:


Public Sub DCdni_KeyPress()
     Dim n As Integer
     Select Case Key.Code
          Case key.BackSpace
          Case key.Delete
          Case key.Tab
          Case Key.Right
          Case Key.Left
          Case Key.Home
          Case Key.End
          Case Else
               n = Len(DCdni.value)
               If n < 8 And IsDigit(Key.text) Then
                    Return
               Else If n = 8 And IsLetter(Key.text) Then
                    Return
               Else
                    Stop Event
               Endif    
     End Select
End


Public Sub DCdni_LostFocus()
     Dim n As Integer, b As Boolean
     If Len(DCdni.Value) <> 9 Then
          Message("Tiene que teclear un DNI adecuado (8 dígitos y una letra")
          DCdni.Value = ""
          DCdni.SetFocus
     Endif
     DCdni.Value = UCase$(DCdni.Value)
     If IsLetter(Right$(DCdni.Value, 1)) Then
          Return
     Endif
     For n = 1 To 8
          b = IsDigit(Mid$(DCdni.Value, n, 1))
          If b = False Then
               DCdni.SetFocus
          Endif
     Next
End

Public Sub BotonSalir_Click()
   Me.Close()
End


Funciona perfectamente, PERO cuando pulso el BotonSalir salta antes el evento DCdni_Lostfocus y no permite salir del formulario.
S.O.S.
Gracias
 



 
última edición por jguardon el Martes, 23 Junio 2015, 15:52; editado 1 vez 
Editado por jguardon, Martes, 23 Junio 2015, 15:52: Resaltado de sintaxis mediante botón "C#" en edición
frajanic - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Gestionar 2 Eventos 
 
...y usando:

Public Sub BotonSalir_Click()

   Quit

End

 



 
última edición por vuott el Martes, 23 Junio 2015, 16:06; editado 2 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Gestionar 2 Eventos 
 
Puedes poner un flag (bandera) que indique que estás queriendo salir de la aplicación para que no se ejecute el evento lostfocus. Por ejemplo:

' Declaramos una variable global booleana que será nuestro flag
Private bSaliendo as Boolean = False

Public Sub DCdni_LostFocus()

     Dim n As Integer, b As Boolean

     If bSaliendo Then    ' comprobamos si queremos salir o no
          Stop Event      ' si es que sí, paramos el evento
          Return          ' y salimos de la rutina
     Endif

     ' en caso contrario, se ejecutará el resto de la rutina normalmente

     If Len(DCdni.Value) <> 9 Then
          Message("Tiene que teclear un DNI adecuado (8 dígitos y una letra")
          DCdni.Value = ""
          DCdni.SetFocus
     Endif
     DCdni.Value = UCase$(DCdni.Value)
     If IsLetter(Right$(DCdni.Value, 1)) Then
          Return
     Endif
     For n = 1 To 8
          b = IsDigit(Mid$(DCdni.Value, n, 1))
          If b = False Then
               DCdni.SetFocus
          Endif
     Next
End

Public Sub BotonSalir_Click()
   bSaliendo = True    ' ponemos a true nuestro flag
   Me.Close()
End


Espero que sea de ayuda, no lo he probado, pero así debería funcionar.

Saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Gestionar 2 Eventos 
 
vuott escribió: [Ver mensaje]
...y usando:
Public Sub BotonSalir_Click()

   Quit

End


Como va ?



Noooooooooo!!! Quit no hace una salida limpia la mayoría de  las veces cuando se usan formularios, provocando memory leaks.

Saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Gestionar 2 Eventos 
 
jguardon escribió: [Ver mensaje]

Noooooooooo!!! Quit no hace una salida limpia la mayoría de  las veces cuando se usan formularios, provocando memory leaks.



Si... he visto, es asì.
En efecto en console obtendremos este mensaje:
gbx3: warning: 1 allocation(s) non freed.

"Memory leak" ocurre cuando un bloque de memoria reservada no es liberada...

uhmmm.... una cosita de area de memoria con los Pointerzzz
 



 
última edición por vuott el Miercoles, 24 Junio 2015, 15:56; editado 3 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Gestionar 2 Eventos 
 
Como esas cosas pasan, lo que yo hago es una función Verificar() que coloco en el botón de grabar antes de grabar y que trate todas esas verificaciones. Al fin y al cabo que el nif sea correcto sólo te interesa en el momento de grabarlo, no de escribirlo.

Saludos.
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Gestionar 2 Eventos 
 
vuott escribió: [Ver mensaje]

gbx3: warning: 1 allocation(s) non freed.

...memoria reservada no es liberada...

uhmmm.... una cosita con los Pointerzzz


memoria reservada ? Punteros ?
No hay problema: vamos, hermanos, a apuntar tambien nosotros !  

surprise

Public Sub BotonSalir_Click()

' Libertatem memoriae areae reddere !
   Free(Object.Address(DCdni))

   Quit

End

 



 
última edición por vuott el Martes, 23 Junio 2015, 16:44; editado 6 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Gestionar 2 Eventos 
 
Gracias por vuestras sugerencias, pero el problema continúa.
Nada de lo que coloque en el evento BotonSalir_Click funciona por la sencilla razón de que ese evento no llega a producirse.
Pensando, en buena lógica, es de esperar que el evento _LostFocus se dispare antes que el _Click en otro control.
Es decir,  _LostFocus bloquea a  _Click, por lo que habría que establecer un control en _LostFocus.
He probado en DCdni_LostFocus:
dim s as string
s=Last.Text
If s="SALIR" then Me.Close

que me da un error "type mystmach: ..........

Hasta ahora, la "solución" de shordi, obviar el problema, es la única, sólo que, con el debido respeto, no me parece elegante.
Después de teclearte el formulario, que te diga: "DNI incorrecto"... Lo primero que se te viene a la boca es: "¿Y por qué no me lo adviertes antes?"
¡Habrá que buscar otro método!
De todas formas, gracias por vuestras respuestas, he aprendido de ellas.
 



 
frajanic - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Gestionar 2 Eventos 
 
Citar:
Nada de lo que coloque en el evento BotonSalir_Click funciona por la sencilla razón de que ese evento no llega a producirse.

Si vas a seguir lo que te dije más arriba dese eliminar el evento lostFocus, si no, no arreglamos nada.

Saludos.
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Gestionar 2 Eventos 
 
¡He conseguido algo!
Pero que alguien me lo explique. No sé cómo se me ha ocurrido.
He introducido:
Wait 0.2

Public Sub DCdni_LostFocus()
     Dim n As Integer, b As Boolean
     Wait 0.2
     If Len(DCdni.Value) <> 9 Then
          Message("Tiene que teclear un DNI adecuado (8 dígitos y una letra")

Ahora, cuando pinchas BotonSalir, salta el mensaje... ¡PERO DESPUÉS SALE DEL PROGRAMA! Y ocurre lo mismo aunque la demora sea más larga.
También he comprobado que si pinchas en el botón de Cerrar Formulario (x) se ejecuta perfectamente sin detectar _LostFocus.
 



 
frajanic - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron