none
¿Cómo cancelo la pulsación de click sobre el formulario?

    Pregunta

  • No quiero cancelar el evento sino la pulsación.

    Es decir, quiero detectar cuando se pulse click y dependiendo de ciertas condiciones anular o no la pulsación.

    ------------------------------

    Algo más o menos así:

    -------------------------------

      Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick

          If e.Button = MouseButtons.Left Then

              SI determinada condicion Then

                      'Aqui cancelar la pulsación

             endif

         endif

    End Sub


    • Editado James-2016 viernes, 30 de diciembre de 2016 0:43
    viernes, 30 de diciembre de 2016 0:42

Respuestas

  • "James-2016" preguntó:

    > ¿Cómo cancelo la pulsación de click sobre el formulario?
    >
    > No quiero cancelar el evento sino la pulsación.
    >
    > Es decir, quiero detectar cuando se pulse click y dependiendo de ciertas
    > condiciones anular o no la pulsación.
    >

    ¡Vamos a ver! ¿Cómo le "dices" (nótense las comillas dobles) a un usuario que ANULE o CANCELE una pulsación del ratón después de haber hecho clic con un botón cualquiera del ratón? :-))

    Si habilitas el evento MouseClick y deseas ejecutar cierto código en el mismo, con independencia del botón pulsado, ¿cómo pretendes ANULAR posteriormente LA PULSACIÓN (el evento MouseClick en sí) si las condiciones no son las satisfactorias? ¡Eso no se puede hacer! O se habilita el evento MouseClick por completo o no se habilita, pero eso de "dejarlo a medias", unas veces sí y otras no quiero desencadenarlo, no sé yo cómo lo vas a poder hacer una vez que se encuentra instalado el propio controlador para el evento MouseClick, claro está.

    Aparte, y por si lo ignoras, te comento que el evento MouseClick se desencadena después del evento Click, por tanto, si también tienes instalado el controlador para el evento Click del formulario, ¿a cual de ellos le hacemos caso? ;-)

    Control.MouseClick (Evento)

    > Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick
    >
    >      If e.Button = MouseButtons.Left Then
    >
    >          SI determinada condicion Then
    >
    >            'Aqui cancelar la pulsación
    >
    >      endif
    >
    >     endif
    >
    > End Sub

    Si tu intención es que se EJECUTE (no que se ANULE la pulsación) cierto código cuando se haya pulsado el botón izquierdo del ratón y las determinadas condiciones de las que hablas SEAN FALSAS, tan sólo tienes que establecer la correspondiente condición If ... End If, para que se ejecute el código que deseas cuando la verificación sea TRUE:

        
    Private determinadaCondicion As Boolean

    Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick If ((e.Button = MouseButtons.Left) AndAlso (Not determinadaCondicion)) Then ' La verificiación efectuada es verdadera (True) ' ' El código existente AQUÍ solamente se ejecutará cuando se haya ' pulsado el botón izquierdo del ratón sobre la superficie del ' formulario, Y TAMBIÉN, cuando el valor devuelto por la determinada ' condición sea FALSE. ' MessageBox.Show("¡Buenas tardes desde el evento MouseClick de Form1, y cuando las condiciones son False!") End If End Sub

    Como podrás observas, solamente se ejecutará el código existente en el bloque If ... End If cuando se cumplan las condiciones evaluadas. ¿Que no se dan esas condiciones (el valor del campo determinadaCondicion  es True, o se ha pulsado el botón derecho del ratón)? Pues entonces no se ejecutará nada, que es lo mismo que sucedería si el usuario NO HA PULSADO ningún botón del ratón.

    En definitiva, que a pesar de tener instalado el controlador de evento que deseemos capturar, tiene que existir código fuente escrito en el mismo para ejecutar esto o aquello, porque si no existe código en el mismo,  ¿para qué queremos instalarlo entonces? ;-)

    Un saludo y ¡Feliz Año Nuevo!


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    viernes, 30 de diciembre de 2016 17:08
    Moderador

Todas las respuestas

  • "James-2016" preguntó:

    > ¿Cómo cancelo la pulsación de click sobre el formulario?
    >
    > No quiero cancelar el evento sino la pulsación.
    >
    > Es decir, quiero detectar cuando se pulse click y dependiendo de ciertas
    > condiciones anular o no la pulsación.
    >

    ¡Vamos a ver! ¿Cómo le "dices" (nótense las comillas dobles) a un usuario que ANULE o CANCELE una pulsación del ratón después de haber hecho clic con un botón cualquiera del ratón? :-))

    Si habilitas el evento MouseClick y deseas ejecutar cierto código en el mismo, con independencia del botón pulsado, ¿cómo pretendes ANULAR posteriormente LA PULSACIÓN (el evento MouseClick en sí) si las condiciones no son las satisfactorias? ¡Eso no se puede hacer! O se habilita el evento MouseClick por completo o no se habilita, pero eso de "dejarlo a medias", unas veces sí y otras no quiero desencadenarlo, no sé yo cómo lo vas a poder hacer una vez que se encuentra instalado el propio controlador para el evento MouseClick, claro está.

    Aparte, y por si lo ignoras, te comento que el evento MouseClick se desencadena después del evento Click, por tanto, si también tienes instalado el controlador para el evento Click del formulario, ¿a cual de ellos le hacemos caso? ;-)

    Control.MouseClick (Evento)

    > Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick
    >
    >      If e.Button = MouseButtons.Left Then
    >
    >          SI determinada condicion Then
    >
    >            'Aqui cancelar la pulsación
    >
    >      endif
    >
    >     endif
    >
    > End Sub

    Si tu intención es que se EJECUTE (no que se ANULE la pulsación) cierto código cuando se haya pulsado el botón izquierdo del ratón y las determinadas condiciones de las que hablas SEAN FALSAS, tan sólo tienes que establecer la correspondiente condición If ... End If, para que se ejecute el código que deseas cuando la verificación sea TRUE:

        
    Private determinadaCondicion As Boolean

    Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick If ((e.Button = MouseButtons.Left) AndAlso (Not determinadaCondicion)) Then ' La verificiación efectuada es verdadera (True) ' ' El código existente AQUÍ solamente se ejecutará cuando se haya ' pulsado el botón izquierdo del ratón sobre la superficie del ' formulario, Y TAMBIÉN, cuando el valor devuelto por la determinada ' condición sea FALSE. ' MessageBox.Show("¡Buenas tardes desde el evento MouseClick de Form1, y cuando las condiciones son False!") End If End Sub

    Como podrás observas, solamente se ejecutará el código existente en el bloque If ... End If cuando se cumplan las condiciones evaluadas. ¿Que no se dan esas condiciones (el valor del campo determinadaCondicion  es True, o se ha pulsado el botón derecho del ratón)? Pues entonces no se ejecutará nada, que es lo mismo que sucedería si el usuario NO HA PULSADO ningún botón del ratón.

    En definitiva, que a pesar de tener instalado el controlador de evento que deseemos capturar, tiene que existir código fuente escrito en el mismo para ejecutar esto o aquello, porque si no existe código en el mismo,  ¿para qué queremos instalarlo entonces? ;-)

    Un saludo y ¡Feliz Año Nuevo!


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    viernes, 30 de diciembre de 2016 17:08
    Moderador
  • Me viene a la mente otra cosa que puedes hacer, que no es más que instalar/desinstalar dinámicamente el controlador para el evento MouseClick. Pero para ello, no puedes instalar en tiempo de diseño dicho controlador mediante la cláusula Handles, es decir, no puedes instalarlo como lo hacen el "90 por 100" de los usuarios de Visual Basic:

        Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick  --> Eliminar la cláusula Handles

        End Sub

    Tienes que habilitar un procedimiento con la misma firma que tenga el evento que deseamos instalar/desinstalar, pero sin la cláusula Handles:

        Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs)
    
            If (e.Button = MouseButtons.Left) Then
                ' La verificiación efectuada es verdadera (True)
                '
                ' El código existente AQUÍ solamente se ejecutará cuando se haya
                ' pulsado el botón izquierdo del ratón sobre la superficie del
                ' formulario, Y TAMBIÉN, cuando el valor devuelto por la determinada
                ' condición sea FALSE.
                ' 
                MessageBox.Show("¡Buenas tardes desde el evento MouseClick de Form1, y cuando las condiciones son False!")
            End If
    
        End Sub


    Observa que ya no verificamos dentro del cuerpo del evento si la determinada condición es True/False; solamente si se ha pulsado el botón izquierdo del ratón.

    El nombre de ese procedimiento no tiene por qué llamarse necesariamente Form1_MouseClick; puedes llamarlo como creas necesario. Lo único que tienes que procurar es que dicho procedimiento tenga la misma firma que el controlador del evento MouseClick, es decir, el primer parámetro del tipo Object y el segundo del tipo MouseEventArgs.

    De esta manera, cuando el valor del campo determinadaCondicion sea False, instalamos dinámicamente el controlador de evento:

        If (Not determinadaCondicion) Then
            AddHandler Me.MouseClick, AddressOf Form1_MouseClick
        End If


    Y cuando el valor sea True, lo desinstalamos:

        If (determinadaCondicion) Then
            RemoveHandler Me.MouseClick, AddressOf Form1_MouseClick
        End If


    Ahora bien. No me preguntes en qué parte del formulario Form1 tienes que instalar/desinstalar el controlador para su evento MouseClick, porque como bien creo que podrás comprender, no tengo ni idea del trabajo que hace ese formulario y cómo está configurado. Yo solamente me he limitado a indicarte otra posibilidad que tienes para que un evento se desencadene cuando se dan ciertas circunstancias que pueden variar a lo largo de la vida de ese formulario. ;-)

    No obstante te comento que, si en el formulario tienes declarado el siguiente campo:

         Private determinadaCondicion As Boolean

    Por defecto su valor será False, con lo cual, podrías instalar el controlador en el evento Form_Load del formulario:

       Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            If (Not determinadaCondicion) Then
                AddHandler Me.MouseClick, AddressOf Form1_MouseClick
            End If
    
       End Sub

    No sería necesario verificar si el campo es False, porque como te he indicado antes, ese es su valor predeterminado. Pero puede suceder que el valor del campo se haya modificado en el procedimiento InitializeComponente del formulario, sobre todo si tienes implementada la propiedad que comento a continuación con una visibilidad Public.

    Y si tienes habilitado un procedimiento Property para establecer y devolver el valor del campo determinadaCondicion, el bloque Set del mismo sería una buen candidato para instalar/desinstalar el evento:

        Public Property Condicion As Boolean
            Get
                Return determinadaCondicion
            End Get
            Set(value As Boolean)
    
                ' Asignamos el valor del campo
                determinadaCondicion = value
    
                If (determinadaCondicion) Then
                    ' Desinstalar
                    RemoveHandler Me.MouseClick, AddressOf Form1_MouseClick
                Else
                    ' Instalar
                    AddHandler Me.MouseClick, AddressOf Form1_MouseClick
                End If
            End Set
        End Property



    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.





    viernes, 30 de diciembre de 2016 17:49
    Moderador
  • Buenas, creo que lo plantee mal, lo que pasa que al hacer click con el botón derecho se muestra automáticamente un menú contextual que definí en el formulario y había ciertas situaciones en las que no quería que se abra, por eso hablaba de anular el click.

    Lo he resuelto de otra forma, anulando más bien la visualización de dicho menú en el evento del menú respectivo.

    De todos modos gracias por responder, siempre se aprende de sus tan ilustrativos comentarios. Feliz año también.


    • Editado James-2016 viernes, 30 de diciembre de 2016 17:54
    viernes, 30 de diciembre de 2016 17:53