Como controlar que no se salten los Gets con el Mouse

User avatar
lubin
Posts: 404
Joined: Fri Dec 09, 2005 12:41 am
Location: Lima, Peru
Contact:

Como controlar que no se salten los Gets con el Mouse

Post by lubin »

Buen dia con todos

De vuelta por aqui, para ver como controlar este caso :

Recordaran que en Clipper, cuando uno tenia varios GETS, en Usuario para llegar al Ultimo debia de presionar ENTER en cada campo hasta llegar al Ultimo Get, (era un ingreso SECUENCIAL).

Imaginando que tenemos 10 Gets, con el windows y el Uso del Mouse el Usuario puede estar en el Tercer GET y con el Mouse hacer un click en el Ultimo (EL GET) y saltarse del resto, y dejando sin informacion , o teniendo que validar al final si el Usuario ingreso todos los datos.

Hay una forma de Evitar que se salten _ con el mouse y obligar al Usuario pase por todos _ GET en forma SECUANCIAL ??? ,,

" QUIZAS PREGUNTAR SI EL CAMPO DONDE ESTOY HACIENDO CLICK ES EL SIGUIENTE CAMPO QUE ME TOCA REGISTRAR ??? " es posible esto ,, ??

Gracias por su ayuda por adelantado

Lubin
VitalJavier
Posts: 188
Joined: Mon Jun 10, 2013 6:40 pm

Re: Como controlar que no se salten los Gets con el Mouse

Post by VitalJavier »

Podrías ocultar el mouse en ese dialogo, y usar puro teclado

ShowCursor(.F.)


Saludos.
User avatar
lubin
Posts: 404
Joined: Fri Dec 09, 2005 12:41 am
Location: Lima, Peru
Contact:

Re: Como controlar que no se salten los Gets con el Mouse

Post by lubin »

Javier

Podria ser un metodo, pero en en dialogo tambien tengo un listbox para opciones , o por ahi algunos botones que deben activarse para terminar el dialogo, se que los que podria enlazar con un hipervinculo ("A&ceppatar" ) para que lollamen por teclado ,,,
Pero me di cuenta que la flecha del mouse se apaga efectivamente,, pero si tengo en ese dialogo botones, y por casualidad paso la "flecha del mouse invisible" el boton "se prende el focus" y aun mas puedo darle click!!.. es decir el usuario se salto los Get que debia digitar !!!

Gracias Javier,, es una alternativa ,,, seguieremos buscando alguna alternativa que asegure al 100% todo el dialogo.

Pienso :... Los Get, Botones,, y otros objetos dentro de un dialogo tienen un orden o secuencia de uso, hay alguna funcion de dialogo que indique en que Nro de Objeto estoy y cuantos objetos hay en el dialogo ???


saludos

Lubin
VitalJavier
Posts: 188
Joined: Mon Jun 10, 2013 6:40 pm

Re: Como controlar que no se salten los Gets con el Mouse

Post by VitalJavier »

Otra opción.

Podrías hacer que todos tus GET se validen y que salten al siguiente objeto,
asi cuando te sales del primero con el mouse automáticamente te regrese al segundo get

Saludos.
User avatar
lubin
Posts: 404
Joined: Fri Dec 09, 2005 12:41 am
Location: Lima, Peru
Contact:

Re: Como controlar que no se salten los Gets con el Mouse

Post by lubin »

Javier,

Quizas me darias una mano como hacer ello en este ejemplo de dialogo ??:

DEFINE DIALOG oDlg RESOURCE "JKRGCM10_S2" TITLE "{ "+ PROCNAME()+" } "
REDEFINE GET oWTOT_HB VAR WTOT_HB PICTURE "99999999.99" ID 952 OF oDlg
REDEFINE GET oWSAL_DB VAR WSAL_DB PICTURE "99999999.99" ID 953 OF oDlg
REDEFINE GET oWSAL_HB VAR WSAL_HB PICTURE "99999999.99" ID 954 OF oDlg
REDEFINE LISTBOX oLb1 FIELDS LeeCampo(oWDetTabla,"nl_v2") ,;
LeeCampo(oWDetTabla,"cdct_v2") ,;
LeeCampo(oWDetTabla,"debe_v2") ,;
LeeCampo(oWDetTabla,"haber_v2") ,;
LeeCampo(oWDetTabla,"fgmy_v2") ;
HEADERS "NL", "Cta","Debe","Haber","St.My" ;
FIELDSIZES 20 , 50, 55 ,130 , 20 ;
UPDATE ;
ID 119 OF oDlg
mysetBrowse(oLb1,oWDetTabla)
REDEFINE GET oWMIO_HB VAR WMIO_HB PICTURE "99999999.99" ID 960 WHEN .F. OF oDlg
ACTIVATE DIALOG oDlg

Gracias
VitalJavier
Posts: 188
Joined: Mon Jun 10, 2013 6:40 pm

Re: Como controlar que no se salten los Gets con el Mouse

Post by VitalJavier »

Que tal, buen dia

yo lo haría asi :

por cada get :

Code: Select all

oWTOT_HB:bLostFocus  := {|| Salta_Siguiente(oWTOT_HB,oWSAL_DB) }


FUNCTION Salta_Siguiente(oIni,oFin)
    oIni:oJump := oFin
    oFin:SetFocus()
RETURN .T.

 
ya lo probe y funciona bien, le doy click con el mouse (saliéndome del get) y me retorna al que yo le indique
que regresara.


Saludos.
User avatar
Sistem
Posts: 224
Joined: Sun May 13, 2012 7:52 am

Re: Como controlar que no se salten los Gets con el Mouse

Post by Sistem »

otra opción..si utiliza el mouse

Code: Select all

 DEFINE DIALOG oDlg FROM 4, 4 TO 40, 60 TITLE "test"
   ....
   ..
  
   @ 1, 10 GET oNom_Clie VAR cNom_Clie PICTURE "@!" VALID !Empty(cNom_Clie) OF odlg SIZE 10, 10 FONT oFont
   @ 5, 10 GET oFan_Clie VAR cFan_Clie PICTURE "@!" VALID !Empty(cFan_Clie) OF odlg SIZE 10, 10 FONT oFont
  

  @ 10, 10 BUTTON "save" PIXEL OF oDlg SIZE 30, 10 ACTION (lSave := NotEmpty(oNom_Clie, oFan_Clie),  If(lSave, oDlg:End(), nil) )

Function NotEmpty(oNom_Clie, oFan_Clie)

 If Empty(cNom_Clie)
    MsgInfo("cNom_Clie empty")
    oNom_Clie:SetFocus()
    oNom_Clie:Refresh()
    Return .f.
 Endif

 If Empty(cFan_Clie)
    MsgInfo("cFan_Clie empty")
    oFan_Clie:SetFocus()
    oFan_Clie:Refresh()
    Return .f.
 Endif
Return .t.
 
FWH2008 | xHarbour | BCC74 | SQLRDD
User avatar
lubin
Posts: 404
Joined: Fri Dec 09, 2005 12:41 am
Location: Lima, Peru
Contact:

Re: Como controlar que no se salten los Gets con el Mouse

Post by lubin »

Amigos,
tengo dos buenas alternativas bastantes manejables
Vere su aplicacion, y se los comentare

muchas cabezas, piensan mejor que una!!!
Gracias
Lubin
RSalazarU
Posts: 177
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia
Contact:

Un consejo

Post by RSalazarU »

Lubin:

Y si cambia el chip de programacion.

Lo que estas queriendo hacer te va a traer muchos dolores de cabeza (que por supuesto yo tambien los tube)

Te aconsejo que mejor utilices un validador (clausula VALID) al momento de salir del dialogo.

En el validador puedes colocar todos los controles necesarios para controlar la integridad en la captura de datos.

A continuacion te pongo un ejemplo muy basico (construido al vuelo)

Code: Select all

//----------------------------//
Function CapturaDatos()
local oDlg, lOk := .F.

   DEFINE DIALOG oDlg RESOURCE "JKRGCM10_S2" TITLE "{ "+ PROCNAME()+" } "
   :
   REDEFINE BUTTON ID 10 MESSAGE "CANCEL"  ACTION (lOk:=.F.,oDlg:End())
   REDEFINE BUTTON ID 20 MESSAGE "OK"  ACTION (lOk:=.T.,oDlg:End())

   ACTIVATE DIALOG oDlg VALID (!lOk .Or. Validador(cGet1,cGet2,nGet3))

IF lOk
   //Procesar datos
endif

Return NIL

//----------------------------//
Function Validador(cGet1,cGet2,nGet3)
   If Emty(cGet1).OR.Emty(cGet2).OR.Emty(cGet3)
      MsgStop("Datos no validos")
      Return .F.
   endif
Rerturn .T.
 
Atentamente,

Rolando
Cochabamba, Bolivia
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Un consejo

Post by FranciscoA »

RSalazarU wrote:Lubin:
Te aconsejo que mejor utilices un validador (clausula VALID) al momento de salir del dialogo.
En el validador puedes colocar todos los controles necesarios para controlar la integridad en la captura de datos.
+1
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
joseluisysturiz
Posts: 2024
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela
Contact:

Re: Como controlar que no se salten los Gets con el Mouse

Post by joseluisysturiz »

No se si ya resolvistes, pero hago algo parecido, pero en cada GET usa en VALID una funcion novacio() para que no salga si no llena nada y en los siguientes GET hago un WHEN que solo se active si el anterior GET tiene datos, un ejemplo rapido, saludos, gracias... :shock:

Code: Select all

// PRIMER GET
redefine GET aGet[1] VAR aVar[1] ID nId of oWd ;
VALID novacio()

// SIGUIENTES GETs
redefine GET aGet[2] VAR aVar[2] ID nId of oWd ;
VALID novacio() ;
WHEN !Empty( aVar[2] )

// y asi sucesivamente, asi obligas al usuario a llenar si porque si cada GET y en ORDEN si todos _ son OBLIGATORIOS...aunque lo mejor es como dicen algunos colegas, hacer una sola VALIDACION cuando se vayan guardar datos...
 
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
lubin
Posts: 404
Joined: Fri Dec 09, 2005 12:41 am
Location: Lima, Peru
Contact:

Re: Como controlar que no se salten los Gets con el Mouse

Post by lubin »

Mis Estimados

Como bien dicen, si pongo un Valid que verifica y controla que esta lleno, pero ante un campo (por ejemplo .. "la direccion del cliente" ),,, el campo no esta vacio .. pasaria.. pero el usuario en vez de presionar el Enter , agarra el mouse y hace click en otro campo (sea get, checkbox, listbox u otro objeto ) saltandose de llenar el resto de campos.. bien dice nuestro amigo Rolando,,, "un dolor de cabeza..." , Asi que creo que realizare un Mix de todos sus consejos:

1. Acentuar las Validaciones x Get y buscar que salte al siguiente objeto.
2. Validacion final antes de salir del Dialogo

Muchas Gracias
Saludos
Lubin
RSalazarU
Posts: 177
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia
Contact:

Re: Como controlar que no se salten los Gets con el Mouse

Post by RSalazarU »

Lubin:

Sin animo de crear polemica, te aconsejo NO colocar VALIDADORES en los Gets y ningun otro control de captura de datos.

Cuando colocas un validador a un GET, NO puedes salir de el mientras no se cumpla la condicion, lo cual te impide presionar en el boton CANCEL o CLOSE del dialogo, la unica forma de salir del dialogo es presionando la tecla ESC.
Aveces se da el caso de que tienes que anular la tecla ESC; si de da el caso no podras cerrar el DIALOGO a menos que se cumpla la condicion.
Esto me ocurrio, sobre todo, cuando hacia: VALID !Empty(cDato)

Mas aun, te consejaria que le des mayor enfasis al VALIDADOR del Dialogo.
Yo lo tengo organizado asi:

1. Validar campos NULOS/VACIOS
Si hay uno o mas vacios, mostrar 1 solo mensaje de error indicando cuales estan vacios.

MsgStop("DATO1"+CRLF+"DATO2"+CRLF+"DATO3","DATOS VACIOS")

2. Validar la existencia de los datos en las tablas.
Si alguno de los datos (uno o mas) debe estar en alguna tabla relacionada (CODIGO/ID), verificar que exista.
Si uno o mas no estan bien ingresados, mostrar 1 solo mensaje de error indicando cuales.

MsgStop("DATO1"+CRLF+"DATO2"+CRLF+"DATO3","DATOS MAL INGREADO O NO EXISTE")

3. Validar la relacion/dependencia entre datos.

Si alguna condicion no se cumple, mostrar mensaje error, estos mensajes normamente son individuales.

Si colocas 1 mensaje de error por cada dato, no sera muy agradable para el usuario.

Yo tengo esto como una plantilla y voy copiando y pegando


Espero haberte ayudado.

Atentamente,
Rolando
Marcelo Via Giglio
Posts: 1033
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Como controlar que no se salten los Gets con el Mouse

Post by Marcelo Via Giglio »

Estimado Rolando,

que gusto saber de ti, como andas espero algún día podamos tomar un cafe.

Sobre el tema de validación, como dice Rolando es menos dolor de cabeza hacerlo en bloque, pero puedes validar algún tipo de dato como por ejemplo un código para no introducir uno repetido, y colocas la clausa CANCEL en el BUTTON (de cancelar o salir) o si no esta disponible utilizar oBtn:lCancel := .T. eso te permite no trancarte en una validacion de un GET.

Yo utilizo un validador basico

Code: Select all

//------------------------------------------------------------------------------
FUNCTION validador ( oDbf, aParam )
//  aParam { bloque de verificación, Campo de la tabla, mensaje }
//------------------------------------------------------------------------------
   LOCAL i

   FOR i := 1 TO LEN( aParam )
      IF VALTYPE( aParam[i,1] ) = "B"
         IF ! EVAL( aParam[i,1], oDbf )
            RETURN .F.
         ENDIF
      ELSE
        IF EVAL( aParam[i,2], oDbf:fieldGet( oDbf:FIELDPOS( aParam[i,1] ) ), oDbf:RECNO(), oDbf )
           MSGALERT( aParam[i,3] )
           RETURN .F.
        ENDIF
      ENDIF
   NEXT

   RETURN .T.
 
y lo defines

Code: Select all

::aValids := {{ "almacen",     {|c| EMPTY(c) }, "Se debe definir un almacen"        },;
                 { "item",        {|c| EMPTY(c) }, "Se debe definir un código de item" },;
                 { IF( job $ "NEW,DUPLI", {| oDbf | valid_item( oDbf ) }, {|| .T. } )  },;
                 { "descripcion", {|c| EMPTY(c) }, "Se debe definir una descripción"   },;
                 { "aplicacion",  {|c| EMPTY(c) }, "Se debe definir la aplicación"     };
                 }
 
y lo llamas antes de cualquier operación, funciona en base a la clase tDataBase para _ de validación

Code: Select all

validador( ::oDbf, ::aValids )
 
Son solo ideas pero espero ayuden

Saludos

Marcelo
ACC69
Posts: 619
Joined: Tue Dec 12, 2006 7:34 pm
Contact:

Re: Como controlar que no se salten los Gets con el Mouse

Post by ACC69 »

Marcelo Via Giglio wrote:Estimado Rolando,

que gusto saber de ti, como andas espero algún día podamos tomar un cafe.

Sobre el tema de validación, como dice Rolando es menos dolor de cabeza hacerlo en bloque, pero puedes validar algún tipo de dato como por ejemplo un código para no introducir uno repetido, y colocas la clausa CANCEL en el BUTTON (de cancelar o salir) o si no esta disponible utilizar oBtn:lCancel := .T. eso te permite no trancarte en una validacion de un GET.

Yo utilizo un validador basico

Code: Select all

//------------------------------------------------------------------------------
FUNCTION validador ( oDbf, aParam )
//  aParam { bloque de verificación, Campo de la tabla, mensaje }
//------------------------------------------------------------------------------
   LOCAL i

   FOR i := 1 TO LEN( aParam )
      IF VALTYPE( aParam[i,1] ) = "B"
         IF ! EVAL( aParam[i,1], oDbf )
            RETURN .F.
         ENDIF
      ELSE
        IF EVAL( aParam[i,2], oDbf:fieldGet( oDbf:FIELDPOS( aParam[i,1] ) ), oDbf:RECNO(), oDbf )
           MSGALERT( aParam[i,3] )
           RETURN .F.
        ENDIF
      ENDIF
   NEXT

   RETURN .T.
 
y lo defines

Code: Select all

::aValids := {{ "almacen",     {|c| EMPTY(c) }, "Se debe definir un almacen"        },;
                 { "item",        {|c| EMPTY(c) }, "Se debe definir un código de item" },;
                 { IF( job $ "NEW,DUPLI", {| oDbf | valid_item( oDbf ) }, {|| .T. } )  },;
                 { "descripcion", {|c| EMPTY(c) }, "Se debe definir una descripción"   },;
                 { "aplicacion",  {|c| EMPTY(c) }, "Se debe definir la aplicación"     };
                 }
 
y lo llamas antes de cualquier operación, funciona en base a la clase tDataBase para _ de validación

Code: Select all

validador( ::oDbf, ::aValids )
 
Son solo ideas pero espero ayuden

Saludos

Marcelo

Hola buenos dias de antemano les envio cordial saludos.

Aqui pongo mi forma de validar mis gets antes de grabar el registro,segun sea la condicion ...

Code: Select all

REDEFINE GET oG_IVA[03] VAR nIVA_1   ID 103 OF oDlgIVA PICT "99,999,999.99" VALID V_IVA(1)

//------------------------------------------------------------------------------
STATIC FUNCTION V_IVA(nOp)  // Function para validar el get
 //Esta parte de aqui te permite regresar al get anterior en caso que tecleaste mal el dato\\
 IF !GetKeyState( VK_RETURN ) .and. !GetKeyState( VK_DOWN ) .and. !GetKeyState( VK_TAB )
     RETURN( .T. )
 ENDIF

 DO CASE
    CASE noP = 1 .AND. nIVA_1 <> 0 .AND. !nImpBs1 <> 0 .AND. !nTasa1 <> 0
          MsgAlert('Error: No puede capturar importe IVA,si base y tasa IVA,se encuentra vacío',"Confirma")

          RETURN .F.
    CASE noP = 2 .AND. nIVA_2 <> 0 .AND. !nImpBs2 <> 0 .AND. !nTasa2 <> 0
          MsgAlert('Error: No puede capturar importe IVA,si base y tasa IVA,se encuentra vacío',"Confirma")

          RETURN .F.
 ENDCASE
RETURN (.T.)


//------------------------------------------------------------------------------
STATIC FUNCTION Reg_Cap()
 Local nNumMov,cCtaSN

 oG_D[06]:SetColor()
 oG_D[06]:Refresh()
 oG_D[07]:SetColor()
 oG_D[07]:Refresh()

 cCtaSN := SUBS(cCta,1,4) + SUBS(cCta,6,4) + SUBS(cCta,11,4) + SUBS(cCta,16,4)
 cCta2  := FORMATO1("cCta",cCta, .F.) // No Permite separar guiones


//Aqui antes de registrar el dato al dbf...te valida cada campo si esta vacio o no...\\
// Aqui te valida cada get despues del boton de agregar nuevo registro...yo creo que es lo mas fiable y seguro...
 DO CASE
    CASE !(S09)->( DbSeek(STR(nSegNg,4)) ) .AND. lAP_SN
           MsgInfo("Error: No existe Segmento de Negocio","Confirme")

           oG_D[02]:SetFocus()
           oG_D[02]:Refresh()

           RETURN.F.
    CASE EMPTY(cCta)
          MsgInfo("Error: Favor de teclear subcuenta")

          oG_D[01]:SetFocus()
          oG_D[01]:Refresh()

          RETURN .F.
    CASE (S08)->( DbSeek(cCta2) )
          IF (S08)->TIPONAT = "A"
              MsgInfo("Error: La cuenta debe ser de detalle!","Confirme")

              cCta := SPACE(19)

              oG_D[01]:SetFocus()
              oG_D[01]:Refresh()

              RETURN .F.
          ENDIF
    CASE !(S08)->( DbSeek(cCta2) )
           MsgInfo("Error: La cuenta no existe!","Confirme")

           cCta := SPACE(19)

           oG_D[01]:SetFocus()
           oG_D[01]:Refresh()

           RETURN .F.
 ENDCASE

 // Aqui se añade nuevo registro en caso que todos los gets hayan cumplido la validacion ...\\

 //* Paso 1 ----- Agrega datos a S12:= Abre_Dbf(12,12) // Abre: POLZxMxA.DBF -----*\\
 IF lAdd // Agrega nuevo registro
     (S12)->( DbSeek(cID_AMMov+cTipo+STR(nNumPol,5)) )

     IF (S12)->(!FOUND())  // Si agrega nuevo resistro en la base de datos
         (S12)->(DbAppend())

         (S12)->FECALTA := DATE()
         (S12)->REGHORA := AMPM(TIME())
         (S12)->NICKUSUA:= cNombUsua
         (S12)->NOMBUSUA:= cNombre
     ENDIF

     *?"Regisro nuevo dado de alta"
     IF nCarg <> 0
         aSum[1, 2] += nCarg
         aSum[1, 3] += nAbon
         aSum[1, 4] += nImpBs1
     ENDIF

     ...Mas intrucciones
Return nil..
Y creo que es la forma correcta ,que muchas veces no siempre se podra validar en cada get, porque el usuario siempre tendra acceso usando el mouse..es mejor validar al darle click de grabar y ahi que se haga toda la validacion correcta y segura...

Saludos cordiales .

Atte: Adrian C. C.
Post Reply