Como regresar al Campo donde tengo el Focus ??

310 views
Skip to first unread message

Luis Salazar

unread,
Feb 27, 2017, 8:00:27 PM2/27/17
to publice...@googlegroups.com
Saludos a los amigos Foxeros, tengo esta situacion que no consigo resolver
les anexo una imagen de la pantalla de ejemplo la cual pueden visualizar 
Es decir, tengo varios campos de datos y necesito que si estoy ubicado en el campo dedicacion o el focus cae en el campo Dedicacion y  hago Click 
en el boton Accion_1   se ejecuta un proceso X  quisiera que despues de 
ejecutar el proceso  volver  al campo Dedicacion 

Asi  si estoy en cualquier campo y hago ClicK  en el boton de Accion_1 
necesito regresar al campo que tenia el Focus ..

Bueno espero haberme explicado ..

Gracias por la atencion ..

pru1.png

Carlos Hidalgo

unread,
Feb 27, 2017, 9:52:47 PM2/27/17
to publice...@googlegroups.com
cambia el guion medio por un punto
saludos
foco-zip

Luis Salazar

unread,
Feb 28, 2017, 8:42:53 AM2/28/17
to publice...@googlegroups.com
Gracias Carlos por alli andaba la idea , pero  hice esto 

1) Defini una propiedad  lname_campo 
2) En el Gotfocus cada  campo le  puse   Thisform.lname_campo = This.name 
3) En el metodo CLICK  del boton  le puse lo siguiente 
    campo = "."+Thisform.lname_campo+".setfocus"
   WAIT WINDOW campo
   *--
   Thisform&campo
    
De esa forma me quito el Do case  ,  lo que pasa en mi caso hay  como unos 30 campos en la forma 
Igual   lo que enviaste  funciona  gracias  por tu tiempo ... 

Alli les dejo a los amigos otra  solucion ..  Es con macro sustitucion me funciona si hay otra solucion Bienvenida

Gracias 

Jose Antonio Blasco

unread,
Feb 28, 2017, 8:49:24 AM2/28/17
to Comunidad de Visual Foxpro en Español
Has probado si te sirve:

PROGRAM(PROGRAM(-1)-1)  al principio del codigo de "Accion_1"

Un saludo.

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

Jose Antonio Blasco

unread,
Feb 28, 2017, 8:50:29 AM2/28/17
to Comunidad de Visual Foxpro en Español
Perdón, se me fue el dedo.
Esa instruccion deberia devolverte el nombre del objeto o metodo desde que se llamó,

Saludos.


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


Carlos Hidalgo

unread,
Feb 28, 2017, 8:57:51 AM2/28/17
to publice...@googlegroups.com
Que bien.
Es lo bonito de Fox.. varias soluciones para un problema..
Y como decía Edison: Hay una forma de hacerlo mejor, encuéntrala

Fidel Charny

unread,
Feb 28, 2017, 9:16:50 AM2/28/17
to Comunidad de Visual Foxpro en Español
Facilmente evitas la macrosutitución:

En el Gotfocus cada  campo:
Thisform.lname_campo = This

En el metodo CLICK  del boton:
IF VARTYPE(thisform.Iname_Campo) ="O"
         thisform.Iname_Campo.SetFocus()
ENDIF

Fidel Charny

unread,
Feb 28, 2017, 9:26:43 AM2/28/17
to Comunidad de Visual Foxpro en Español
José
En realidad no estás llamando al Click del botón desde el cuadro de texto, sino desde una acción del usuario (click sobre el botón).
Lo que propones podría ocurrir solamente si en algún evento del cuadro le pusiereas TalBoton.Cick()

Luis Salazar

unread,
Feb 28, 2017, 9:39:49 AM2/28/17
to publice...@googlegroups.com
Si  Jose Antonio esa no me funciona ..  Gracias 

Luis Salazar

unread,
Feb 28, 2017, 9:54:01 AM2/28/17
to publice...@googlegroups.com
Saludos Fidel  de esa forma  NO me funciona 
1ro  Vartype  de  lname_campo  es typo Caracter no es un objeto 
y al referirme  a  Thisform,lname_campo.setfocus()

lname_campo es una propiedad  no un objeto donde redirigir el focus ..
por eso utilizo la MacroSustitucion 

Gracias analizalo a ver 

Jose Antonio Blasco

unread,
Feb 28, 2017, 10:02:48 AM2/28/17
to Comunidad de Visual Foxpro en Español
Gracias por la aclaración Fidel.

Saludos.


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


Fidel Charny

unread,
Mar 1, 2017, 6:28:47 AM3/1/17
to Comunidad de Visual Foxpro en Español
Una propiedad no es un objeto pero si  puede ser una referencia de objeto si escribes en el gotfocus (u otro evento) de un objeto algo como:
Addproperty(thisform,"Propiedad",null)
Thisform.Propiedad = This
También lo puedes escribir en un método o evento del form:
This.Propiedad = This.Text1
Fijate que en este caso, se le asigna a la propiedad la referencia de objeto.
Por ese motivo, sabiendo que el objeto tiene el método setfocus, puedo perfectamente hacer
Thisform.Propiedad.SetFocus()

Y también por eso es que hago la comprobación de si la propiedad es una referencia de objeto, a lo que le puedo agregar una consulta sobre si tiene el método SetFocus.
IF VARTYPE(thisform.Propiedad) = "O" AND PEMSTATUS(Thisform.Propiedad,"SetFocus",5)
           Thisform.Propiedad.SetFocus()
ENDIF
Originalmente no hice la comprobación de la existencia del método SetFocus porque ya se que lo tiene, desde que la referencia de objeto es a un textbox.
Pero si podría haber comprobado si estaba .Enabled:
IF VARTYPE(thisform.Propiedad)="O" AND THISFORM.PROPIEDAD.ENABLED
           Thisform.Propiedad.SetFocus()
ENDIF
La idea de comprobar si la referencia de objeto todavía existe responde a dos motivos:
a) Puede que haya quitado del form el objeto al que hago referencia
b) Puede que en alguna parte, haya hecho lo siguiente:
Thisform.Propiedad = null

Bueno, ni siquiera te tomaste la molestia de averiguar si aprendías algo nuevo, que en este caso es básico para la POO.

Mario López

unread,
Mar 1, 2017, 2:30:11 PM3/1/17
to Comunidad de Visual Foxpro en Español

@likiliki: a ver si entendí bien, al hacer click en el botón “Accion 1” se ejecuta un proceso y después tiene que volver al control que tenía el foco? Si es así podés hacer uso del hecho de que en e When de un control (el botón en este caso) todavía no se actualizó ThisForm.ActiveControl, así que referencia al control que tenía el foco con anterioridad.

Esto se usaría así:

WITH NEWOBJECT("xForm")
    .Show(1)
ENDWITH

RETURN 

DEFINE CLASS xForm AS Form
    ADD OBJECT txt01    AS TextBox WITH Left = 10, Top = 10, Value = "uno"
    ADD OBJECT txtDedic AS TextBox WITH Left = 10, Top = 30, Value = "Dedicación"
    ADD OBJECT txt03    AS TextBox WITH Left = 10, Top = 50, Value = "tres"
    ADD OBJECT txt04    AS TextBox WITH Left = 10, Top = 70, Value = "cuatro"

    ADD OBJECT cmdAccion1 AS CommandButton WITH Left = 10, Top = 100, Caption = "Accion 1", AutoSize = .T.
    ADD OBJECT cmdAccion2 AS CommandButton WITH Left = 100, Top = 100, Caption = "Accion 2", AutoSize = .T.


    PROCEDURE cmdAccion1.When
    This.AddProperty("LastActiveControl", ThisForm.ActiveControl)
    ENDPROC 


    PROCEDURE cmdAccion1.Click

    MESSAGEBOX("Proceso ejecutado", 0, "Texto")
    This.LastActiveControl.SetFocus()

    ENDPROC 
ENDDEFINE 

***

HTH
Mario


Reply all
Reply to author
Forward
0 new messages