Deshabilitar o hacer una excepción al evento lostfocus

216 views
Skip to first unread message

adem adem

unread,
Sep 9, 2023, 6:52:18 PM9/9/23
to publice...@googlegroups.com
Hola Señores,
 Pido vuestra ayuda, en lo siguiente:

Tengo un formulario que consta de un cuadro de lista (listbox) vinculado a una tabla, así como tres cuadros de texto (textbox) , un control de imagen y tres botones: "Añadir," "Modificar" y "Eliminar." Cuando el cuadro de lista recibe el foco (evento Gotfocus), realizo las siguientes acciones:

With Thisform
    .text1.Value = ALLTRIM(Tb_datos.codigo)
    .text2.Value = ALLTRIM(Tb_datos.nombre)
    .text3.Value = ALLTRIM(Tb_datos.apellido)
    .Img.PictureVal = Tb_datos.foto
EndWith

Por otro lado, cuando se produce el evento Lostfocus, el código se ejecuta de la siguiente manera:

With Thisform
    .text1.Value = ""
    .text2.Value = ""
    .text3.Value = ""
    .Img.PictureVal = 'add_img' && Una imagen predeterminada cuando el control de imagen está vacío.
EndWith

Mi pregunta es la siguiente: ¿Cómo puedo desactivar o evitar que se active el evento Lostfocus cuando el usuario hace clic en el botón "Modificar"? Esto se debe a que el botón "Modificar" contiene el mismo código que el evento Gotfocus del cuadro de lista:

Thisform.List1.Gotfocus

Esto provoca un parpadeo al cambiar la imagen en el control de imagen. En otras palabras, cuando se hace clic en un registro desde el listbox, los cuadros de texto se llenan y, al pasar a otro objeto, se dispara el evento Lostfocus, lo que borra todo. Sin embargo, en el caso del botón "Modificar," los cuadros vuelven a llenarse por unos milisegundos, lo que hace que la imagen se vea afectada negativamente, (se desaparece este ultimo, le ocupa su lugar la imagen, 'add_img',se desaparece y vuelve  el 1º imagen de nuevo)

Espero haber explicado adecuadamente la situación. Agradezco cualquier consejo, sugerencia o ayuda que puedan proporcionar.

Anticipadamente, les envío un cordial saludo.

HernanCano

unread,
Sep 9, 2023, 9:18:06 PM9/9/23
to Comunidad de Visual Foxpro en Español
Pudieras manejar lo que llamaremos un Estado. De momento pensemos en una propiedad llamada por ejm nEstado.

La primera vez que ingresa se le pone por ejm el valor 1.
Y esa segunda vez verifica si es mayor a cero, en cuyo caso no ejecuta.

Entonces el método .GotFocus de .List1 puede empezar así:
((el valor inicial y por defecto de la propiedad .nEstado es cero))

if type('ThisForm.nEstado')<>'N'
   AddProperty ( ThisForm, 'nEstado', 0 )
endif
if ThisForm.nEstado>0
   return  
endif
ThisForm.nEstado = 1

Tip
Mencionas que el método .Modificar contiene los mismos comandos que .List1.GotFocus .
Te recomiendo que cambies ambos de acuerdo a lo sgte:
1. Crea un nuevo método que contenga todo lo que actualmente tienen .Modificar y .List1.GotFocus, y llámalo por ejm .NuevoMetodo (cualq nombre, el que consideres).
2. Pónle a .Modificar lo sgte:

** Método Modificar
ThisForm.NuevoMetodo

3. Igualmente a .List1.GotFocus pónle lo sgte:

** Método .List1.GotFocus
ThisForm.NuevoMetodo

4. Listo.

De esa forma --cuando tengas que hacer ajustes a lo q se ejecuta-- sólo lo haces una sola vez.
Message has been deleted

Zarlu

unread,
Sep 10, 2023, 1:05:52 PM9/10/23
to Comunidad de Visual Foxpro en Español
Buenos días 76xademx76!

"Banderitas" les llamo. Variables que se marcan al pasar por un control/código y luego se evalúan en otra parte del programa.
Algunas veces, cuando es posible, uso el TAG de cada control para no crear más variables.

Para tu caso te propongo algo sencillo....

En el Click del botón modificar:
If !Empty(Thisform.text1.Value)&&si no está vacío limpiar
*aquí la rutina de limpieza del text y la imagen
EndIF
*Aquí lo demás de la rutina de modificar

Ahora bien. Para evitar duplicar código que uses en varias partes de la aplicación puedes crear funciones o programas. Si es en un form puedes agregarle métodos.

Suerte
zarlu
Chetumal, Quintana Roo
El domingo, 10 de septiembre de 2023 a la(s) 09:15:17 UTC-5, integral escribió:
Buenos Días

Esta técnica lo utilizo desde que programaba en Dbase III Plus. Claro que ahora en VFP 9 se crea como una Propiedad.

Aquí te muestro un ejemplo :

Addproperty(Thisform,"pCampo_Bucle",.T.)                                     && Crea una Nueva Propiedad Lógica
Thisform.pCampo_Bucle = .F.                                                            && Bloquea el ingreso a la Opción
Thisform.pCampo_Bucle = .T.                                                            && Permite el Ingreso a la Opción

Saludos,

Integral

Victor Espina

unread,
Sep 11, 2023, 8:18:29 AM9/11/23
to Comunidad de Visual Foxpro en Español
Creo que seria mejor que explicaras cual es la logica general de tu editor, porque lamentablemente cuando ocurre el evento LostFocus no hay forma de que tu sepas cual fue el objeto que se pulso y que causo que tu control actual perdierra el foco, debido al orden en que se disparan los eventos. Si el foco actual esta en el combo (Combo1) y tu pulsas en el boton Modificar (cmdModificar), la cadena de eventos sera:

Combo1.lostFocus
cmdModificar.GotFocus
cmdModificar.Click

Por lo tanto, si tu pusieras codigo en el evento click de cmdModificar para poner una bandera que diga que fue ahi donde se pulso,  no te serviria de nada porque ese codigo se va a ejecutar DESPUES que el LostFocus del Combo1 ya se haga ejecutado..

Victor Espina

adem adem

unread,
Sep 11, 2023, 5:17:37 PM9/11/23
to publice...@googlegroups.com
¡Muchas gracias a todos por sus respuestas! He estado probando todas las sugerencias que me han dado. Aunque había intentado algunas ideas similares previamente, no he obtenido resultados positivos. Mientras leía el mensaje de Victor, decidí compartir un ejemplo similar a lo que estoy haciendo actualmente. Espero que no se asusten por la forma en que lo he hecho, ya que llevo aproximadamente dos años aprendiendo. Es posible que haya algún error o que el código no esté optimizado adecuadamente.
Por otro lado, en el ejemplo que he compartido, utilizo un programa para capturar fotos. A veces, este programa no funciona correctamente y tengo que realizar una acción como "clear all" en la ventana de comandos o cerrar por completo VFP. Otras veces, simplemente tengo que intentarlo varias veces antes de que funcione correctamente. La verdad es que aún no he logrado solucionar este problema.
AQUÍ  OS DEJO EL ENLACE, PARA DESCARGAR EL EJEMPLO:

--
Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/07d26923-ba79-4000-b25f-fe0855f987b5n%40googlegroups.com.

Jose Antonio Blasco

unread,
Sep 12, 2023, 7:33:53 AM9/12/23
to publice...@googlegroups.com
Yo lo que haría sería quitar todo el código que tienes en el "LostFocus" del cuadro de lista, y lo pondría en el "Gotfocus" del botón "Añadir", pues es el único que debería provocar el vaciado.  Tanto el botón "Modificar" como "Eliminar" deberían mantener los datos en los textbox según mi parecer.

Un saludo.

Jose A. Blasco
Zaragoza - España
Visual FoxPro 9 SP2



El lun, 11 sept 2023 a las 14:18, Victor Espina (<vesp...@gmail.com>) escribió:
--

adem adem

unread,
Sep 12, 2023, 10:17:38 AM9/12/23
to publice...@googlegroups.com
Gracias Jose por la sugerencia, al aplicarla , sucede que; cuando quieres añadir un nuevo registro, se vacía todo.
Un Saludo 

Zarlu

unread,
Sep 12, 2023, 12:24:36 PM9/12/23
to Comunidad de Visual Foxpro en Español
Buenos días 76xademx76 !

Coincido con los que dice el colega José. He deshabilitado el evento lostfocus de la lista...y algunas otras modificaciones que marqué con "*zarlu"

El Form es un buen ejemplo, Pero creo que para algo personalizado deberás crear tus propios forms aplicando el parte del código de esos ejemplos.
Hay mucho por adaptar de acuerdo  las necesidades de cada aplicación y el código de los ejemplos suele complicar por los alcances que involucra.

Suerte
zarlu
Chetumal, Quintana Roo, México
form1.2scx
form1.2SCT

adem adem

unread,
Sep 12, 2023, 5:52:40 PM9/12/23
to publice...@googlegroups.com
Hola Zarlu,
Gracias por Responder, 
Es lógico lo que comentas,  solucione el caso con lo siguiente: 

*------------------------------------------------
Dejar el lostfocus de la lista deshabilitado, como lo hiciste 
*------------------------------------------------
En el gotfocus de la lista ===> 
Estadoguardar = 0
Thisform.MetodoGotFocus
 *------------------------------------------------
En el botón Modificar  ===>  EstadoGuardar = 2
*------------------------------------------------
En el gotfocus del textbox "txt_nombre" ===>
IF EstadoGuardar = 2
Else
     IF Thisform.List1.ListCount > 0
         Thisform.txt_codigo.Value   = ""
         Thisform.txt_nombre.Value   = ""
         Thisform.img.PictureVal     = ImgFoto
         Thisform.lcNombreArchivo    = ImgName
    Else
    Endif
Endif
*------------------------------------------------
En el  caso de que hay más textbox, o objetos relacionados, se crea un método con esta última parte del código ( El código que está en el gotfocus del "txt_nombre")
y se repite de la misma manera , en el gotfocus de cada objeto.
Sé que no es una manera profesional , o la adecuada para programar, pero en mi caso me sirve.

Espero no ser molesto, mi otra consulta es acerca de la captura de fotos. ¿Alguien puede sugerir algo? Permíteme explicar de nuevo: En el ejemplo que he compartido, estoy utilizando un programa que encontré en este foro para capturar fotos. lo he enlazado con el formulario que tengo. A veces, este programa no funciona correctamente y tengo que realizar una acción como "clear all" en la ventana de comandos o cerrar por completo VFP. En otras ocasiones, simplemente debo intentarlo varias veces antes de que funcione correctamente. Agradezco de antemano su amabilidad. ¡Un cordial saludo a todos!

Zarlu

unread,
Sep 13, 2023, 10:27:26 AM9/13/23
to Comunidad de Visual Foxpro en Español
Buenos días 76xademx76!

Te dejo algo de la comunidad, pero te sugiero abrir un nuevo hilo con ese tema. Seguramente algunos colegas te apoyaran.


Suerte
zarlu
Chetumal, Quintana Roo, México

adem adem

unread,
Sep 14, 2023, 6:46:52 AM9/14/23
to publice...@googlegroups.com
Hola Zarlu, gracias, estoy en ello, si no lo resuelvo o encontro otra alternativa, pregontre. Agradezco tu apoyo y lo del grupo.. Un cordial Saludo.. 

Reply all
Reply to author
Forward
0 new messages