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
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.
- Compartir respuesta
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.
- Compartir respuesta
Que gran mentira con mucho respeto no es la solución - Eduardo Pérez Fernández
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.
- Compartir respuesta
Lo que tiene es que aprender - Eduardo Pérez Fernández
Aun no te he preguntado por 'el camino a NINGUNA PARTE' , que tengas felices sueños. - Enrique Feijóo
Lamento su ignorancia - Eduardo Pérez Fernández