Ver un formulario al enfocar un botón y que desaparezca cuando pierde el enfoque

Tengo un formulario continuo con un botón en cada registro para que cuando lo enfoque (sin pulsar) me abra otro formulario en modo diálogo y que lo cierre al perder el enfoque, pero no consigo hacerlo.

3 respuestas

Respuesta
1

Cuando no se sabe es mejor no hablar burradas. Esto se puede hacer, observe este ejemplo ultilizo 2 formularios Emergentes.

Formulario principal

Ahora me muevo con la tecla TAB o ENTER, al llegar al botón Abrir, se abre el formulario facturas y cambia el titulo por Cerrar.

Ahora, si paso el mouse sobre el botón Cerrar, se cierra el formulario facturas y cambia el titulo y color.

Para esto utilizo una variable a nivel de formulario, la llamo Flag y de tipo Boolean, con esta controlo el estado del formulario.

Option Compare Database
Option Explicit
Dim flag As Boolean

Igualmente utilizo 2 eventos para el botón:

Al recibir el enfoque

Private Sub btnAbrir_GotFocus()
  If flag = False Then
    DoCmd.OpenForm "frmFacturas"
    flag = True
    Me.btnAbrir.Caption = "&Cerrar"
    Me.btnAbrir.ForeColor = vbRed
   End If
End Sub

Al mover el mouse

Private Sub btnAbrir_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If flag Then
    DoCmd.Close acForm, "frmFacturas"
    flag = False
    Me.btnAbrir.Caption = "&Abrir"
    Me.btnAbrir.ForeColor = vbNormal
  End If
End Sub

Cambie el evento

Al recibir el enfoque

Private Sub btnAbrir_GotFocus()
  If flag = False Then
    DoCmd.OpenForm "frmFacturas"
    flag = True
    Me.btnAbrir.Caption = "&Cerrar"
    Me.btnAbrir.ForeColor = vbRed
  Else
    DoCmd.Close acForm, "frmFacturas"
    flag = False
    Me.btnAbrir.Caption = "&Abrir"
    Me.btnAbrir.ForeColor = vbNormal
    flag = False
   End If
End Sub

Esto es si regresa al formulario y se mueve con Tab o Enter.

Primero que todo la pregunta no se refiere a abrir el otro formulario en un registro específico. La ignorancia sigue reinando, lo expuesto por Julián González es una gran mentira. En fin, el usuario es quien debe probar y tiene la última palabra.

He realizado unos ajustes para permitir que el cursor se ubique nuevamente en el registro desde donde se abrió el otro formulario.

Option Compare Database
Option Explicit
Dim flag As Boolean
Dim lnID As Long

Utilizo la variable lnID  a nivel de formulario para almacenar el id del campo clave, este caso, idproducto.

Procedimiento para llamarlo desde cada uno de los campos al recibir el enfoque.

Sub regresar()
    flag = False
    Me.btnAbrir.Caption = "&Abrir"
    Me.btnAbrir.ForeColor = vbNormal
    DoCmd.Close acForm, "frmFacturas"
End Sub

Se necesita que formulario frmFacturas deba abrirse sobre un registro en especial puede cambiarlo por algo como:

DoCmd.OpenForm "frmFacturas", , , "idfactura" & Me.idfactura

Procedimiento del botón Abrir

Private Sub btnAbrir_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Dim rs As Object
 On Error GoTo hay_error
  If flag Then
    DoCmd.Close acForm, "frmFacturas"
    flag = False
    Me.btnAbrir.Caption = "&Abrir"
    Me.btnAbrir.ForeColor = vbNormal
    Set rs = Me.Recordset.Clone
    rs.FindFirst "[Idproducto] = " & lnID
    Me.Bookmark = rs.Bookmark
    Me.idproducto.SetFocus
    SendKeys "{Enter}"
  End If
hay_error_exit:
   Exit Sub
hay_error:
     MsgBox Err.Number, vbCritical, "Error..."
End Sub

Procedimiento al mover el mouse

Private Sub btnAbrir_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Dim rs As Object
 On Error GoTo hay_error
  If flag Then
    DoCmd.Close acForm, "frmFacturas"
    flag = False
    Me.btnAbrir.Caption = "&Abrir"
    Me.btnAbrir.ForeColor = vbNormal
    Set rs = Me.Recordset.Clone
    rs.FindFirst "[Idproducto] = " & lnID
    Me.Bookmark = rs.Bookmark
    Me.idproducto.SetFocus
    SendKeys "{Enter}"
  End If
hay_error_exit:
   Exit Sub
hay_error:
     MsgBox Err.Number, vbCritical, "Error..."
End Sub

Observe que utilizo la propiedad Bookmark para regresar al registro desde donde se abrió el formulario frmFacturas.

Para cada campo del registro llamo al recibir el enfoque el procedimiento Regresar.

Private Sub existen_GotFocus()
  Call regresar
End Sub
Private Sub idproducto_GotFocus()
   Call regresar
End Sub
Private Sub producto_GotFocus()
  Call regresar
End Sub
Private Sub vrunitario_GotFocus()
  Call regresar
End Sub

Con esto puede apreciar que los comentarios de Julián González no son válidos, toda vez, que si es posible hacer que el cursor regrese al registro activo desde donde se abre el formulario.

Tenga cuidado de no abusar de Sendkeys "{Enter}", personalmente utilizo una función específica para este fin.

Disculpe repetí el procedimiento al mover el mouse. El procedimiento Al recibir en enfoque es

Private Sub btnAbrir_GotFocus()
  If flag = False Then
    DoCmd.OpenForm "frmFacturas"
    flag = True
    Me.btnAbrir.Caption = "&Cerrar"
    Me.btnAbrir.ForeColor = vbRed
    lnID = Me.idproducto
   End If
End Sub

No consigo que me salga lo que quiero. Probablemente estoy haciendo mal lo que me dices. No estoy muy ducho en esto. Te pediría que por favor me dijeras en qué apartado del "tipo de selección" de la hoja Propiedades tengo que escribir lo que me dices (Al recibir el enfoque en el apartado formulario o en el botón, etc.), porque estoy liado.

Mis formularios son: "ForAljaraque", que sería el principal y quiero que al recibir el enfoque en un botón de cada registro (BAbrir) se me abra el formulario "ForGastoReferenciaCDialogo" en modo de ventana diálogo en el registro "IdGasto"

Muchas gracias

Dice en su pregunta ... al enfocar el botón, en este caso el código va en los eventos Al recibir el enfoque y al mover el mouse del botón. Si quiere envíeme su base de datos a [email protected] y le hago el ajuste. Favor en el asunto anotar la consulta.

Respuesta
1

Antonio, el problema de los formularios continuos es que sólo tiene existencial real el registro activo, los demás son imágenes virtuales. Por eso, si lo que quieres es que al pasar el cursor por encima del botón(Eperezfer, ¿qué se puede esperar de quien escribe harina con faltas de ortografía?) Te abra ese otro formulario, en un registro en concreto, no te sirve todo lo anterior. Mira la imagen

Puedes ver que el registro activo es el señalado por la flecha superior izquierda. Pero si el cursor lo paso por encima del botón de Bólido... me abre el formulario Clientes, pero en el registro correspondiente al Idcliente del registro activo. En este caso he usado

DoCmd.OpenForm "clientes", , , "idcliente=" & Me.IdCliente & "", , acDialog

Por otro lado, puedes ver que el cursor ahora está en el primer control del formulario Clientes, por lo que éste pasa a ser el objeto activo, así que por mucho que muevas el cursor por el formulario Otro( el del botón Comando5) no te hará nada, ya que no es el objeto activo(oficialmente no existe). Sólo es su imagen.

Para que en este caso te funcionara tendrías primero que desplazarte a un registro determinado, para que fuera el registro activo y luego mover el cursor por encima del botón.

Otra posible alternativa, si lo que quisieras es añadir datos al formulario Clientes independientemente del Idcliente, sería abrir el formulario Clientes en vista entrada de datos con

DoCmd. OpenForm "clientes",,,, acFormAdd, acDialog

Y si quisieras que una vez abierto el formulario Clientes se cerrara al mover el cursor, te aconsejaría que en él también pusieras otro botón y en sus propiedades-eventos-al mover el mouse le pusieras

Docmd. Close

Y después de hacer lo que tengas que hacer en ese registro nuevo, al pasar el cursor por encima del botón Cerrar, el formulario se cierra y el formulario Otro pasa a ser el objeto activo.

Respuesta

Un formulario se puede abrir en modo dialogo de dos formas:

A.) Activando esa propiedad en su diseño

B.) Activando esa propiedad en su llamada

Caso 'A' :
Se abre directamente el formulario y se inicia en modo dialogo
Se abre mediante una llamada (VBA), en este caso ha de finalizar los procesos y cuando llegue (al END xxxx) se activa el modo dialogo del formulario.

Caso 'B':
Se puede aplicar a cualquier formulario (tenga o no activada esa propiedad), se detiene el proceso que se está ejecutando y al cerrar el formulario modal, continua con el proceso antes detenido.

Lo más probable es que se esté utilizando la opción 'B', por ello se pierde el control sobre lo que no es el formulario recién abierto.

Quizás lo más adecuado sea utilizar la opción 'A' y en el evento que lo llama activar el modo emergente (el modal lo tomara más tarde si se le permite continuar abierto).
Sobre esta modalidad hay una duda sobre cuando finaliza 'el proceso activo' ya que se desea utilizar otro evento para su cierre.

Lo que se solicita:

... Para que cuando lo enfoque (sin pulsar) me abra otro formulario en modo diálogo y que lo cierre al perder el enfoque ...


Confundir 'Diálogo' con 'Visibilidad' no hace que una respuesta que se ajusta a lo solicitado sea inadecuada y la otra ... ¿inventada para poder publicar algo?

(En fin, lo que hay que aguantar).

Siento mucho ser inexperto y pedirte ayuda, así como haberte hecho pensar que solo lo hago por publicar algo, pero te rogaría que la próxima vez no contestes en estos términos si piensas eso. Cuando se pide ayuda es porque se necesita y no se sabe cómo solucionar algo, y creo que esta página está para eso.

Mis disculpas por no haber añadido a quien me refería en el mensaje (iba dirigido a Eduardo)

No tiene sentido dirigirme al autor del hilo que tiene todo el derecho de ignorar mi aportación (por la causa que crea conveniente) simplemente no respondiendo.

La forma de responder públicamente a una crítica es haciéndolo en la propia aportación (así parece funcionar este foro).

El receptor del mensaje se dio por enterado y para disimular su falta de ética, en una nueva respuesta echa 'balones fuera' desviando la atención hacia la primera aportación (la de Julián) esa forma de actuar no elimina la falta de ética ni las intenciones.


Cuando se interviene en un hilo -según como este planteada la pregunta- pueden surgir diferentes repuestas que se adaptaran o no a lo solicitado y/o pueden plantear alternativas a considerar. Es el autor del hilo (que tiene muy claro el sentido de la pregunta) el que decide el camino a seguir.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas