Textbox y lostfocus

681 views
Skip to first unread message

Jorge Galván Pérez

unread,
Sep 18, 2015, 3:21:16 PM9/18/15
to Comunidad de Visual Foxpro en Español
Buenas Tardes.

Tengo un problemita, en mi formulario tengo un textbox y en el evento lostfocus con su código también tengo una imagen que funciona como un boton de comando que llama a otro fumulario esta echo asi por estética por eso no uso un command buttom,
el inconveniente es que si estoy en el textbox y le doy click a la imagen para que me abra el otro formulario este se abre y luego va al evento lostfocus del textbox la idea es que en el textbox al darle click a la imagen haga todo lo del evento lostfocus del textbox y luego haga lo que tengo en el evento click de la imagen.


Mucho agradecería vuestra ayuda.


Mil Gracias.
Jorge

Luis Maria Guayan

unread,
Sep 18, 2015, 3:37:57 PM9/18/15
to publice...@googlegroups.com
Por que no utilizas un CommandButton? Cual es el efecto estético que quieres lograr? Seguramente con un botón lo lograrás. Envia una imágen

Luis María Guayán
Tucumán, Argentina
_______________________________
Comunidad Visual FoxPro en Español
http://comunidadvfp.blogspot.com

Jorge Galván Pérez

unread,
Sep 18, 2015, 3:43:27 PM9/18/15
to Comunidad de Visual Foxpro en Español

Gracias Luis Maria por responder
 

Saúl Piña

unread,
Sep 18, 2015, 4:34:50 PM9/18/15
to Comunidad de Visual Foxpro en Español
Si te refieres a que las imagenes como los iconos de word que se muestran en tu imagen hagan las labores de un command, te dejo una imagen donde yo hago el efecto pero con botones y funciona perfecto..

Saludos.

Luis Maria Guayan

unread,
Sep 18, 2015, 4:38:35 PM9/18/15
to publice...@googlegroups.com

Ejecuta este ejemplo con solo cambiar dos propiedades de los botones:
SpecialEffect = 2 y PicturePosition = 14


PUBLIC poMiForm
poMiForm = NEWOBJECT("MiForm")
poMiForm.SHOW(1)
RETURN

DEFINE CLASS MiForm AS FORM

  AUTOCENTER = .T.
  CAPTION = "Ejemplo Botones"
  NAME = "MiForm"

  ADD OBJECT MiBoton1 AS MiBoton WITH ;
    TOP = 12, LEFT = 12, ;
    PICTURE = HOME(1) + "gallery\graphics\Picture.ico", ;
    NAME = "MiBoton1"

  ADD OBJECT MiBoton2 AS MiBoton WITH ;
    TOP = 12, LEFT = 48, ;
    PICTURE = HOME(1) + "gallery\graphics\Tools.ico", ;
    NAME = "MiBoton2"

  ADD OBJECT MiBoton3 AS MiBoton WITH ;
    TOP = 12, LEFT = 84, ;
    PICTURE = HOME(1) + "gallery\graphics\Catalog.ico", ;
    NAME = "MiBoton3"

  ADD OBJECT MiBoton4 AS MiBoton WITH ;
    TOP = 12, LEFT = 120, ;
    PICTURE = HOME(1) + "gallery\graphics\Label.ico", ;
    NAME = "MiBoton4"

  ADD OBJECT MiBoton5 AS MiBoton WITH ;
    TOP = 12, LEFT = 156, ;
    PICTURE = HOME(1) + "gallery\graphics\Word.ico", ;
    NAME = "MiBoton5"

  ADD OBJECT MiBoton6 AS MiBoton WITH ;
    TOP = 12, LEFT = 192, ;
    PICTURE = HOME(1) + "gallery\graphics\Excel.ico", ;
    NAME = "MiBoton6"

  ADD OBJECT MiBoton7 AS MiBoton WITH ;
    TOP = 12, LEFT = 228, ;
    PICTURE = HOME(1) + "gallery\graphics\Outlook.ico", ;
    NAME = "MiBoton7"

ENDDEFINE

DEFINE CLASS MiBoton AS COMMANDBUTTON
  HEIGHT = 36
  WIDTH = 36
  SPECIALEFFECT = 2
  PICTUREPOSITION = 14
  PROCEDURE CLICK
    MESSAGEBOX("Click en " + THIS.NAME, 64, 1500)
  ENDPROC
ENDDEFINE

Luis María Guayán
Tucumán, Argentina
_______________________________
Comunidad Visual FoxPro en Español
http://comunidadvfp.blogspot.com

Jorge Galván Pérez

unread,
Sep 18, 2015, 4:54:59 PM9/18/15
to Comunidad de Visual Foxpro en Español
Provee creando un command buttom y me hace lo mismo.


En el lostfocus del textbox tengo un thisform.grilla.setfocus entonces cuando le doy click al botón de comando o a la imagen me abre el formulario luego hace el lostfocus y como consecuencia el ultimo formulario abierto se queda atrás. Si en el textbox en vez de dar click a la imagen o al botón entonces si funciona perfecto hace el evento lostfocus del textbox y luego el evento click del botón de comando.

No se si me explique bien.


Carlos Miguel FARIAS

unread,
Sep 18, 2015, 5:05:30 PM9/18/15
to Grupo Fox
Que es Abir con plantilla?

Jorge Galván Pérez

unread,
Sep 18, 2015, 5:31:59 PM9/18/15
to Comunidad de Visual Foxpro en Español

El informe esta hecho en Word, y cuando habilitan la opción plantilla primero abre el documento en Word lo copia luego abre un documento nuevo según una plantilla hecha en Word y pega el informe, la plantilla tiene el membrete de la empresa en el header y en el footer esta la dirección.


Fernando D. Bozzo

unread,
Sep 21, 2015, 4:08:46 AM9/21/15
to Comunidad de Visual Foxpro en Español
Hola Jorge:

Creo que te convendría conocer y entender primero qué eventos se lanzan, en qué orden y cuándo, ya que no vas a poder obligar a un evento a lanzarse de cualquier forma o en cualquier order, que es un poco lo que estás queriendo hacer. En vez de eso es mejor si, sabiendo el orden de ejecución de los mismos, adaptás tu código para que los utilice.

Si ponés código en LostFocus, es porque querés que se ejecute ese código cuando el control pierde el foco, lo cuál ocurre luego del Valid.


Saludos.-

Jorge Galván Pérez

unread,
Sep 21, 2015, 10:09:06 AM9/21/15
to Comunidad de Visual Foxpro en Español
Hola Fernando

Si eso lo entiendo el inconveniente que tengo es que si tengo un textbox y en este en el lostfocus hago un un setfocus.xxx y luego le doy un click a una imagen o un command box y este en el evento click llama a un formulario, el resultado es que me abre el formulario y luego hace el evento lostfocus del texbox, En cambio estando en el textbox y le doy enter en vez de click con el mouse si hacer lo que quiero que es hacer el evento lostfocus del textbox y luego darle click al command box y abra el formulario.

Y si en el lostfocus le quito el setfocus.xxx y le doy click al command box también hace lo que quiero que haga el evento lostfocus y luego click en el command box y abra el formulario. lo que veo es que un setfocus.xxx en el evento lostfocus me cambia la secuencia de los eventos.

Fernando D. Bozzo

unread,
Sep 21, 2015, 10:58:56 AM9/21/15
to publice...@googlegroups.com
Como ves, usar setfocus en el lostfocus puede causar problemas. Para que el siguiente control sea uno en particular tenés otras formas de pasarle el foco:

1) Predefiniendo el recorrido de los controles con el menú View/TabOrder (es la mejor forma en general)

2) Usando RETURN nValor en el Valid

Y si ninguna de estas formas te sirve, entonces va a ser necesario que expliques el por qué de todo ese peregrinaje por el código, que si no va a ser muy difícil dar otras soluciones sin entender el objetivo funcional, que no tiene que ver con el objetivo técnico.

Saludos.-

Jorge Galván Pérez

unread,
Sep 21, 2015, 1:19:03 PM9/21/15
to Comunidad de Visual Foxpro en Español

Ok Fernando te explico lo que quiero hacer.

En la parte de abajo del form tengo 3 textbox aue buscan según la fecha, cedula o nombre, cuando entras en cualquier textbox el grip se ordena según el textbox (por fecha, por cedula o por el nombre) si el usuario le da enter quiero que el setfocus valla al grid en cual quiera de los 3 textbox ahora si uso el setfocus.grid en el evento lostfocus si el usuario le da click con el mouse a cualquier comandobox de arriba abre un formulario y luego es que hace el evento lostfocus del textbox.

Ahora preguntaras por que quiero que el foco de valla al grid por que quiero que si no es la persona que buaca con las flechas suba y baje y también si busco por fecha al dar enter este salta campo de cedula cambiando automáticamente el orden.

No se si me pude explicar.


Gracias



Jean Pierre Adonis De La Cruz Garcia

unread,
Sep 21, 2015, 1:26:44 PM9/21/15
to Comunidad de Visual Foxpro en Español
Mas claro no pudo ser, esta muy simple, primero toma el segundo, cuando hagas clic, pasas al focus, y si no quieres le dices que no haga el clic, despues de eso, a os 3 textbox le haces clic al mouse, y si responde quizas este con vida y te vaya a morder, en caso contrario han hechado racumin y han matado a tu raton, chispas me hice bolas, espero que me haya explicado bien, jejeje
es una para el lunes, y eso que no es viernes. fue una chiquita por el primer dia de la primavera.

Jorge Galván Pérez

unread,
Sep 21, 2015, 1:44:49 PM9/21/15
to Comunidad de Visual Foxpro en Español


Disculpa Jean Pierre Adonis De La Cruz Garcia si mis preguntas o explicaciones te molestan. Mi intensión es pedir ayuda, pero bueno pido disculpas por molestar.

Gracias

Antonio Meza

unread,
Sep 21, 2015, 2:00:07 PM9/21/15
to Comunidad de Visual Foxpro en Español
Como te comenta el Maestro Fernando, tienes que aprender el uso de los eventos de los controles.

En el caso del TextBox aquí hay muchos que usan el Lostfocus para realizar las validaciones lo cual es totalmente erróneo, puesto que no fue programado para eso y por eso existe el VALID.

Muestra tu código donde ordenas el grid, abres el formulario y las otras cosas que necesitas para darte un ejemplo mas completo a lo que necesitas.

Algo sencillo es que dentro del textbox pongas un código de validación como el siguiente

Valid del textbox

If empty(alltr(this.value))
     
*Enviar al grid el focus
     
return (thisform.grid)
else
   
* Ordenar Grid
         thisform
.Ordenar_Grid()
   
* Buscar valor
   
if thisform.Valor()
     
return (thisform.grid)
   
else
       messagebox
("Valor no encontrado")
       
return 0
   endif

Nota: El código lo escribí en el correo puede tener errores de dedo jajaja

saludos
Antonio Meza

Víctor Hugo Espínola Domínguez

unread,
Sep 21, 2015, 2:16:38 PM9/21/15
to publice...@googlegroups.com
Hola Jorge

Si el problema surge al dar click en los botones lo más sencillo es deshabilitarlos en el GotFocus y volver a habilitarlos en el LostFocus.

Saludos,
Víctor.
Lambaré - Paraguay.

Jean Pierre Adonis De La Cruz Garcia

unread,
Sep 21, 2015, 2:20:24 PM9/21/15
to Comunidad de Visual Foxpro en Español
amigo Jose, el puntono es molestar, sino relajarse, recuerdo lo que decia el Profesor de la Universidad.
1. Si estas desarrollando un sistema, y no te funciona, es tiempo de llamar a un programador para que te ayude.
2. Siempre es bueno trabajar con otra persona, ya que si algo te sale mal, ya tienes a quien culpar, y no te culpen a ti.
3. Si desarrollas un sistema nunca le pongas version 1.0, eso significa que 1.0 es lo peor que uno ha creado.
Feliz Dia, animo amigo, sigue intentando y lo lograras, aca se aprende mucho y se relaja tambien uno bien, suerte.


El lunes, 21 de septiembre de 2015, 12:44:49 (UTC-5), Jorge Galván Pérez escribió:

Jorge Galván Pérez

unread,
Sep 21, 2015, 2:38:28 PM9/21/15
to Comunidad de Visual Foxpro en Español
Gracias Jean Pierre, a veces es difícil darle sentimiento a lo que escribimos aunque pongamos signos de admiración o interrogación siempre entendemos lo escrito según el animo que estemos.

Y Antonio Meza si lo hago en el valid si efectivamente se va a mi grid pero si estoy en el textbox y hago click al command botón tengo que darle otro click para que haga lo que esta en el evento click del command botón, ya que primero el foco va al grid y luego hay que darle otro click al command. botón.


Gracias a todos por ayudar. En si quitare los setfocus y listo. Tratare tomar el consejo de Fernando D.


Mil Gracias

Antonio Meza

unread,
Sep 21, 2015, 3:12:05 PM9/21/15
to Comunidad de Visual Foxpro en Español
Como te comente si publicas tu código y explicas mas a detalle es mas fácil. pero tu explicación no se entiende mucho.

No entiendo para que quieres ir al Botón, si el usuario dio click en el TextBox y ya se ordeno el grid por ese textbox, para que quieres ejecutar el Boton? para lanzar un formulario adicional? entonces para que mandar el focus al grid?

No sera que al mostrar el formulario al regresar quieres ordenar y mandar el focus al grid? no seria mas lógico?

saludos
Antonio Meza

Carlos Miguel FARIAS

unread,
Sep 21, 2015, 5:15:34 PM9/21/15
to Grupo Fox

 
Error () --> "Envuelve" todo el funcionamiento del textbox, se "dispara" ante cualquier error relacionado con el textbox
--> Init --> Al crearse el textbox, lo hace antes del init del contenedor inmediato superior
    | * When --> Para textbox enabled=true, si éste método devuelve falso, no permite "entrar" al textbox
    |     | GotFocus --> Cuando el control recibe el foco, por teclado o por ratón, o por setfocus
    |     |     | InteractiveChange --> Cada vez que se modifica el value del textbox
    |     |     | KeyPress --> Cada vez que se pulsa el teclado, en el textbox
    |     | Valid --> Al intentar salir del control, si devuelve 0 o .F., no pasa al lost focus, ** (Ver mas abajo)
    |     |     | LostFocus --> Cuando el valid devuelve un número no cero o .T. que es equivalente a que devuelva 1
    | * ProgrammaticChange --> Cuando por programa se cambia el value del textbox por una asignación textbox.value = algo
    | * UIEnable --> Cada vez que el formulario se ACTIVATE o DEACTIVATE.
<-- Destroy --> Al liberar el formulario, primero se "destroy" los elementos más internos y luego los más externos

** Si value devuelve 0, el foco queda en el textbox, y no hay mensaje de error, si devuelve .f., hay mensaje de error.
Si devuelve .T. es lo mismo que devuelva 1, un número positivo, "salta" tantos controles "enfocables" más adelante como se indica con el numero, un número negativo, salta tantos controles "enfocables" hacia atrás.
Hay funciones o propiedades que te permiten detectar el número de control (creo que tabindex)

El * delante de Error, When, etc. indica que esos eventos éstan latentes (activos), mientras el formulario exista y el textbox pueda recibir el foco. Esto funciona también para otros controles que puedan modificar su contenido (tengan propiedad value) o equivalente.

En el valid, no se puede hacer un setfocus, porque estás saliendo del textbox por la "ventana" (la lógica de ciclo de eventos de vfp, exige que de un control se salga al hacer el return de un valid, y el setfocus, lo está haciendo antes del return.

Además están todos estos otros:
Eventos Raton: Click, DblClick, DragDrop, DragOver, MiddleClick, MouseDown, MouseEnter, MouseLeave, MouseMove, MouseUp, MouseWheel, RightClick
Para compatibilidad hacia atras (No usar): ErrorMessage, Message
Drag and Drop de elementos OLE (nunca los use): OLECompleteDrag, OLEDragDrop, OLEDragOver, OLEGiveFeedBack, OLESetData, OLEStartDrag
Estos no los aplique nunca en textbox: RangeHigh, RangeLow

Para todos los controles modificables (textbox, editbox, etc.) cree una clase derivada, donde en el gotfocus guardaba el valor del control al entrar, y en el lostfocus, comparaba el valor actual con el guardado, si eran diferentes, invocaba un método del formulario (también creado de una clase base) que habilitaba por ejemplo el botón de guardar.

Espero sirva de resumen.

Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad.
Que la Fuerza los acompañe, hasta perder el focus y más allá
 
  
 
 
 
 
 
 
 


Joel Villanueva

unread,
Nov 15, 2016, 2:36:18 PM11/15/16
to Comunidad de Visual Foxpro en Español
Hola:
Muy valiosa información, yo tenía un probrema parecido "Cómo hacer set focus en un objeto (B) que no es el que sigue en el orden de tabulación al abandonar un objeto (A)"
La información que necesitaba está resumida en :
"En el valid, no se puede hacer un setfocus, porque estás saliendo del textbox por la "ventana" (la lógica de ciclo de eventos de vfp, exige que de un control se salga al hacer el return de un valid, y el setfocus, lo está haciendo antes del return".
** Si value devuelve 0, el foco queda en el textbox, y no hay mensaje de error, si devuelve .f., hay mensaje de error.
Si devuelve .T. es lo mismo que devuelva 1, un número positivo, "salta" tantos controles "enfocables" más adelante como se indica con el numero, un número negativo, salta tantos controles "enfocables" hacia atrás.
Hay funciones o propiedades que te permiten detectar el número de control (creo que tabindex) **
Gracias.
Reply all
Reply to author
Forward
0 new messages