FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Re: Loop con oGet:bGotFocus (SOLUCIONADO)
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Loop con oGet:bGotFocus (SOLUCIONADO)
Posted: Wed Dec 07, 2011 02:31 AM
Saludos a todos:

Tengo el siguiente problema:

Estoy capturando en un dialogo un pedido para un restaurant, despues de capturar el nombre del cliente, busco con un get el producto que se va a vender, este get al recibir el foco abre otro dialogo donde aparece un xbrowse con el listado de productos a buscar, depués de elegir el producto y dar enter o click en el boton salir debe regresar al get de cantidad, puesto que la búsqueda retorna automáticamente en los gets el nombre del producto seleccionado y su costo, todo esto lo hace, pero en forma infinita: se crea un loop entre el focus del get de productos y el dialogo que mustra el listado:

Aqui una imagen de lo que me refiero:




Tengo el siguiente código:

Code (fw): Select all Collapse
FUNCTION Pedido()

LOCAL oCrs,oCur,oIco,oDlg,oGet0,oGet1,oGet2,oGet3
LOCAL cProd:= SPACE(50)
LOCAL nPrec:= 0
LOCAL nCant:= 0
LOCAL cNomb:= SPACE(50)

 
     DEFINE CURSOR    oCrs  RESOURCE "ARROWV"
     DEFINE CURSOR    oCur  RESOURCE "MANO"
     DEFINE ICON      oIco  RESOURCE "11"
     DEFINE DIALOG    oDlg  RESOURCE "PEDIDO" TITLE "NUEVO pedido de Antojitos" ICON oIco
   REDEFINE GET       oGet0 VAR cNomb ID 100 OF oDlg PICTURE "@!"
   REDEFINE GET       oGet1 VAR cProd ID 101 OF oDlg PICTURE "@!"
   REDEFINE GET       oGet2 VAR nPrec ID 102 OF oDlg PICTURE "$ 9,999.99" COLOR RGB(000,000,000), RGB(238,255,228)
   REDEFINE GET       oGet3 VAR nCant ID 103 OF oDlg PICTURE "999"

    oDlg:oCursor  := oCrs
    oDlg:lHelpIcon:= .F.
   oGet1:bGotFocus:= {|| BuscaProd(oGet1,oGet2), oGet3:SetFocus()} //--> AQUI SE GENERA EL LOOP
   
   ACTIVATE DIALOG    oDlg  CENTERED

RETURN nil

//-------------------------------------------------------------------------------------//
STATIC FUNCTION BuscaProd(oGet1,oGet2)

LOCAL  cAliBus:= ""
LOCAL  lFinDlg:= .F.
LOCAL oDlg,oBtn,oBrw,oFot,oFon,oFtn


IF AbreDBF(oApp:cDirDBF+"PRODUCTOS.DBF","PRODUCTOS",.T.,.T.)
   AbreCDX(oApp:cDirDBF+"PRODUCTOS.CDX")

cSayBrow:= ""
   
SET FILTER TO !DELETED()

 cAliBus:= ALIAS()
(cAliBus)->(ORDSETFOCUS(1))
(cAliBus)->(DBGOTOP())
     
     DEFINE CURSOR    oCrs  RESOURCE "ARROWV"
     DEFINE CURSOR    oCur  RESOURCE "MANO"
     DEFINE ICON      oIco  RESOURCE "11"
     DEFINE DIALOG    oDlg  RESOURCE "INCREMENTAL" TITLE "Busqueda Dinámica de Antojitos" ICON oIco
     DEFINE FONT      oFot  NAME "Tahoma"  BOLD SIZE 00, 16 
     DEFINE FONT      oFon  NAME "Courier" BOLD SIZE 00, 22
     DEFINE FONT      oFtn  NAME "Courier" BOLD SIZE 00, 16
     
     WITH   OBJECT    oBrw:= TXBrowse():New(oDlg)
      oCol:= oBrw:AddCol()
      oCol:cHeader       := "Listado de Productos"
      oCol:nHeadStrAlign := AL_CENTER
      oCol:oHeaderFont   := oFtn
      oCol:bStrData      := { || (cAliBus)->NOMBRE}
      oCol:nDataStrAlign := AL_LEFT
      oCol:oDataFont     := oFot
      
      oCol:= oBrw:AddCol()
      oCol:cHeader       := "Costo"
      oCol:nHeadStrAlign := AL_CENTER
      oCol:oHeaderFont   := oFtn
      oCol:bStrData      := { || ALLTRIM("$ "+STR((cAliBus)->PRECIO))}
      oCol:nDataStrAlign := AL_RIGHT
      oCol:oDataFont     := oFot
      
      :lAllowRowSizing     := .F.
      :lAllowSizings       := .F.
      :nFreeze             :=  1
      :nMarqueeStyle       := MARQSTYLE_HIGHLROW
      :nColDividerStyle    := LINESTYLE_BLACK
      :nRowDividerStyle    := LINESTYLE_BLACK
      :lColDividerComplete := .T.
      :nHeaderLines        := 2
      :nStretchCol         := STRETCHCOL_LAST
      :lHScroll            := .F.  
      :bSeek               := nil  
      :bKeyChar            := {|nKey| IIF( nKey <> VK_RETURN, (EscribeBus(oBrw,nKey,cAliBus), oGet1:VarPut((cAliBus)->NOMBRE), oGet1:Refresh(), oGet2:VarPut((cAliBus)->PRECIO), oGet2:Refresh()),SysRefresh())}
      :bKeyDown            := {|nKey| IIF( nKey == VK_RETURN, ((cAliBus)->(CierraDBF()), lFinDlg:=.T., oDlg:END()), SysRefresh())}
      :bChange             := {|| oGet1:VarPut((cAliBus)->NOMBRE), oGet1:Refresh(), oGet2:VarPut((cAliBus)->PRECIO), oGet2:Refresh()}
      :CreateFromResource( 101 )
      
     END    WITH
     
   REDEFINE SAY       oSayBrow  PROMPT cSayBrow PICTURE "@!" ID 102 OF oDlg COLOR nRGB(021,066,139)
   REDEFINE BUTTONBMP oBtn      TEXTRIGHT    BITMAP "SALIR"  ID 103 OF oDlg ACTION ((cAliBus)->(CierraDBF()), lFinDlg:=.T., oDlg:END())
    
    oDlg:oCursor  := oCrs
    oDlg:lHelpIcon:= .F.
    oBtn:oFont    := oFot
    oBtn:oCursor  := oCur
    oBtn:cTooltip := Tooltip("Regresa a Pedidos.","Salir de la Búsqueda",1)
oSayBrow:oFont    := oFon
 oBrw:SetRDD()
 oBrw:nMarqueeStyle := 5
 oBrw:lFastEdit     := .T. 
        
   ACTIVATE DIALOG    oDlg  CENTERED ON INIT(oDlg:Move(400,265), oGet1:VarPut((cAliBus)->NOMBRE), oGet1:Refresh(), oGet2:VarPut((cAliBus)->PRECIO), oGet2:Refresh()) VALID (lFinDlg)

ENDIF
   
RETURN nil


Al hacer click, o recorrer con el tabulador para tener el foco sobre el get de productos se abre el dialogo automáticamente con oGet1:bGotFocus, puesto que así es como lo necesito, el problema es que al salir del dialogo del listado de productos y darle el foco al oGet3 que es el de cantidad, oGet1 se evalua de forma infinita y provoca que se genere el loop sin poder avanzar con la captura.

Como podria solucionarlo, me he pasado todo el dia y no doy con el clavo, a lo mejor es algo facil pero no encuentro solucion, ya intente con oGet:nPos pasa saber la posición del cursor y siempre me devuelve 1, he intentado cambiarlo para que solo de abra el dialogo de consulta cuando nPos sea mayor a 1 con oGet1:SetPos(len(alltrim((cAliBus)->NOMBRE))) pero ni así, ojala y alguien pueda auxiliarme... :-) :-) :-)

Gracias...
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 610
Joined: Wed Oct 19, 2005 08:20 PM
Re: Loop con oGet:bGotFocus
Posted: Wed Dec 07, 2011 08:29 AM
Hola Victor Daniel:

¿Has probado con VALID? Sería algo así:

Code (fw): Select all Collapse
   ........
   REDEFINE GET  oGet1 VAR cProd ID 101 OF oDlg PICTURE "@!"  VALID ({|| BuscaProd(oGet1,oGet2), oGet3:SetFocus()},.T.)
   .............
   // oGet1:bGotFocus:= {|| BuscaProd(oGet1,oGet2), oGet3:SetFocus()} //--> AQUI SE GENERA EL LOOP
   
   ACTIVATE DIALOG    oDlg  CENTERED
Un saludo,

Manuel



xH 1.2.3, FWH 23.07 32 bits, BC++ 7.4, xVerce CW 1.0, PellesC
Posts: 366
Joined: Wed Aug 30, 2006 05:25 PM
Re: Loop con oGet:bGotFocus
Posted: Wed Dec 07, 2011 01:54 PM

Hola Victor, creo que cambiando a Return(.t.) la funcion BuscaProd(oGet1,oGet2) queda solucionado.

STATIC FUNCTION BuscaProd(oGet1,oGet2)
...
...
Return(.T.)

Saludos

Ruben Fernandez

Gracias y Saludos

Ruben Fernandez - Uruguay

FWH 11.06, Harbour, Borland 5.82
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Loop con oGet:bGotFocus
Posted: Wed Dec 07, 2011 02:35 PM
Saludos y gracias por contestar:

Manuel: Al ponerlo como indicas y compilar marca error:
Code (fw): Select all Collapse
Z:\PRUEBAS\Vanessa\pedidos.prg(170) Warning W0027  Meaningless use of expression: 'Codeblock'


Ruben: Al finalizar con .T. la función de búsqueda compila sin problemas, pero al ejecutar y probar es el mismo resultado, en ciclo infinito...

Algúna otra opción..? :-) :-) :-) :-)
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Loop con oGet:bGotFocus
Posted: Wed Dec 07, 2011 03:17 PM
Victor:

Code (fw): Select all Collapse
oGet1:bGotFocus:= {|| BuscaProd(oGet1,oGet2), oGet3:SetFocus()} //--> AQUI SE GENERA EL LOOP


Creo que el loop se genera porque estas llendo a buscar el producto cuando el GET pierde el foco.

Te sugiero buscar una condicionante para ir a buscar el producto, por ejemplo, cuando el get este en blanco
o usar la clase BTNGET.

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Re: Loop con oGet:bGotFocus
Posted: Wed Dec 07, 2011 04:29 PM
Victor,

Comprueba a ver si te sirve:

Code (fw): Select all Collapse
oGet1:bGotFocus:= {|| oGet1:KeyDown( VK_TAB ), BuscaProd(oGet1,oGet2), oGet3:SetFocus()}

ó

Code (fw): Select all Collapse
bFocus := {|| oGet1:bGotFocus:=NIL,  BuscaProd(oGet1,oGet2), oGet3:SetFocus(), oGet1:bGotFocus:=bFocus}
oGet1:bGotFocus := bFocus
Un saludo

Fernando González Diez

ALSIS Sistemas Informáticos
Posts: 610
Joined: Wed Oct 19, 2005 08:20 PM
Re: Loop con oGet:bGotFocus
Posted: Wed Dec 07, 2011 05:55 PM

Hola de nuevo Victor:

Creo que el error puede producirse porque estás haciendo referencia a oGet2 y oGet3 que aún no están definidos. Prueba cambiando el orden de creacción de los GET:

REDEFINE GET oGet2...................
REDEFINE GET oGet3...................
REDEFINE GET oGet1...................

Un saludo,

Manuel



xH 1.2.3, FWH 23.07 32 bits, BC++ 7.4, xVerce CW 1.0, PellesC
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Loop con oGet:bGotFocus (SOLUCIONADO)
Posted: Thu Dec 08, 2011 12:29 AM
Listo ha quedado, sabía que se podia hacer sin tanto problema:

Armando: Como bien comentas mi idea inicial era condicionar la búsqueda cuando oGet1:nPos fuera 1, pero bGotFocus se evalua cada vez que el cursor parpadea en el oGet1 sin dar tiempo a actualizar nPos a la longitud de letras que se elegian en el xbrowse, y siempre devolvia 1, por eso se genera el ciclo infinito, pense usar la Clase BTNGet, pero me gusta más trabajar con clases nativas (Claro sin desprestigiar a las demás clases que son fantasticas). :-) :-) :-) :-) :-) :-)

Manuel: Si lo poco de ingles que recuerdo no me traiciona :-) al compilar indicaba que la expresión se usa sin sentido, podría ser por lo que mencionas de llamar los objetos para hacerlos referencia en una función sin antes definirlos, probe lo que me sugieres, pero el resultado al compilar era el mismo.

fgondi: Funciono de maravillas tu sugerencia: :-) :-) :-) :-)

Code (fw): Select all Collapse
oGet1:bGotFocus:= {|| oGet1:KeyDown( VK_TAB ), BuscaProd(oGet1,oGet2), oGet3:SetFocus()}


Así funciona como lo necesito :-) :-) :-) :-) haciendo click sobre el get, pasando por el get con el tabulador, y con las flechas de movimiento, al tomar el foco automaticamente se muestra el listado y permite salir sin hacer loop infinito.

Gracias a todos por tomarse un ratito de su tiempo y aportar sus sugerencias..

Saludos. :-) :-) :-) :-) :-) :-)
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Loop con oGet:bGotFocus (SOLUCIONADO)
Posted: Thu Dec 08, 2011 01:30 AM
Victor:

En primer lugar me alegra saber que lo haz solucionado, y como dice el querido maesto "solo para rizar el rizo",
tambien la clase TGET nativa de FW tiene la funcionalidad de la clase externa BTNGET, aquí un ejemplo.

Code (fw): Select all Collapse
        REDEFINE GET aGets[09] VAR oGui:CLO ID 201 OF oFld:aDialogs[1];
            BITMAP "Buscar" UPDATE;
            PICTURE "@ZK 99999";
            VALID ValCli(oDlg,oFld,aGets);
            ACTION (oGui:CLO := BrwCli(oDlg,aGets),ValCli(oDlg,oFld,aGets));
            MESSAGE "Código del cliente orígen"


Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero

Continue the discussion